遺傳演算法解決PlayTennis問題

2021-08-20 20:41:28 字數 3299 閱讀 5684

機器學習課程結束,作為遺傳演算法小白,簡單實現了遺傳演算法解決playtennis問題,參考湯姆.公尺切爾的《機器學習》。本人認為這個問題最大的難點在於如何設計適應度函式。

首先把天氣狀況表示為二進位制位串

outlook

sunny

100overcast

010rain

001humidity

high

10normal

01wind

strong

10weak

01playtennis

yes1no0

遺傳演算法原型:

ga(fitness,fitness_threshold,p,r,m)

fitness:適應度評分函式,為給定假設賦予乙個評估分數

fitness_threshold:指定終止判據的閾值

p:群體中包含的假設數量

r:每一步中通過交叉取代群體成員的比例

m:變異率

產生新一代ps:

(1)  選擇:用概率方法選擇p的(1-r)p個成員加入ps。

(2)  交叉:按概率選擇r*p/2對假設,對每對假設,應用交叉運算元產生兩個後代。把所有的後代加入ps。

(3)  變異:使用均勻的概率從ps中選擇m%的成員。對於選出的每個成員,在它的表示中隨機選擇乙個位取反。

(4)  更新p<-ps

主要**public class main

system.out.println("--------初始化--------");

print(pool);

//演化

for(int i=0;isystem.out.println("--------演化"+i+"--------");

evolution(pool);

}//得到最佳假設

string bestchoise = pool.get(0);

float bestfitness = calculatefitness(pool.get(0));

for(int i=0;iif(calculatefitness(pool.get(i))bestchoise = pool.get(i+1);

bestfitness =calculatefitness(pool.get(i+1));}}

system.out.println("--------最佳假設--------");

system.out.println(bestchoise);

system.out.println("--------適應度--------");

system.out.println(bestfitness);

}/**

* 適應度計算

* @param code

* @return

*/private static float calculatefitness(string code)

if(equalcount==3)

if(data.charat(data.length()-1)==code.charat(code.length()-1))

acccount++;

else

wrongcount++;

}if(acccount == 0)

return 0;

float acc = (float)acccount/(acccount+wrongcount);

if(code.charat(code.length()-1)=='0')else

}/**

* 演化

* @param pool

*/private static void evolution(listpool)

fitness.remove(0);

//輪盤

for(int i=0;i<20;i++)else

fitness.remove(j);

pool.remove(j);

j--;

selectdone = true;}}

}pool.clear();

pool.addall(newpool);

newpool.clear();

system.out.println("--------輪盤賭--------");

print(pool);

//交叉

for(int i=0;ifor(int j=i+1;jif(pool.get(i).charat(7)==pool.get(j).charat(7))else}}

pool.clear();

pool.addall(newpool);

newpool.clear();

system.out.println("--------交叉--------");

print(pool);

//變異

for(int i=0;ifloat v = rand.nextfloat();

if(vvariation(pool.get(i));

}else

}pool.clear();

pool.addall(newpool);

newpool.clear();

system.out.println("--------變異--------");

print(pool);

}/**

* 交叉

* @param parent1

* @param parent2

*/private static void cross(string parent1,string parent2)else

cro = rand.nextfloat();

if(cro>p_c)else

cro = rand.nextfloat();

if(cro>p_c)else

cro = rand.nextfloat();

if(cro>p_c)else

newpool.add(child1.tostring());

newpool.add(child2.tostring());

}/**

* 變異,採用點變異

* @param children

*/private static void variation(string parent)else

newpool.add(children);

}/**

* 輸出

* @param pool

*/private static void print(listpool)

}private static string traindatas = ;}

python遺傳演算法 Python 遺傳演算法實現

關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...

tsp問題 遺傳演算法解決

tsp問題最簡單的求解方法是列舉法。它的解是多維的 多區域性極值的 趨於無窮大的複雜解的空間,搜尋空間是n個點的所有排列的集合,大小為 n 1 可以形象地把解空間看成是乙個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解tsp,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。這一篇將...

遺傳演算法解決TSP問題

基本原理在 中有注釋 1 include2 include 3 include 4 include5 include 6 using std string 7 8struct position9 1617 double tsp int n,struct position position,int t...