遺傳演算法是上學時曾經研究過的演算法,它是一種基於基因遺傳思想的快速搜尋遍歷演算法。簡單理解,它就是比一般的盲搜尋和其他的一些搜尋快的演算法。其主要目的就是為了能快速準確搜尋所求的值,用於求解一些複雜的數值應用,以及一些實時性要求高的演算法應用中。以下是以前練習過的**,歡迎有需要的同學學習交流。
#include #include #include #include #include #define n 30000000000
#define pi 3.14159265
#define min_(a,b) ((a)<(b)?(b):(a))//定義求最大值函式min_(a,b)
#define size 50
#define maxgen 50
#define p_corss 0.75
#define p_mutation 0.05
#define len 22
typedef struct node//定義結構體,表示染色體,x是染色體二進位制編碼,fitness是該染色體的適應值,fitsum是當前所有染色體的適應值的總和
node;
node cur[size], next[size], max, min;//定義結構體陣列,有當前染色體種群,下一代染色體種群,以及最優和最差染色體。
double randd()
int randi(int k)
//計算當前種群中各個個體的適應度
void cal_fitness()
}void init()//初始化染色體種群,共size個,每個都是二進位制len長度的串
} cal_fitness();//計算當前種群各個個體的適應度
}int sel()//選擇種群中某個染色體
}//換代
void tran()
for (int k = 0; kelse//否則不交叉,
//變異
if (randd()}
//找下一代的最差個體
min = next[0], j = 0;
for (i = 1; inext[j] = max;
memcpy(cur, next, sizeof(cur));//把整個改良過的(經過交叉,變異,替換等操作的)next代的值賦給當前種群cur,供下一次迴圈優化
cal_fitness();
}//列印個體適應度和二進位制編碼
void print(node tmp)
//列印種群
void printcur()
void ga()
ans = cur[0].fitness;
for (int i = 1; iprintf("%.6lf\n", ans);
}int main()
遺傳演算法 C
示例為計算函式為y x x 1024的最大值,32 x 31.參考 採用輪盤賭演算法作為選擇運算元的演算法 更新下一代 基於輪盤選擇選擇方法,進行基因型的選擇 private static void updatenext else console.writeline totalfitvalue to...
遺傳演算法 C
chromosome的定義,沒有定義複製方法,所以,在往子代傳遞的時候,變成了引用傳遞,在傳遞了幾代之後,後代其實全部變成了乙個染色體 隨機數取值的時候臨時定義的random變數,導致迴圈中每次取到的隨機數有很大程度是一樣的 輪盤賭選擇時,沒有定義子代種群,直接在當前種群中操作,會覆蓋一部分父代,導...
C語言實現遺傳演算法
演算法框架 1.generateinitialpopulation 生成初代種群 2.evaluatepopulation 評估種群 3.generatenextpopulation 產生下一代 1 selectionoperator 選擇 2 crossoveroperator 交叉 random...