我們來研究一下遺傳演算法(ga)。ga的理論部分可以去google或者wikipedia上問,現在我們通過乙個具體的例子來說明一下。
首先,遺傳演算法可以解決很多問題。比如訓練神經網路~,本文主要通過下面這個例子來講解:
假設有10張卡牌,上面數字為1-10,要求將這10張卡牌分為兩組,每組5張,第一組的5個數字只和為36,第二組的5個數字之積為360;
當然這個問題也可以通過其他方法求解,這裡我們要介紹的是通過遺傳演算法解決。遺傳演算法是一種通過模擬自然進化過程搜尋最優解的方法。其 計算過程如下:
a)初始化:設定進化代數計數器t=0,設定最大進化代數t,隨機生成m個個體作為初始群體p(0)。
b)個體評價:計算群體p(t)中各個個體的適應度。
c)選擇運算:將選擇運算元作用於群體。選擇的目的是把優化的個體直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的。
d)交叉運算:將交叉運算元作用於群體。所謂交叉是指把兩個父代個體的部分結構加以替換重組而生成新個體的操作。遺傳演算法中起核心作用的就是交叉運算元。
e)變異運算:將變異運算元作用於群體。即是對群體中的個體串的某些基因座上的基因值作變動。群體p(t)經過選擇、交叉、變異運算之後得到下一代群體p(t 1)。
f)終止條件判斷:若t=t,則以進化過程中所得到的具有最大適應度個體作為最優解輸出,終止計算。
簡單說就是這樣子:從解決方案集合中隨機選擇兩個解決方案 ;判斷哪個方案的結果更接近想要的結果,表示為成功方案;用成功方案代替失敗方案,或者將修改失敗方案使之更接近成功方案,形成新的解決方案集合。
**實現過程是這樣子的:首先初始化乙個解決方案集合
private void init()else}}
}
然後寫判斷方案的函式
private double evaluate(int n)else
}sumerror = (sum - sumtarget)/sumtarget;
proderror = (prod - prodtarget)/prodtarget;
return math.abs(sumerror) + math.abs(proderror);
}
最後寫迭代遺傳
public int run()else
for(int i = 0; i < len; i++)
if(random.nextdouble() < 0.1)
if(evaluate(loser) == 0)
}if(ret[0] == 0 && times == 1)
}return ret;
}
python遺傳演算法 Python 遺傳演算法實現
關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...
遺傳演算法python實現
i 實現功能 求解函式 f x x 10 sin 5 x 7 cos 4 x 在區間 0,9 的最大值 ii 原理 遺傳演算法 genetic algorithm 遵循 適者生存 優勝劣汰 的原則,是一類借鑑生物界自然選擇和自然遺傳機制的隨機化搜尋演算法。遺傳演算法模擬乙個人工種群的進化過程,通過選...
遺傳演算法 python實現
encoding utf 8 import math import random import operator class ga def init self,length,count 染色體長度 self.length length 種群中的染色體數量 self.count count 隨機生成初...