C語言實現遺傳演算法

2021-08-16 19:36:24 字數 1990 閱讀 6848

演算法框架:

1. generateinitialpopulation();//生成初代種群

2. evaluatepopulation();//評估種群

3. generatenextpopulation();//產生下一代

1).selectionoperator();//選擇

2).crossoveroperator();//交叉

randomdisorder();//隨機亂序個體

3).mutationoperator();//變異

4. evaluatepopulation();//評估種群

以求f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2的最大值為例

執行環境 vs 2010

// geneticalforith.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "stdlib.h"

#include

#include

#define chromlength 24 //染色體長度

#define popsize80  //種群大小

#define maxgeneration 200 //最大進化代數 

#define pc 0.6 //交叉概率

#define pm 0.001 //變異概率

struct individual;

struct individual population[popsize],temppop[popsize],bestchrom;

void generateinitialpopulation()

}double func(double x1,double x2)

void evaluatepopulation()

double x1=sum/basevalue*(2.048+2.048)-2.048;//計算x1

sum=0;

for(int j=0;jsum+=population[i].chrom[j+chromlength/2]*pow(2.0,j);

}double x2=sum/basevalue*(2.048+2.048)-2.048;//計算x2

population[i].fitness=func(x1,x2);//適應值計算

}sum=0;

/*適應值歸一化 */

for(int i=0;isum+=population[i].fitness;

for(int i=0;ipopulation[i].nfitness=population[i].fitness/sum;

}void selectionoperator()}}

for(int i=0;ipopulation[i]=temppop[i];

}void randomdisorder()

}void crossoveroperator()}}

}void mutationoperator()}}

void generatenextpopulation()

int _tmain(int argc, _tchar* argv)

//選擇初代最優個體

while(generationgeneration++;

generatenextpopulation();//產生下一代

for(int i=0;iif(population[i].fitness>bestchrom.fitness)

bestchrom=population[i];

}//最優個體選擇

evaluatepopulation();

}printf("%lf\n",bestchrom.fitness);//輸出最優值

for(int i=0;i<24;i++)

printf("%d ",bestchrom.chrom[i]);//輸出最優值對應的染色體

printf("\n");

return 0;

}

用遺傳演算法求解迷宮路徑問題(c語言實現)

include include include include include include include include using namespace std define maph 100 高 define mapw 100 寬 define playersnumber 10000 每代個...

遺傳演算法 C

示例為計算函式為y x x 1024的最大值,32 x 31.參考 採用輪盤賭演算法作為選擇運算元的演算法 更新下一代 基於輪盤選擇選擇方法,進行基因型的選擇 private static void updatenext else console.writeline totalfitvalue to...

遺傳演算法 C

chromosome的定義,沒有定義複製方法,所以,在往子代傳遞的時候,變成了引用傳遞,在傳遞了幾代之後,後代其實全部變成了乙個染色體 隨機數取值的時候臨時定義的random變數,導致迴圈中每次取到的隨機數有很大程度是一樣的 輪盤賭選擇時,沒有定義子代種群,直接在當前種群中操作,會覆蓋一部分父代,導...