機器學習課程結束,作為遺傳演算法小白,簡單實現了遺傳演算法解決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...