演算法框架:
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變數,導致迴圈中每次取到的隨機數有很大程度是一樣的 輪盤賭選擇時,沒有定義子代種群,直接在當前種群中操作,會覆蓋一部分父代,導...