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

遺傳算法之Python實現(xiàn)代碼

 更新時間:2017年10月10日 10:27:59   作者:老梁家的風(fēng)子  
本篇文章主要介紹了Python 遺傳算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

寫在前面

之前的文章中已經(jīng)講過了遺傳算法的基本流程,并且用MATLAB實現(xiàn)過一遍了。這一篇文章主要面對的人群是看過了我之前的文章,因此我就不再贅述遺傳算法是什么以及基本的內(nèi)容了,假設(shè)大家已經(jīng)知道我是怎么寫遺傳算法的了。

Python的遺傳算法主函數(shù)

我的思想是,創(chuàng)建一個染色體的類,其中包括了兩個變量:染色體chrom與適應(yīng)度fitness。因此我們就可以通過直接建立對象來作為種群中的個體。

#染色體的類
class Chrom:
  chrom = []
  fitness = 0
  def showChrom(self):
    print(self.chrom)
  def showFitness(self):
    print(self.fitness)

所以我們開始設(shè)置基礎(chǔ)參數(shù)。其中種群的表達方式我用的是字典,也就是用一個字典來保存種群內(nèi)的所有個體,這個也是我想出來的創(chuàng)建多個對象的方法。

將字典的索引為個體的標(biāo)號,如:chrom1, chrom2等。字典索引的值就是一個對象。這個對象擁有兩個屬性,就是染色體與適應(yīng)度。

其實在這一方便來說,我覺得在思路上是優(yōu)于利用MATLAB的矩陣式編程的。因為這樣可以很直觀的將個體與個體的屬性這一種思想給表達出來,相比一堆矩陣來說,在邏輯上比較容易接受。

#基礎(chǔ)參數(shù)
N = 200 #種群內(nèi)個體數(shù)目
mut = 0.2 #突變概率
acr = 0.2 #交叉概率

pop = {} #存儲染色體的字典
for i in range(N):
  pop['chrom'+str(i)] = Chrom()
chromNodes = 2 #染色體節(jié)點數(shù)(變量個數(shù))
iterNum = 10000 #迭代次數(shù)
chromRange = [[0, 10], [0, 10]] #染色體范圍
aveFitnessList = [] #平均適應(yīng)度
bestFitnessList = [] #最優(yōu)適應(yīng)度

之后就是初始染色體了,其中就牽扯到了各種用來初始化種群、計算適應(yīng)度、找最優(yōu)等函數(shù),我在這里分出了兩個文件,分別為Genetic.py與Fitness.py。

Genetic.py里面有八個函數(shù),主要包含了作用于種群或者染色體操作的函數(shù),分別為:

  1. findBest函數(shù),用于尋找種群中的最優(yōu)染色體;
  2. findworse函數(shù),用于尋找種群中的最劣染色體;
  3. initialize函數(shù),用于初始化種群;
  4. calAveFitness函數(shù),用于計算種群的平均適應(yīng)度;
  5. mutChrom函數(shù),用于對染色體進行變異;
  6. inRange函數(shù),用于判斷染色體節(jié)點值是否越界;
  7. acrChrom函數(shù),用于對染色體進行交叉;
  8. compareChrom函數(shù),用于比較兩個染色體孰優(yōu)孰劣。

Fitness.py里面有兩個函數(shù),主要包含了對適應(yīng)度操作的函數(shù),分別為:

  1. calFitness函數(shù),用來迭代每一個個體,并計算適應(yīng)度(利用funcFitness函數(shù)計算);
  2. funcFitness函數(shù),計算單個個體的適應(yīng)度。

因此可以列出初始化代碼為

#初始染色體
pop = Genetic.initialize(pop, chromNodes, chromRange)
pop = Fitness.calFitness(pop) #計算適應(yīng)度
bestChrom = Genetic.findBest(pop) #尋找最優(yōu)染色體
bestFitnessList.append(bestChrom[1]) #將當(dāng)前最優(yōu)適應(yīng)度壓入列表中
aveFitnessList.append(Genetic.calAveFitness(pop, N)) #計算并存儲平均適應(yīng)度

迭代過程的思路和邏輯與MATLAB無異

#開始迭代
for t in range(iterNum):
  #染色體突變
  pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange)
  #染色體交換
  pop = Genetic.acrChrom(pop, acr, chromNodes)
  #尋找最優(yōu)
  nowBestChrom = Genetic.findBest(pop)
  #比較前一個時間的最優(yōu)和現(xiàn)在的最優(yōu)
  bestChrom = Genetic.compareChrom(nowBestChrom, bestChrom)
  #尋找與替換最劣
  worseChrom = Genetic.findWorse(pop)
  pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy()
  pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness
  #存儲最優(yōu)與平均
  bestFitnessList.append(bestChrom[1])
  aveFitnessList.append(Genetic.calAveFitness(pop, N))

最后再做一下迭代的的圖像

plt.figure(1)
plt.plot(x, aveFitnessList)
plt.plot(x, bestFitnessList)
plt.show()

最后再在最前面加上各種庫和文件就可以運行了。

import Genetic
import Fitness
import matplotlib.pyplot as plt
import numpy as np

感悟

可以說最主要的感悟就是染色體這一個類。其實那個Genetic.py與Fitness.py這兩個文件也可以直接包裝成類,但是這樣一來我就嫌主文件太臃腫,在其他里面再包裝成類又多此一舉,畢竟這只是一個小程序,所以我就這樣寫了。

深刻感悟到了面向?qū)ο缶幊痰膬?yōu)點,在編程邏輯的處理上真是一種享受,只需要思考對象的屬性即可,省去了許多復(fù)雜的思考。

另一個感悟就是創(chuàng)建多個對象時,利用字典的方法來創(chuàng)建對象。當(dāng)初我也是困惑怎么建立一個類似于C++中的對象數(shù)組,上網(wǎng)查找了各種方法,結(jié)果都避而不談(當(dāng)然,也可能是我搜索能力太差沒找到),所以經(jīng)過嘗試中遇到到了這種方法。

等有空我再詳細(xì)說一下這個方法吧,這一次就先到這里。

剩余的函數(shù)補充

首先是Genetic.py里面的八個函數(shù)

import random

#尋找最優(yōu)染色體
def findBest(pop):
  best = ['1', 0.0000001]
  for i in pop:
    if best[1] < pop[i].fitness:
      best = [i, pop[i].fitness]
  return best

#尋找最劣染色體
def findWorse(pop):
  worse = ['1', 999999]
  for i in pop:
    if worse[1] > pop[i].fitness:
      worse = [i, pop[i].fitness]
  return worse

#賦初始值
def initialize(pop, chromNodes, chromRange):
  for i in pop:
    chromList = []
    for j in range(chromNodes):
      chromList.append(random.uniform(chromRange[j][0], chromRange[j][1]+1))
    pop[i].chrom = chromList.copy()
  return pop

#計算平均適應(yīng)度
def calAveFitness(pop, N):
  sumFitness = 0
  for i in pop:
    sumFitness = sumFitness + pop[i].fitness
  aveFitness = sumFitness / N
  return aveFitness

#進行突變
def mutChrom(pop, mut, chromNodes, bestChrom, chromRange):
  for i in pop:
    #如果隨機數(shù)小于變異概率(即可以變異)
    if mut > random.random():
      mutNode = random.randrange(0,chromNodes)
      mutRange = random.random() * (1-pop[i].fitness/bestChrom[1])**2
      pop[i].chrom[mutNode] = pop[i].chrom[mutNode] * (1+mutRange)
      #判斷變異后的范圍是否在要求范圍內(nèi)
      pop[i].chrom[mutNode] = inRange(pop[i].chrom[mutNode], chromRange[mutNode])
  return pop

#檢驗便宜范圍是否在要求范圍內(nèi)
def inRange(mutNode, chromRange):
  if chromRange[0] < mutNode < chromRange[1]:
    return mutNode
  elif mutNode-chromRange[0] > mutNode-chromRange[1]:
    return chromRange[1]
  else:
    return chromRange[0]

#進行交叉
def acrChrom(pop, acr, chromNodes):
  for i in pop:
    for j in pop:
      if acr > random.random():
        acrNode = random.randrange(0, chromNodes)
        #兩個染色體節(jié)點進行交換
        pop[i].chrom[acrNode], pop[j].chrom[acrNode] = pop[j].chrom[acrNode], pop[i].chrom[acrNode]
  return pop

#進行比較
def compareChrom(nowbestChrom, bestChrom):
  if bestChrom[1] > nowbestChrom[1]:
    return bestChrom
  else:
    return nowbestChrom

然后是Fitness.py的兩個函數(shù)

import math

def calFitness(pop):
  
  for i in pop:
    #計算每個染色體的適應(yīng)度
    pop[i].fitness = funcFitness(pop[i].chrom)

  return pop

def funcFitness(chrom):
  #適應(yīng)度函數(shù)
  fitness = math.sin(chrom[0])+math.cos(chrom[1])+0.1*(chrom[0]+chrom[1])

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

相關(guān)文章

  • 再也不用花錢買漫畫!Python爬取某漫畫的腳本及源碼

    再也不用花錢買漫畫!Python爬取某漫畫的腳本及源碼

    今天帶大家學(xué)習(xí)Python的相關(guān)知識,文章圍繞著怎么用Python下載漫畫展開,文中有非常詳細(xì)的代碼示例及介紹,需要的朋友可以參考下
    2021-06-06
  • python實現(xiàn)比較兩段文本不同之處的方法

    python實現(xiàn)比較兩段文本不同之處的方法

    這篇文章主要介紹了python實現(xiàn)比較兩段文本不同之處的方法,涉及Python針對文本與字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • Python三元表達式的基本用法詳解

    Python三元表達式的基本用法詳解

    Python的三元表達式是一種緊湊、簡潔的條件表達式,允許在一行代碼中根據(jù)條件選擇不同的值,三元表達式通常用于需要在單行中根據(jù)條件進行值選擇的情況,有助于提高代碼的可讀性和簡潔性,本文給大家介紹了Python三元表達式的基本用法,需要的朋友可以參考下
    2023-10-10
  • python性能測量工具cProfile使用解析

    python性能測量工具cProfile使用解析

    這篇文章主要介紹了python性能測量工具cProfile使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 分享2個方便調(diào)試Python代碼的實用工具

    分享2個方便調(diào)試Python代碼的實用工具

    這篇文章主要介紹了分享方便調(diào)試Python代碼的2個實用工具,可以方便展示我們調(diào)試代碼的中間狀態(tài),提升大家的編碼效率,詳細(xì)的介紹需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-05-05
  • 通過實例解析Python RPC實現(xiàn)原理及方法

    通過實例解析Python RPC實現(xiàn)原理及方法

    這篇文章主要介紹了通過實例解析Python RPC實現(xiàn)原理及方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 你知道嗎實現(xiàn)炫酷可視化只要1行python代碼

    你知道嗎實現(xiàn)炫酷可視化只要1行python代碼

    這篇文章主要給大家介紹了關(guān)于利用Python進行數(shù)據(jù)可視化常見的9種方法!文中介紹的方法真的超實用!對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • pytorch fine-tune 預(yù)訓(xùn)練的模型操作

    pytorch fine-tune 預(yù)訓(xùn)練的模型操作

    這篇文章主要介紹了pytorch fine-tune 預(yù)訓(xùn)練的模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python中的if、else、elif語句用法簡明講解

    Python中的if、else、elif語句用法簡明講解

    這篇文章主要介紹了Python中的if、else、elif語句的用法講解,條件判斷語句是程序中流程控制的基礎(chǔ)辦法之一,需要的朋友可以參考下
    2016-03-03
  • Python?內(nèi)置logging?使用詳細(xì)介紹

    Python?內(nèi)置logging?使用詳細(xì)介紹

    提供日志記錄的接口和眾多處理模塊,供用戶存儲各種格式的日志,幫助調(diào)試程序或者記錄程序運行過程中的輸出信息,這篇文章主要介紹了Python?內(nèi)置logging?使用講解,需要的朋友可以參考下
    2022-07-07

最新評論

隆化县| 台北市| 汕头市| 杭州市| 新津县| 阳城县| 承德市| 抚宁县| 大丰市| 惠来县| 弥勒县| 大关县| 高要市| 寿宁县| 福清市| 江源县| 宁海县| 应用必备| 义马市| 都昌县| 资溪县| 石楼县| 黔东| 清远市| 凤凰县| 曲阜市| 旌德县| 寿阳县| 佛山市| 蕲春县| 北票市| 和平县| 育儿| 城口县| 灌南县| 大兴区| 万宁市| 宽城| 商河县| 福泉市| 嵊泗县|