#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,如...