遺傳演算法用python簡單解釋

2022-08-05 09:00:20 字數 2725 閱讀 7972

遺傳演算法模仿了生物遺傳進化的過程,可以在給定範圍內搜尋最優解。遺傳演算法的設計一般包括引數編碼、初始群體的設定、適應度函式的設計、遺傳操作設計(選擇、交叉、變異)、控制引數設定等。

在這裡,我們基於python使用遺傳演算法嘗試搜尋函式

\(y = -x^2+2x+5\)

在區間\([0,63]\)內的最大值,簡便起見只取區間內的整數。

對於本問題,用6個二進位制位即可表示0~63的所有整數,其中每組編碼可視為一條染色體或個體,具體編碼如下:

\([0,0,0,0,0,0,0]\)

\([1,1,1,1,1,1,1]\)

在這裡假設種群一直維持有4條染色體,隨機初始化後如下:

\([0,0,1,0,1,0,0]\)

\([1,0,0,1,0,0,0]\)

\([0,0,1,0,0,0,1]\)

\([0,1,0,0,0,1,0]\)

適應度函式在這裡直接取函式的值,即函式值越大其適應度越高。

4.1選擇

在這個階段直接捨棄掉適應度低的兩條染色體,選擇適應度高的兩條染色體來產生新的染色體。

4.2交叉

\([0,0,0,0,0,0,0]\)

\([1,1,1,1,1,1,1]\)

交叉時首先隨機選擇交叉點,比如為第三個,則交叉後產生的的染色體為:

\([0,0,0,1,1,1,1]\)

\([1,1,1,0,0,0,0]\)

4.1變異

對上一步新產生的染色體,首先以一定的變異率來決定是否變異,然後同樣的隨機選擇變異點,將該位置基因反轉。最後再將產生的兩條新染色體新增進種群中,這樣就完成了一次遺傳迭代操作,反覆進行迭代就有可能搜尋到最優解。

import random

class chromosome(object):

def __init__(self, chrom=none):

# 隨機初始化乙個染色體

if chrom == none:

self.chrom =

for _ in range(6):

_num = random.randint(0, 1)

# 直接賦值乙個染色體

else:

self.chrom = chrom

# 適應度函式

def fit_score(self):

_str = ''

for i in self.chrom:

_str += str(i)

_num = int(_str, 2)

return 5 - _num * _num + _num * 2

# 交叉函式

def cross(self, chrom, cross_rate):

cross_idx = random.randint(0, 5)

child_chrom1 = self.chrom[:cross_idx] + chrom.chrom[cross_idx:]

child_chrom2 = chrom.chrom[:cross_idx] + self.chrom[cross_idx:]

return chromosome(child_chrom1), chromosome(child_chrom2)

# 變異函式

def vary(self, vary_rate):

_num = random.randint(1, 10)

if _num <= 10*vary_rate: # 模擬變異率

cross_idx = random.randint(0, 5)

if self.chrom[cross_idx] == 0:

self.chrom[cross_idx] = 1

else:

self.chrom[cross_idx] = 0

def one_iter(population, cross_rate=0.8, vary_rate=0.2):

# 選擇使用排序法 取適應度最高值

# 交叉使用隨機單點交叉 cross_rate=交叉率 (暫未開啟)

# 變異使用隨機反轉變異 vary_rate=變異率

population.sort(key=lambda x:x.fit_score(), reverse=true)

population.pop()

population.pop()

child_chrom1, child_chrom2 = population[0].cross(population[1], cross_rate)

child_chrom1.vary(vary_rate)

child_chrom2.vary(vary_rate)

def main():

population = [chromosome(), chromosome(), chromosome(), chromosome()]

for _ in range(50):

one_iter(population)

population.sort(key=lambda x: x.fit_score(), reverse=true)

print(population[0].chrom, population[0].fit_score())

if __name__ == '__main__':

main()

上述內容只是對遺傳演算法最淺顯的解釋,每種操作都盡可能簡化,如需深入了解,還請參考其他內容。

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

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

遺傳演算法 python 簡書 遺傳演算法

優化的演算法有很多種,從最基本的梯度下降法到現在的一些啟發式演算法,如遺傳演算法 ga 差分演化演算法 de 粒子群演算法 pso 和人工蜂群演算法 abc 舉乙個例子,遺傳演算法和梯度下降 梯度下降和遺傳演算法都是優化演算法,而梯度下降只是其中最基礎的那乙個,它依靠梯度與方向導數的關係計算出最優值...

遺傳演算法簡單例項

遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各 個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...