遺傳演算法簡單例題的詳解

2021-08-01 10:37:26 字數 3316 閱讀 3350

主函式:

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...