遺傳演算法 C

2021-09-01 13:18:40 字數 3745 閱讀 7548

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 舉乙個例子,遺傳演算法和梯度下降 梯度下降和遺傳演算法都是優化演算法,而梯度下降只是其中最基礎的那乙個,它依靠梯度與方向導數的關係計算出最優值...