最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解用python實現(xiàn)簡單的遺傳算法

 更新時間:2018年01月02日 11:43:49   作者:czrzchao  
這篇文章主要介紹了詳解用python實現(xiàn)簡單的遺傳算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

今天整理之前寫的代碼,發(fā)現(xiàn)在做數(shù)模期間寫的用python實現(xiàn)的遺傳算法,感覺還是挺有意思的,就拿出來分享一下。

首先遺傳算法是一種優(yōu)化算法,通過模擬基因的優(yōu)勝劣汰,進(jìn)行計算(具體的算法思路什么的就不贅述了)。大致過程分為初始化編碼、個體評價、選擇,交叉,變異。

遺傳算法介紹

遺傳算法是通過模擬大自然中生物進(jìn)化的歷程,來解決問題的。大自然中一個種群經(jīng)歷過若干代的自然選擇后,剩下的種群必定是適應(yīng)環(huán)境的。把一個問題所有的解看做一個種群,經(jīng)歷過若干次的自然選擇以后,剩下的解中是有問題的最優(yōu)解的。當(dāng)然,只能說有最優(yōu)解的概率很大。這里,我們用遺傳算法求一個函數(shù)的最大值。

f(x) = 10 * sin( 5x ) + 7 * cos( 4x ),    0 <=  x <= 10

1、將自變量x進(jìn)行編碼

取基因片段的長度為10, 則10位二進(jìn)制位可以表示的范圍是0到1023?;蚺c自變量轉(zhuǎn)變的公式是x = b2d(individual) * 10 / 1023。構(gòu)造初始的種群pop。每個個體的基因初始值是[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

2、計算目標(biāo)函數(shù)值

根據(jù)自變量與基因的轉(zhuǎn)化關(guān)系式,求出每個個體的基因?qū)?yīng)的自變量,然后將自變量代入函數(shù)f(x),求出每個個體的目標(biāo)函數(shù)值。

3、適應(yīng)度函數(shù)

適應(yīng)度函數(shù)是用來評估個體適應(yīng)環(huán)境的能力,是進(jìn)行自然選擇的依據(jù)。本題的適應(yīng)度函數(shù)直接將目標(biāo)函數(shù)值中的負(fù)值變成0. 因為我們求的是最大值,所以要使目標(biāo)函數(shù)值是負(fù)數(shù)的個體不適應(yīng)環(huán)境,使其繁殖后代的能力為0.適應(yīng)度函數(shù)的作用將在自然選擇中體現(xiàn)。

4、自然選擇

自然選擇的思想不再贅述,操作使用輪盤賭算法。其具體步驟:

假設(shè)種群中共5個個體,適應(yīng)度函數(shù)計算出來的個體適應(yīng)性列表是fitvalue = [1 ,3, 0, 2, 4] ,totalvalue = 10 , 如果將fitvalue畫到圓盤上,值的大小表示在圓盤上的面積。在轉(zhuǎn)動輪盤的過程中,單個模塊的面積越大則被選中的概率越大。選擇的方法是將fitvalue轉(zhuǎn)化為[1 , 4 ,4 , 6 ,10], fitvalue / totalvalue = [0.1 , 0.4 , 0.4 , 0.6 , 1.0] . 然后產(chǎn)生5個0-1之間的隨機(jī)數(shù),將隨機(jī)數(shù)從小到大排序,假如是[0.05 , 0.2 , 0.7 , 0.8 ,0.9],則將0號個體、1號個體、4號個體、4號個體、4號個體拷貝到新種群中。自然選擇的結(jié)果使種群更符合條件了。

5、繁殖

假設(shè)個體a、b的基因是

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

這兩個個體發(fā)生基因交換的概率pc = 0.6.如果要發(fā)生基因交換,則產(chǎn)生一個隨機(jī)數(shù)point表示基因交換的位置,假設(shè)point = 4,則:

a = [1, 0, 0, 0, 0, 1, 1, 1, 0, 0]
b = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1]

交換后為:

a = [1, 0, 0, 0, 1, 0, 1, 1, 1, 1]
b = [0, 0, 0, 1, 0, 1, 1, 1, 0, 0]

6、突變

遍歷每一個個體,基因的每一位發(fā)生突變(0變?yōu)?,1變?yōu)?)的概率為0.001.突變可以增加解空間

以目標(biāo)式子 y = 10 * sin(5x) + 7 * cos(4x)為例,計算其最大值

首先是初始化,包括具體要計算的式子、種群數(shù)量、染色體長度、交配概率、變異概率等。并且要對基因序列進(jìn)行初始化

pop_size = 500  # 種群數(shù)量 
max_value = 10  # 基因中允許出現(xiàn)的最大值 
chrom_length = 10  # 染色體長度 
pc = 0.6   # 交配概率 
pm = 0.01   # 變異概率 
results = [[]]  # 存儲每一代的最優(yōu)解,N個二元組 
fit_value = []  # 個體適應(yīng)度 
fit_mean = []  # 平均適應(yīng)度 
pop = geneEncoding(pop_size, chrom_length) 

其中g(shù)enEncodeing是自定義的一個簡單隨機(jī)生成序列的函數(shù),具體實現(xiàn)如下

def geneEncoding(pop_size, chrom_length): 
 pop = [[]] 
 for i in range(pop_size): 
  temp = [] 
  for j in range(chrom_length): 
   temp.append(random.randint(0, 1)) 
  pop.append(temp) 
 return pop[1:] 

編碼完成之后就是要進(jìn)行個體評價,個體評價主要是計算各個編碼出來的list的值以及對應(yīng)帶入目標(biāo)式子的值。其實編碼出來的就是一堆2進(jìn)制list。這些2進(jìn)制list每個都代表了一個數(shù)。其值的計算方式為轉(zhuǎn)換為10進(jìn)制,然后除以2的序列長度次方減一,也就是全一list的十進(jìn)制減一。根據(jù)這個規(guī)則就能計算出所有l(wèi)ist的值和帶入要計算式子中的值,代碼如下

# 0.0 coding:utf-8 0.0 
# 解碼并計算值 
import math 
def decodechrom(pop, chrom_length): 
 temp = [] 
 for i in range(len(pop)): 
  t = 0 
  for j in range(chrom_length): 
   t += pop[i][j] * (math.pow(2, j)) 
  temp.append(t) 
 return temp 
 
 
def calobjValue(pop, chrom_length, max_value): 
 temp1 = [] 
 obj_value = [] 
 temp1 = decodechrom(pop, chrom_length) 
 for i in range(len(temp1)): 
  x = temp1[i] * max_value / (math.pow(2, chrom_length) - 1) 
  obj_value.append(10 * math.sin(5 * x) + 7 * math.cos(4 * x)) 
 return obj_value 

有了具體的值和對應(yīng)的基因序列,然后進(jìn)行一次淘汰,目的是淘汰掉一些不可能的壞值。這里由于是計算最大值,于是就淘汰負(fù)值就好了

# 0.0 coding:utf-8 0.0 
# 淘汰(去除負(fù)值) 
def calfitValue(obj_value): 
 fit_value = [] 
 c_min = 0 
 for i in range(len(obj_value)): 
  if(obj_value[i] + c_min > 0): 
   temp = c_min + obj_value[i] 
  else: 
   temp = 0.0 
  fit_value.append(temp) 
 return fit_value 

然后就是進(jìn)行選擇,這是整個遺傳算法最核心的部分。選擇實際上模擬生物遺傳進(jìn)化的優(yōu)勝劣汰,讓優(yōu)秀的個體盡可能存活,讓差的個體盡可能的淘汰。個體的好壞是取決于個體適應(yīng)度。個體適應(yīng)度越高,越容易被留下,個體適應(yīng)度越低越容易被淘汰。具體的代碼如下

# 0.0 coding:utf-8 0.0 
# 選擇 
import random 
def sum(fit_value): 
 total = 0 
 for i in range(len(fit_value)): 
  total += fit_value[i] 
 return total 
def cumsum(fit_value): 
 for i in range(len(fit_value)-2, -1, -1): 
  t = 0 
  j = 0 
  while(j <= i): 
   t += fit_value[j] 
   j += 1 
  fit_value[i] = t 
  fit_value[len(fit_value)-1] = 1 
def selection(pop, fit_value): 
 newfit_value = [] 
 # 適應(yīng)度總和 
 total_fit = sum(fit_value) 
 for i in range(len(fit_value)): 
  newfit_value.append(fit_value[i] / total_fit) 
 # 計算累計概率 
 cumsum(newfit_value) 
 ms = [] 
 pop_len = len(pop) 
 for i in range(pop_len): 
  ms.append(random.random()) 
 ms.sort() 
 fitin = 0 
 newin = 0 
 newpop = pop 
 # 轉(zhuǎn)輪盤選擇法 
 while newin < pop_len: 
  if(ms[newin] < newfit_value[fitin]): 
   newpop[newin] = pop[fitin] 
   newin = newin + 1 
  else: 
   fitin = fitin + 1 
 pop = newpop 

以上代碼主要進(jìn)行了3個操作,首先是計算個體適應(yīng)度總和,然后在計算各自的累積適應(yīng)度。這兩步都好理解,主要是第三步,轉(zhuǎn)輪盤選擇法。這一步首先是生成基因總數(shù)個0-1的小數(shù),然后分別和各個基因的累積個體適應(yīng)度進(jìn)行比較。如果累積個體適應(yīng)度大于隨機(jī)數(shù)則進(jìn)行保留,否則就淘汰。這一塊的核心思想在于:一個基因的個體適應(yīng)度越高,他所占據(jù)的累計適應(yīng)度空隙就越大,也就是說他越容易被保留下來。

選擇完后就是進(jìn)行交配和變異,這個兩個步驟很好理解。就是對基因序列進(jìn)行改變,只不過改變的方式不一樣

交配:

# 0.0 coding:utf-8 0.0 
# 交配 
import random 
def crossover(pop, pc): 
 pop_len = len(pop) 
 for i in range(pop_len - 1): 
  if(random.random() < pc): 
   cpoint = random.randint(0,len(pop[0])) 
   temp1 = [] 
   temp2 = [] 
   temp1.extend(pop[i][0:cpoint]) 
   temp1.extend(pop[i+1][cpoint:len(pop[i])]) 
   temp2.extend(pop[i+1][0:cpoint]) 
   temp2.extend(pop[i][cpoint:len(pop[i])]) 
   pop[i] = temp1 
   pop[i+1] = temp2 

變異:

# 0.0 coding:utf-8 0.0 
# 基因突變 
import random 
def mutation(pop, pm): 
 px = len(pop) 
 py = len(pop[0]) 
 for i in range(px): 
  if(random.random() < pm): 
   mpoint = random.randint(0, py-1) 
   if(pop[i][mpoint] == 1): 
    pop[i][mpoint] = 0 
   else: 
    pop[i][mpoint] = 1 

整個遺傳算法的實現(xiàn)完成了,總的調(diào)用入口代碼如下

# 0.0 coding:utf-8 0.0 
import matplotlib.pyplot as plt 
import math 
from calobjValue import calobjValue 
from calfitValue import calfitValue 
from selection import selection 
from crossover import crossover 
from mutation import mutation 
from best import best 
from geneEncoding import geneEncoding 
print 'y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x)' 
# 計算2進(jìn)制序列代表的數(shù)值 
def b2d(b, max_value, chrom_length): 
 t = 0 
 for j in range(len(b)): 
  t += b[j] * (math.pow(2, j)) 
 t = t * max_value / (math.pow(2, chrom_length) - 1) 
 return t 
pop_size = 500  # 種群數(shù)量 
max_value = 10  # 基因中允許出現(xiàn)的最大值 
chrom_length = 10  # 染色體長度 
pc = 0.6   # 交配概率 
pm = 0.01   # 變異概率 
results = [[]]  # 存儲每一代的最優(yōu)解,N個二元組 
fit_value = []  # 個體適應(yīng)度 
fit_mean = []  # 平均適應(yīng)度 
# pop = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1] for i in range(pop_size)] 
pop = geneEncoding(pop_size, chrom_length) 
for i in range(pop_size): 
 obj_value = calobjValue(pop, chrom_length, max_value)  # 個體評價 
 fit_value = calfitValue(obj_value)  # 淘汰 
 best_individual, best_fit = best(pop, fit_value)  # 第一個存儲最優(yōu)的解, 第二個存儲最優(yōu)基因 
 results.append([best_fit, b2d(best_individual, max_value, chrom_length)]) 
 selection(pop, fit_value)  # 新種群復(fù)制 
 crossover(pop, pc)  # 交配 
 mutation(pop, pm)  # 變異 
results = results[1:] 
results.sort() 
X = [] 
Y = [] 
for i in range(500): 
 X.append(i) 
 t = results[i][0] 
 Y.append(t) 
plt.plot(X, Y) 
plt.show() 

最后調(diào)用了一下matplotlib包,把500代最優(yōu)解的變化趨勢表現(xiàn)出來。

完整代碼可以在github 查看

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • appium測試之APP元素定位及基本工具介紹

    appium測試之APP元素定位及基本工具介紹

    看了我文章了相信都了解了web端的元素定位了,沒看的,既然進(jìn)來了那么肯定多多少少知道些,本文主要來介紹APP的元素定位有哪些定位方式,我們又怎么去連接APP,然后通過工具去獲取元素
    2021-09-09
  • Python 從一個文件中調(diào)用另一個文件的類方法

    Python 從一個文件中調(diào)用另一個文件的類方法

    今天小編就為大家分享一篇Python 從一個文件中調(diào)用另一個文件的類方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Django Form and ModelForm的區(qū)別與使用

    Django Form and ModelForm的區(qū)別與使用

    這篇文章主要介紹了Django Form and ModelForm的區(qū)別與使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • python讀取excel文件的方法

    python讀取excel文件的方法

    文章介紹了在Python中讀取Excel文件的兩種方法:使用pandas庫和使用openpyxl庫,pandas適合數(shù)據(jù)分析和處理,而openpyxl提供了更多的Excel文件操作功能,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • python taipy庫輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)為功能性Web應(yīng)用

    python taipy庫輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)為功能性Web應(yīng)用

    taipy 是一個開源的 Python 庫,任何具有基本 Python 技能的人都可以使用,對于數(shù)據(jù)科學(xué)家、機(jī)器學(xué)習(xí)工程師和 Python 程序員來說,它是一個方便的工具,借助 Taipy,你可以輕松地將數(shù)據(jù)和機(jī)器學(xué)習(xí)模型轉(zhuǎn)變?yōu)楣δ苄缘?nbsp;Web 應(yīng)用程序
    2024-01-01
  • Python常用模塊sys,os,time,random功能與用法實例分析

    Python常用模塊sys,os,time,random功能與用法實例分析

    這篇文章主要介紹了Python常用模塊sys,os,time,random功能與用法,結(jié)合實例形式分析了Python模塊sys,os,time,random功能、原理、相關(guān)模塊函數(shù)、使用技巧與操作注意事項,需要的朋友可以參考下
    2020-01-01
  • 關(guān)于Keras Dense層整理

    關(guān)于Keras Dense層整理

    這篇文章主要介紹了關(guān)于Keras Dense層整理,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • django中的auth模塊與admin后臺管理方法

    django中的auth模塊與admin后臺管理方法

    這篇文章主要介紹了django中的auth模塊與admin后臺管理方法,包括auth模塊的常用方法及如何擴(kuò)展auth_user表,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 利用Python查看微信共同好友功能的實現(xiàn)代碼

    利用Python查看微信共同好友功能的實現(xiàn)代碼

    這篇文章主要介紹了利用Python查看微信共同好友功能的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • 徹底理解Python list切片原理

    徹底理解Python list切片原理

    本篇文章主要介紹了Python list切片原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

库尔勒市| 普兰店市| 滦平县| 丹棱县| 广饶县| 榆中县| 洪湖市| 庆城县| 昂仁县| 平利县| 孝义市| 池州市| 福建省| 那曲县| 盘山县| 江安县| 德清县| 邢台县| 翼城县| 唐海县| 商水县| 无棣县| 枞阳县| 沧州市| 杂多县| 南昌县| 宁阳县| 德清县| 平阳县| 镇平县| 克拉玛依市| 龙岩市| 运城市| 当阳市| 通海县| 泸州市| 合川市| 太白县| 大田县| 青神县| 疏附县|