chromosome的定義,沒有定義複製方法,所以,在往子代傳遞的時候,變成了引用傳遞,在傳遞了幾代之後,後代其實全部變成了乙個染色體
隨機數取值的時候臨時定義的random變數,導致迴圈中每次取到的隨機數有很大程度是一樣的
輪盤賭選擇時,沒有定義子代種群,直接在當前種群中操作,會覆蓋一部分父代,導致基因丟失
累積概率計算不正確
交叉方法不正常
變異方法不正確
適度函式選取的空間不正確
修改過後的**如下
修改後的**執行結果很穩定
using system;
using system.collections.generic;
namespace geneticalgorithm
c.fitvalue = fitvalue;
c.fitvaluepercent = fitvaluepercent;
c.probability = probability;
return c;}}
/// /// 染色體組;
///
private static listchromosomes = new list();
private static listchromosomeschild = new list();
private static random random = new random();
private enum choosetype
private static choosetype choosetype = choosetype.roulette;
/// /// main入口函式;
///
///
private static void main(string args)
print(true);
//交叉得到新個體;
console.writeline("交叉:");
crossoperate();
print();
//變異操作;
console.writeline("變異:");
variationoperate();
print();
}int maxfit = chromosomes[0].fitvalue;
for (int i = 1; i < chromosomes.count; i++)
}console.writeline("最大值為: " + maxfit);
console.readline();
}/// /// 列印;
///
private static void print(bool bloadpercent = false)
int x = decode(chromosomes[i].bits);
console.write(" x: " + x);
console.write(" y: " + chromosomes[i].fitvalue);
if (bloadpercent)
console.writeline();
}console.writeline("*************************");
}/// /// 初始化;
///
private static void init()
//獲得十進位制的值;
int x = decode(chromosome.bits);
int y = getfitvalue(x);
chromosome.fitvalue = y;
chromosomes.add(chromosome);
//算出total fit;
if (chromosome.fitvalue <= 0)
else}}
/// /// 解碼,二進位製裝換;
///
///
///
private static int decode(int bits)
else
}/// /// 獲取fit值;
///
///
///
private static int getfitvalue(int x)
/// /// 更新下一代;
/// 基於輪盤賭選擇方法,進行基因型的選擇;
///
private static void updatenext()
else
}console.writeline("totalfitvalue " + totalfitvalue);
//算出每個的fit percent;
for (int i = 0; i < chromosomes.count; i++)
else
console.writeline("fitvaluepercent " + i + " " + chromosomes[i].fitvaluepercent);
}計算累積概率;
第乙個的累計概率就是自己的概率;
chromosomes[0].probability = chromosomes[0].fitvaluepercent;
console.writeline("probability 0 " + chromosomes[0].probability);
double probability = chromosomes[0].probability;
for (int i = 1; i < chromosomes.count; i++)
console.writeline("probability " + i + " " + chromosomes[i].probability);
}chromosomeschild.clear();
//輪盤賭選擇方法,用於選出前兩個;
for (int i = 0; i < chromosomes.count; i++)
else}}
}for (int i = 0; i < chromosomes.count; i++)
}/// /// 選擇染色體;
///
private static void choosechromosome());}
/// /// 交叉操作;
///
private static void crossoperate()
console.writeline("交叉的rand " + rand1 + " - " + rand2);
for (int j = 0; j < chromosomes.count; j = j + 2)
chromosomes[j].fitvalue = getfitvalue(decode(chromosomes[j].bits));
chromosomes[j + 1].fitvalue = getfitvalue(decode(chromosomes[j + 1].bits));}}
/// /// 變異操作;
///
private static void variationoperate()
else
chromosomes[row].fitvalue = getfitvalue(decode(chromosomes[row].bits));}}
/// /// 重新計算fit值;
///
private static void updatefitvalue()}}
}
遺傳演算法 C
示例為計算函式為y x x 1024的最大值,32 x 31.參考 採用輪盤賭演算法作為選擇運算元的演算法 更新下一代 基於輪盤選擇選擇方法,進行基因型的選擇 private static void updatenext else console.writeline totalfitvalue to...
python遺傳演算法 Python 遺傳演算法實現
關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...
遺傳演算法 python 簡書 遺傳演算法
優化的演算法有很多種,從最基本的梯度下降法到現在的一些啟發式演算法,如遺傳演算法 ga 差分演化演算法 de 粒子群演算法 pso 和人工蜂群演算法 abc 舉乙個例子,遺傳演算法和梯度下降 梯度下降和遺傳演算法都是優化演算法,而梯度下降只是其中最基礎的那乙個,它依靠梯度與方向導數的關係計算出最優值...