用户尹*华, 曾经在<< 毕设论文-嗅觉机器人定位策略研究.doc >>文档页看到了我站,但是可能是该文档无法满足的其具体需求, 现在她通过我站悬赏问答网发布了一个紧急帮助信息,标题是:【遗传算法计算味源位置代码(java语言)】,具体需求内容是【基于机器嗅觉,利用遗传算法,计算出气味源大概位置,代码最好用java写】,但是由于本站人力物力有限,由于其问题太过于专业性太强,也或者是我们根本无暇顾及该用户的具体需求,导致本站根本无法为该用户提供最有效的服务。现在她(他)通过本站悬赏问答网平台发布了这一需求,希望有能人之士能够帮他解决这一个问题,并愿意付出100元作为报酬,不甚感激。
如果您觉得这个提问很好,可以点击左方的按钮进行推广,支持微信,短信和邮件推广。
注:100元只是象征性的价格标示,不代表实际成交价格,实际成交价格以能回答之人的定价为准。如果答案确实好,并且列出了一部分可信的免费内容(足以让购买回答答案者用户放心购买),则您可以放心购买。如果通过本站购买产生了交易纠纷,本站愿意承担一切线上交易的成交财务风险(限定在悬赏以后发生的购买金额范围以内,不承担线下交易的人身风险以及财务风险等任何风险)。
如果你无法确定或者不知道回答的内容是不是你想要的,可以在线咨询回答者以确定具体情况,根据具体情况请回答者做必要的修改或者补充。 如果确实已经发生了交易纠纷,您可以联系本站 仲裁处理。
(3)轮盘选择
基本思想:个体被选中的概率与其适应度值成正比,即按由个体适应度值所决定的某个规则选择将进入下一代的个体。(详细解析)
Java实现代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 轮盘选择
* 计算群体上每个个体的适应度值;
* 按由个体适应度值所决定的某个规则选择将进入下一代的个体;
*/
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];
}
}
}
}
}
(4)组合交叉(杂交)
单点杂交:设定杂交概率与杂交个体,按照断裂点进行染色体杂交
示例:
杂交前:a=<0101|0000>, b=<0111|1111>
杂交后:a=<0101|1111>, b=<0111|0000>
Java实现代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 交叉操作 交叉率为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;
}
}
}