NSGA 演算法C 實現(測試函式為ZDT1)

2021-09-03 03:04:01 字數 3724 閱讀 1077

#pragma warning(disable:4996)

#include

#include

#include

#include

#include

#include

#define dimension 30

//基因維數,在這裡即zdt1問題xi的i的最大值

#define popsize 100

//種群大小

#define generation 500

//繁衍代數

#define urand (rand()/(rand_max+1.0))

//產生隨機數

int temp1[popsize]

;//臨時陣列

int mark[popsize]

;//標記陣列

//以上兩個陣列用於產生新的子代

using namespace std;

//個體的類宣告:

class individual

;//群體的類宣告:

class population

;//全域性變數及部分函式宣告:

individual f[

2* popsize][2

* popsize]

;double

rand_real

(double low,

double high)

//產生隨機實數

intrand_int

(int low,

int high)

//產生隨機整數

//關於排序函式qsort

intcmp1

(const

void

*a,const

void

*b)//目標函式f1的公升序排序

intcmp2

(const

void

*a,const

void

*b)//目標函式f2的公升序排序

intcmp_c_d

(const

void

*a,const

void

*b)//對擁擠距離降序排序

void population:

:f_sort

(int i)

//群的初始化:

population:

:population()

for(i =

0; i) pnum = popsize;

qnum =0;

rnum =0;

}//個體初始化:

void individual:

:init()

//利用二進位制錦標賽產生子代:

void population:

:make_new_pop()

t1 =

choice

(t1, t2)

; temp1[t3++

]= t1;

mark[t1]=1

;}for(i =

0; ii++;}

else}}

qnum = popsize;

for(i =

0; i) q[i]

.f_count()

;}void population:

:set_p_q()

//zdt1問題函式值的計算:

void individual:

:f_count()

sum +=9

*(sum /

(dimension -1)

);g +

= sum;

fvalue[1]

= g*(1

-sqrt

(value[0]

/ g));

}//判斷目標函式值是否被支配:

bool e_is_dominated

(const individual &a,

const individual &b)

else

return false;

}//快速非支配排序法:重點!!!

void population:

:fast_nondominated_sort()

for(i =

0; i<

2* popsize; i++)}

if(r[i]

.np ==0)

} i =0;

while

(len[i]!=0

)}} i++

; len[i]

= h_len;

if(h_len !=0)

}}void population:

:calu_crowding_distance

(int i)

for(j =

1; j1; j++

) f[i]

[j].crowding_distance +

=(f[i]

[j +1]

.fvalue[0]

- f[i]

[j -1]

.fvalue[0]

)/(m_max - m_min)

; f[i][0

].crowding_distance = f[i]

[n -1]

.crowding_distance =

0xffffff

;qsort

(f[i]

, n,

sizeof

(individual)

, cmp2)

; m_max =

-0xfffff

; m_min =

0xfffff

;for

(j =

0; j)for

(j =

1; j1; j++

) f[i]

[j].crowding_distance +

=(f[i]

[j +1]

.fvalue[1]

- f[i]

[j -1]

.fvalue[1]

)/(m_max - m_min);}

//採集多樣性的選擇

int population:

:choice

(int a,

int b)

else

return b;

}//nsgaii主要操作函式:

void population:

:maincal()

if(i//len_f 整個群體rank值

for(j =

0; j) p[pnum++

]= f[i]

[j];

make_new_pop()

;//利用二進位制錦標賽產生子代:}}

intmain()

fprintf

(p,"\n");

fprintf

(p,"f1(x)=%f f2(x)=%f\n"

, pop.p[i]

.fvalue[0]

, pop.p[i]

.fvalue[1]

);//評估值

fprintf

(p,"\n");

}fclose

(p);

system

("pause");

return0;

}

使用C 編寫的乙個通用的測試函式

在測試的時候,經常要寫很多前後的測評 為了利用這些 本文編寫了乙個簡易的函式,通過這個函式的定義,可以很方便地進行效能測試。函式的簽名為void timing const string testname,int p void 其中第1個引數為測試名稱,第2個為測試函式。測試函式的型別是無引數返回整型...

遺傳演算法求解函式最大值c 實現

遺傳演算法求解步驟 1.使用隨機方法產生乙個有n個染色體的初始種群 2.對群體中的每乙個染色體,計算其適應值 3.從群體中隨機選擇一些染色體構成乙個新的群體 常用方法 輪盤賭選擇,錦標賽選擇 4.以一定概率進行交叉 單點交叉 多點交叉 5.以一定概率進行變異 6.返回第2步,以一定的迭代次數進行迴圈...

演算法學習09 判斷鍊錶是否為回文結構C 實現

給定乙個單鏈表的頭結點head,請判斷該鍊錶是否為回文結構 例子1 2 1,返回ture 1 2 2 1返回ture 15 6 15返回ture 1 2 3返回false 分析將鍊錶中的元素按順序存入堆疊,那麼棧的彈出順序和鍊錶的順序剛好相反。對比棧頂元素和鍊錶當前元素,如果不同,返回false,如...