参阅地址:

https://www.jianshu.com/p/ae5157c26af9

代码实现:

public class GA {

	private int ChrNum = 10;	//染色体数量
private String[] ipop = new String[ChrNum]; //一个种群中染色体总数
private int generation = 0; //染色体代号
public static final int GENE = 46; //基因数
private double bestfitness = Double.MAX_VALUE; //函数最优解
private int bestgenerations; //所有子代与父代中最好的染色体
private String beststr; //最优解的染色体的二进制码 /**
* 初始化一条染色体(用二进制字符串表示)
*/
private String initChr() {
String res = "";
for (int i = 0; i < GENE; i++) {
if (Math.random() > 0.5) {
res += "0";
} else {
res += "1";
}
}
return res;
} /**
* 初始化一个种群(10条染色体)
*/
private String[] initPop() {
String[] ipop = new String[ChrNum];
for (int i = 0; i < ChrNum; i++) {
ipop[i] = initChr();
}
return ipop;
} /**
* 将染色体转换成x,y变量的值
*/
private double[] calculatefitnessvalue(String str) { //二进制数前23位为x的二进制字符串,后23位为y的二进制字符串
int a = Integer.parseInt(str.substring(0, 23), 2);
int b = Integer.parseInt(str.substring(23, 46), 2); double x = a * (6.0 - 0) / (Math.pow(2, 23) - 1); //x的基因
double y = b * (6.0 - 0) / (Math.pow(2, 23) - 1); //y的基因 //需优化的函数
double fitness = 3 - Math.sin(2 * x) * Math.sin(2 * x)
- Math.sin(2 * y) * Math.sin(2 * y); double[] returns = { x, y, fitness };
return returns; } /**
* 轮盘选择
* 计算群体上每个个体的适应度值;
* 按由个体适应度值所决定的某个规则选择将进入下一代的个体;
*/
private void select() {
double evals[] = new double[ChrNum]; // 所有染色体适应值
double p[] = new double[ChrNum]; // 各染色体选择概率
double q[] = new double[ChrNum]; // 累计概率
double F = 0; // 累计适应值总和
for (int i = 0; i < ChrNum; i++) {
evals[i] = calculatefitnessvalue(ipop[i])[2];
if (evals[i] < bestfitness){ // 记录下种群中的最小值,即最优解
bestfitness = evals[i];
bestgenerations = generation;
beststr = ipop[i];
} F = F + evals[i]; // 所有染色体适应值总和
} for (int i = 0; i < ChrNum; i++) {
p[i] = evals[i] / F;
if (i == 0)
q[i] = p[i];
else {
q[i] = q[i - 1] + p[i];
}
}
for (int i = 0; i < ChrNum; i++) {
double r = Math.random();
if (r <= q[0]) {
ipop[i] = ipop[0];
} else {
for (int j = 1; j < ChrNum; j++) {
if (r < q[j]) {
ipop[i] = ipop[j];
}
}
}
}
} /**
* 交叉操作 交叉率为60%,平均为60%的染色体进行交叉
*/
private void cross() {
String temp1, temp2;
for (int i = 0; i < ChrNum; i++) {
if (Math.random() < 0.60) {
int pos = (int)(Math.random()*GENE)+1; //pos位点前后二进制串交叉
temp1 = ipop[i].substring(0, pos) + ipop[(i + 1) % ChrNum].substring(pos);
temp2 = ipop[(i + 1) % ChrNum].substring(0, pos) + ipop[i].substring(pos);
ipop[i] = temp1;
ipop[(i + 1) / ChrNum] = temp2;
}
}
} /**
* 基因突变操作 1%基因变异
*/
private void mutation() {
for (int i = 0; i < 4; i++) {
int num = (int) (Math.random() * GENE * ChrNum + 1);
int chromosomeNum = (int) (num / GENE) + 1; // 染色体号 int mutationNum = num - (chromosomeNum - 1) * GENE; // 基因号
if (mutationNum == 0)
mutationNum = 1;
chromosomeNum = chromosomeNum - 1;
if (chromosomeNum >= ChrNum)
chromosomeNum = 9;
String temp;
String a; //记录变异位点变异后的编码
if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') { //当变异位点为0时
a = "1";
} else {
a = "0";
}
//当变异位点在首、中段和尾时的突变情况
if (mutationNum == 1) {
temp = a + ipop[chromosomeNum].substring(mutationNum);
} else {
if (mutationNum != GENE) {
temp = ipop[chromosomeNum].substring(0, mutationNum -1) + a
+ ipop[chromosomeNum].substring(mutationNum);
} else {
temp = ipop[chromosomeNum].substring(0, mutationNum - 1) + a;
}
}
//记录下变异后的染色体
ipop[chromosomeNum] = temp;
}
} public static void main(String args[]) { GA Tryer = new GA();
Tryer.ipop = Tryer.initPop(); //产生初始种群
String str = ""; //迭代次数
for (int i = 0; i < 1000000; i++) {
Tryer.select();
Tryer.cross();
Tryer.mutation();
Tryer.generation = i;
} double[] x = Tryer.calculatefitnessvalue(Tryer.beststr); str = "最小值" + Tryer.bestfitness + '\n' + "第"
+ Tryer.bestgenerations + "个染色体:<" + Tryer.beststr + ">" + '\n'
+ "x=" + x[0] + '\n' + "y=" + x[1]; System.out.println(str); }
}

  

遗传算法与Java代码简单实现的更多相关文章

  1. java代码简单练习

    总结: package com.ds; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JFrame; im ...

  2. Java代码 简单用于处理和数据库相关的操作

    package util; import org.apache.commons.beanutils.BeanUtils; import java.lang.reflect.InvocationTarg ...

  3. java代码简单实现队列

    1. 基于链表简单实现 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; / ...

  4. java代码简单实现栈

    1. 基于数组简单实现 /** * @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a> * @ ...

  5. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署

    1.工具的简单介绍 gitlab--源代码版本管理控制工具 maven--java代码编译构建工具 jenkins--基于java开发的自动化持续集成部署工具 sonar--代码质量管理工具 2.gi ...

  6. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  7. MongoDB最简单的入门教程之三 使用Java代码往MongoDB里插入数据

    前两篇教程我们介绍了如何搭建MongoDB的本地环境: MongoDB最简单的入门教程之一 环境搭建 以及如何用nodejs读取MongoDB里的记录: MongoDB最简单的入门教程之二 使用nod ...

  8. 几种简单的负载均衡算法及其Java代码实现

    什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.通过某种负载分担技 ...

  9. Jmeter4.0---- jmeter中写入java代码_简单了解(15)

    1.说明 BeanShell:是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型.命令.闭包等通用脚本 ...

随机推荐

  1. [51nod1666] 最大值

    题面 题解 毒瘤题浪费我大好青春 容易知道, 如果\(l\)和\(r\)位数不一样, 直接选形似\(99..99\)的数, 输出答案即可 \(l\)和\(r\)位数一样的话, 当位数确定的时候, 由于 ...

  2. how to force git to overwritten local files

    最佳解决方法 重要提示:如果您有任何本地更改,将会丢失.无论是否有--hard选项,任何未被推送的本地提交都将丢失. 如果您有任何未被Git跟踪的文件(例如上传的用户内容),这些文件将不会受到影响. ...

  3. centos7 下安装和配置 mongodb (重点)

    1.下载安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.4.tgz 2.解压 tar -zxvf m ...

  4. maven plugin

    assembly plugin [Maven学习]maven-assembly-plugin的使用 https://www.cnblogs.com/f-zhao/p/6929814.html使用Mav ...

  5. Java中<? extends T>和<? super T>的理解

    ? 通配符类型 - <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类; <? super T> 表示类型下界(Java Core中叫超类型限 ...

  6. git send-email时报错:Client host rejected: cannot find your hostname 如何处理?

    1. 先找出ip对应的域名 dig +short -x <your ip> 2. 如果第1步没有输出,那么需要将hostname与ip绑定,如:hostname为jello,那么是往/et ...

  7. springboot 静态资源访问,和文件上传 ,以及路径问题

    springboot 静态资源访问: 这是springboot 默认的静态资源访问路径  访问顺序依次从前到后(http://localhost:8080/bb.jpg) spring.resourc ...

  8. 一百一十三:CMS系统之前台注册界面

    html {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en" ...

  9. ssm整合用到的依赖jar包(不充足)

    <!--spring 的核心的jar包--><dependency> <groupId>org.springframework</groupId> &l ...

  10. React Native创建项目等待时间长解决

    1. 初始化工程 在终端输入命令 :react-native init AwesomeProject 从命令上看,看起来是初始化一个工程,于是, 1分钟...... 10分钟...... 1小时... ...