IF�245 2022-02-04 17:01 采纳率: 33.3%

# 求用遗传算法 Java求解一个单水库发电最大代码

• 写回答

#### 2条回答默认 最新

• 小飞LOVE霞 2022-02-04 20:04
关注
``````
import java.util.ArrayList;
import java.util.Random;
import java.lang.Math;
public class Chromosome {
public static final int GENG_LENGTH = 14;
public static final int MAX_X = 127;
public static final int MAX_Y = 127;
private int x,y;
private String gene;
public int getX() {
return x;
}
public int getY() {
return y;
}
public String getGene() {
return gene;
}
public Chromosome(int x,int y) {
if(x > MAX_X || y > MAX_Y || x < 0 || y < 0)
return;
this.x = x;
this.y = y;
String tem = Integer.toBinaryString(x);

for(int i = tem.length(); i < GENG_LENGTH/2; i++) {
tem = "0" + tem;
}
gene = tem;
tem = Integer.toBinaryString(y);
for(int i = tem.length(); i < GENG_LENGTH/2; i++) {
tem = "0" + tem;
}
gene = gene + tem;
}
public Chromosome(String gene) {
if(gene.length() != Chromosome.GENG_LENGTH)
return;
this.gene = gene;
String xStr = gene.substring(0, Chromosome.GENG_LENGTH/2);
String yStr = gene.substring(Chromosome.GENG_LENGTH/2);
this.x = Integer.parseInt(xStr,2);
this.y = Integer.parseInt(yStr,2);

}
public String toString() {
return "x:" + x + "\ty:" + y + "\tgene:"+gene;
}
public void selfMutation(String newGene) {
if(newGene.length() != Chromosome.GENG_LENGTH)
return;
this.gene = newGene;
String xStr = newGene.substring(0, Chromosome.GENG_LENGTH/2);
String yStr = newGene.substring(Chromosome.GENG_LENGTH/2);
this.x = Integer.parseInt(xStr,2);
this.y = Integer.parseInt(yStr,2);
}

//初始化种群
public static ArrayList<Chromosome> initGroup(int size) {
ArrayList<Chromosome> list = new ArrayList<Chromosome>();
Random random = new Random();
for(int i = 0; i < size; i++) {
int x = random.nextInt() % 128;
int y = random.nextInt() % 128;
x = x < 0? (-x):x;
y = y < 0? (-y):y;
}
return list;
}
//计算适应度
public int calcFitness() {
return x*x+y*y;
}
//选择运算
public static ArrayList<Chromosome> selector(ArrayList<Chromosome> fatherGroup,int sonGroupSize) {
ArrayList<Chromosome> sonGroup = new ArrayList<Chromosome>();
int totalFitness = 0;
double[] fitness = new double[fatherGroup.size()];
for(Chromosome chrom : fatherGroup) {
totalFitness += chrom.calcFitness();
}
int index = 0;
//计算适应度
for(Chromosome chrom : fatherGroup) {
fitness[index] = chrom.calcFitness() / ((double)totalFitness);
index++;
}
//计算累加适应度
for(int i = 1; i < fitness.length; i++) {
fitness[i] = fitness[i-1]+fitness[i];
}
//轮盘赌选择
for(int i = 0; i < sonGroupSize; i++) {
Random random = new Random();
double probability = random.nextDouble();
int choose;
for(choose = 1; choose < fitness.length - 1; choose++) {
if(probability < fitness[choose])
break;
}
}
return sonGroup;
}
//交叉运算--one point
public static ArrayList<Chromosome> corssover(ArrayList<Chromosome> fatherGroup,double probability) {
ArrayList<Chromosome> sonGroup = new ArrayList<Chromosome>();
Random random = new Random();
for(int k = 0; k < fatherGroup.size() / 2; k++) {
if(probability > random.nextDouble()) {
int i = 0,j = 0;
do {
i = random.nextInt(fatherGroup.size());
j = random.nextInt(fatherGroup.size());
} while(i == j);
int position = random.nextInt(Chromosome.GENG_LENGTH);
String parent1 = fatherGroup.get(i).getGene();
String parent2 = fatherGroup.get(j).getGene();
String son1 = parent1.substring(0, position) + parent2.substring(position);
String son2 = parent2.substring(0, position) + parent1.substring(position);
}
}
return sonGroup;
}
//变异
public static void mutation(ArrayList<Chromosome> fatherGroup,double probability) {
Random random = new Random();
Chromosome bestOne = Chromosome.best(fatherGroup);
for(Chromosome c : fatherGroup) {
String newGene = c.getGene();
for(int i = 0; i < newGene.length();i++){
if(probability > random.nextDouble()) {
String newChar = newGene.charAt(i) == '0'?"1":"0";
newGene = newGene.substring(0, i) + newChar + newGene.substring(i+1);
}
}
c.selfMutation(newGene);
}
}
public static Chromosome best(ArrayList<Chromosome> group) {
Chromosome bestOne = group.get(0);
for(Chromosome c : group) {
if(c.calcFitness() > bestOne.calcFitness())
bestOne = c;
}
return bestOne;
}
//测试
public static void main(String[] args) {
final int GROUP_SIZE = 20;
final double MUTATION_P = 0.01;
ArrayList<Chromosome> group = Chromosome.initGroup(GROUP_SIZE);
Chromosome theBest;
do{
Chromosome.mutation(group, MUTATION_P);
group = Chromosome.selector(group, GROUP_SIZE);
theBest = Chromosome.best(group);
System.out.println(theBest.calcFitness());
}while(theBest.calcFitness() < 32258);
}
}
``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 3月10日
• 已采纳回答 3月2日
• 创建了问题 2月4日

#### 悬赏问题

• ¥15 燃机的MPC控制器代码问题
• ¥15 powershell删除目录及文件空格等符号问题
• ¥20 微信h5网页如何静默获取到用户的基本信息（头像昵称）
• ¥15 如图所示交换机网络该如何规划配置
• ¥15 CUDA driver error
• ¥15 Dijkstra 算法的堆优化方法
• ¥15 师哥师姐们，如何帮我下载一下python？
• ¥15 Office版本升级，Oracle连接报错
• ¥20 利用python搜索PDF文件中是否存在1
• ¥15 ImportPathMismatchError