主函式:
int main()
srand((unsigned)time(null));
init();
ga();
system("pause");
return 0;
init函式:
void init() //初始化 建立乙個種群
inttmp;
for(int i=0;itmp=randi(n);
for(int j=0;jcur[i].x[j]=tmp%2; //儲存在一定範圍內產生隨機數被2取餘的餘數
tmp=tmp>>1;
cal_fitness();
randi函式:
int randi(int k)
return (int)(randd()*k+0.5); //randi()函式生成均勻分布的偽隨機整數,範圍為imin--imax,如果沒指定imin,則預設為1。r =randi(imax,n):生成n*n的矩陣
randd函式:
double randd()
return (double)rand()/rand_max; // rand()函式是產生隨機數的乙個隨機函式
//計算當前種群中各個個體的適應度
void cal_fitness()
inti,j,k;
double d;
for(i=0;ik=0;
for(j=len-1;j>=0;j--) k=(k<<1)+cur[i].x[j]; //累加在一定範圍內的餘數
d=(double)k/n*3-1; //d即為在該範圍內的乙個數值
cur[i].fitness=d*sin(10*pi*d)+2; //fitness代表該數所求的函式值
cur[i].fitsum=i>0?(cur[i].fitness+cur[i-1].fitsum):(cur[0].fitness); //除第0個數之外求該數d所對應的函式值的和前乙個的和
//遺傳進化函式
void ga()
intcnt=0;
double ans;
while(cnt++tran(); //進行換代操作
// printf("%.6lf\n",max.fitness);
// printcur();
ans=cur[0].fitness;
for(int i=1;iprintf("%.6lf\n",ans);
tran函式:
//換代
void tran()
inti,j,pos;
//找當前種群最優個體
max=cur[0];
for(i=1;iif(cur[i].fitness>max.fitness) max=cur[i];
for(int k=0;k//選擇交叉個體
i=sel();
j=sel();
//選擇交叉位置
pos=randi(len-1);
//交叉
if(randd()memcpy(next[k].x,cur[i].x,pos); //直接把cur【i】.x 拷貝到 next【i】.x
memcpy(next[k].x+pos,cur[j].x+pos,len-pos); //第pos位置進行複製 從j中第pos起 總共len-pos 複製上去 相當於交叉
memcpy(next[k+1].x,cur[j].x,pos);
memcpy(next[k+1].x+pos,cur[i].x+pos,len-pos); 同理 xj分別產生 乙個交叉
else
memcpy(next[k].x,cur[i].x,len); //直接把複製到下一代 基因型不改變
memcpy(next[k+1].x,cur[j].x,len);
//變異
if(randd()pos=randi(len-1); //產生隨機數 確定變異的位置在len-1的範圍內
next[k].x[pos]^=next[k].x[pos];
pos=randi(len-1); //再次進行
next[k+1].x[pos]^=next[k+1].x[pos]; //在pos位置變為原來的平方
//找下一代的最差個體
min=next[0],j=0;
for(i=1;iif(next[i].fitness//用上一代的最優個體替換下一代的最差個體
next[j]=max;
memcpy(cur,next,sizeof(cur));
cal_fitness(); //再次求新一代適應度
sel函式:
int sel()
double p=randd(); //產生乙個隨機數
double sum=cur[size-1].fitsum; //找到結尾數的最好的適應度
for(int i=0;iif(cur[i].fitsum/sum>p) return i; //然後從頭到尾找到適應度 大於產生的隨機數如果有則返回i
memcpy函式: //拷貝函式 呼叫string 函式即可
//列印個體適應度和二進位制編碼
void print(node tmp)
printf("%.6lf",tmp.fitness);
for(int i=0;iprintf("\n");
//列印種群
void printcur()
for(int i=0;i用遺傳演算法求y=x*sin(10*pi*x)+2的最大值 -1=精確到6位小數
pow(2,21)<3*1000000編碼的二進位制長度為22
#include
#include
#include
#include
#include
#define n 3000000
#define pi 3.14159265
#define max(a,b) ((a)>(b)?(a):(b))
#define size 50
#define maxgen 50
#define p_corss 0.75
#define p_mutation 0.05
#define len 22
typedef struct node
char x[len]; //儲存編碼
double fitness,fitsum; //第乙個為最適合 第二個適應度和
}node; //構建乙個結構體來儲存
node cur[size],next[size],max,min;
遺傳演算法詳解
遺傳演算法 genetic algorithm 是一類借鑑生物界的進化規律 適者生存,優勝劣汰遺傳機制 演化而來的隨機化搜尋方法。它是由美國的j.holland教授1975年首先提出,其主要特點是直接對結構物件進行操作,不存在求導和函式連續性的限定 具有內在的隱並行性和更好的全域性尋優能力 採用概率...
遺傳演算法簡單例項
遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各 個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...
遺傳演算法的簡單應用
遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。基本過程可以是 1 隨機產生第一代個體 2 計算第一代個體的適應度 3 迴圈 達到某個條件跳出 1 0根 據適應度 從這一代 中挑選下 一代的父 母1 0根據適應度從這一代中挑選下一代的父母 1...