溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中怎么實現(xiàn)一個遺傳算法框架

發(fā)布時間:2021-07-10 16:00:13 來源:億速云 閱讀:323 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Python中怎么實現(xiàn)一個遺傳算法框架,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

算法特點

  1. 以決策變量的編碼作為運算對象,使得優(yōu)化過程借鑒生物學中的概念成為可能

  2. 直接以目標函數(shù)作為搜索信息,確定搜索方向很范圍,屬于無導數(shù)優(yōu)化

  3. 同時使用多個搜索點的搜索信息,算是一種隱含的并行性

  4. 是一種基于概率的搜索技術

  5. 具有自組織,自適應和自學習等特性

算法流程

Python中怎么實現(xiàn)一個遺傳算法框架

gaft 設計原則

由于遺傳算法的流程相對固定,我們優(yōu)化算法基本上也是在流程整體框架下對編碼機制,算子,參數(shù)等進行修改,因此在寫框架的時候,我便想把那些固定的遺傳算子,適應度函數(shù)寫成接口,并使用元類、裝飾器等方式實現(xiàn)對接口的限制和優(yōu)化,這樣便可以方便后續(xù)自定義算符和適應度函數(shù)定制。***將各個部分組合到一起組成一個engine然后根據(jù)算法流程運行遺傳算法對目標進行優(yōu)化.

這樣我們便脫離每次都要寫遺傳算法流程的繁瑣,每次只需要像寫插件一樣實現(xiàn)自己的算子和適應度函數(shù)便可以將其放入gaft開始對算法進行測試或者對目標函數(shù)進行優(yōu)化了。

GAFT文件結構

此部分我對自己實現(xiàn)的框架的整體結構進行下介紹.

.  ├── LICENSE  ├── MANIFEST.in  ├── README.rst  ├── examples  │ ├── ex01  │ └── ex02  ├── gaft  │ ├── __init__.py  │ ├── __pycache__  │ ├── analysis  │ ├── components  │ ├── engine.py  │ ├── operators  │ └── plugin_interfaces  ├── setup.cfg  ├── setup.py  └── tests  ├── flip_bit_mutation_test.py  ├── gaft_test.py  ├── individual_test.py  ├── population_test.py  ├── roulette_wheel_selection_test.py  └── uniform_crossover_test.py

目前的文件結果如上所示,

  • /gaft/components中定義了內(nèi)置的個體和種群類型,提供了兩種不同的遺傳編碼方式:二進制編碼和實數(shù)編碼。

  • /gaft/plugin_interfaces中是插件接口定義,所有的算子定義以及on-the-fly分析的接口規(guī)則都在里面,使用者可以根據(jù)此來編寫自己的插件并放入到engine中。

  • /gaft/operators里面是內(nèi)置遺傳算子,他們也是遵循/gaft/plugin_interfaces中的規(guī)則進行編寫,可以作為編寫算子的例子。其中算子我目前內(nèi)置了roulette  wheel選擇算子,uniform 交叉算子和flipbit變異算子,使用者可以直接使用內(nèi)置算子來使用gaft對自己的問題進行優(yōu)化。

  • /gaft/analysis里面是內(nèi)置的on-the-fly分析插件,他可以在遺傳算法迭代的過程中對迭代過程中的變量進行分析,例如我在里面內(nèi)置了控制臺日志信息輸出,以及迭代適應度值的保存等插件方便對進化曲線作圖。

  • /gaft/engine便是遺傳算法的流程控制模塊了,他將所有的之前定義的各個部分組合到一起使用遺傳算法流程進行優(yōu)化迭代。

使用GAFT

下面我就以兩個函數(shù)作為例子來使用GAFT對目標函數(shù)進行優(yōu)化.

一維搜索

首先我們先對一個簡單的具有多個局部極值的函數(shù)進行優(yōu)化,我們來使用內(nèi)置的算子求函數(shù)  f(x)=x+10sin(5x)+7cos(4x)的極大值,x的取值范圍為[0,10]

1. 先導入需要的模塊

from math import sin, cos     # 導入種群和內(nèi)置算子相關類  from gaft import GAEngine  from gaft.components import GAIndividual  from gaft.components import GAPopulation  from gaft.operators import RouletteWheelSelection  from gaft.operators import UniformCrossover  from gaft.operators import FlipBitMutation     # 用于編寫分析插件的接口類  from gaft.plugin_interfaces.analysis import OnTheFlyAnalysis     # 內(nèi)置的存檔適應度函數(shù)的分析類  from gaft.analysis.fitness_store import FitnessStoreAnalysis     # 我們將用兩種方式將分析插件注冊到遺傳算法引擎中

2. 創(chuàng)建引擎

# 定義種群  indv_template = GAIndividual(ranges=[(0, 10)], encoding='binary', eps=0.001)  population = GAPopulation(indv_template=indv_template, size=50)     # 創(chuàng)建遺傳算子  selection = RouletteWheelSelection()  crossover = UniformCrossover(pc=0.8, pe=0.5)  mutation = FlipBitMutation(pm=0.1)     # 創(chuàng)建遺傳算法引擎, 分析插件和適應度函數(shù)可以以參數(shù)的形式傳入引擎中  engine = GAEngine(population=population, selection=selection,                    crossover=crossover, mutation=mutation,                    analysis=[FitnessStoreAnalysis])

3. 自定義適應度函數(shù)

可以通過修飾符的方式將,適應度函數(shù)注冊到引擎中。

@engine.fitness_register  def fitness(indv):      x, = indv.variants      return x + 10*sin(5*x) + 7*cos(4*x)

4. 自定義on-the-fly分析插件

也可以通過修飾符在定義的時候直接將插件注冊到引擎中

@engine.analysis_register  class ConsoleOutputAnalysis(OnTheFlyAnalysis):      interval = 1         def register_step(self, ng, population, engine):          best_indv = population.best_indv(engine.fitness)          msg = 'Generation: {}, best fitness: {:.3f}'.format(ng, engine.fitness(best_indv))          engine.logger.info(msg)         def finalize(self, population, engine):          best_indv = population.best_indv(engine.fitness)          x = best_indv.variants          y = engine.fitness(best_indv)          msg = 'Optimal solution: ({}, {})'.format(x, y)          engine.logger.info(msg)

5. Ok, 開始跑(優(yōu)化)吧!

我們這里跑100代種群.

if '__main__' == __name__:      # Run the GA engine.      engine.run(ng=100)

內(nèi)置的分析插件會在每步迭代中記錄得到的每一代的***個體,并生成數(shù)據(jù)保存。

繪制一下函數(shù)本身的曲線和我們使用遺傳算法得到的進化曲線:

Python中怎么實現(xiàn)一個遺傳算法框架

優(yōu)化過程動畫:

Python中怎么實現(xiàn)一個遺傳算法框架

二維搜索

下面我們使用GAFT內(nèi)置算子來搜索同樣具有多個極值點的二元函數(shù)f(x)=ysin(2πx)+xcos(2πy) 的***值,x, y 的范圍為 [−2,2]  .

這里我們就不自定義分析插件了,直接使用內(nèi)置的分析類,并在構造引擎時直接傳入.

'''  Find the global maximum for binary function: f(x) = y*sim(2*pi*x) + x*cos(2*pi*y)  '''     from math import sin, cos, pi     from gaft import GAEngine  from gaft.components import GAIndividual  from gaft.components import GAPopulation  from gaft.operators import RouletteWheelSelection  from gaft.operators import UniformCrossover  from gaft.operators import FlipBitMutation     # Built-in best fitness analysis.  from gaft.analysis.fitness_store import FitnessStoreAnalysis  from gaft.analysis.console_output import ConsoleOutputAnalysis     # Define population.  indv_template = GAIndividual(ranges=[(-2, 2), (-2, 2)], encoding='binary', eps=0.001)  population = GAPopulation(indv_template=indv_template, size=50)     # Create genetic operators.  selection = RouletteWheelSelection()  crossover = UniformCrossover(pc=0.8, pe=0.5)  mutation = FlipBitMutation(pm=0.1)     # Create genetic algorithm engine.  # Here we pass all built-in analysis to engine constructor.  engine = GAEngine(population=population, selection=selection,                    crossover=crossover, mutation=mutation,                    analysis=[ConsoleOutputAnalysis, FitnessStoreAnalysis])     # Define fitness function.  @engine.fitness_register  def fitness(indv):      x, y = indv.variants      return y*sin(2*pi*x) + x*cos(2*pi*y)     if '__main__' == __name__:      engine.run(ng=100)

進化曲線:

Python中怎么實現(xiàn)一個遺傳算法框架

二維函數(shù)面:

Python中怎么實現(xiàn)一個遺傳算法框架

搜索過程動畫:

Python中怎么實現(xiàn)一個遺傳算法框架

以上就是Python中怎么實現(xiàn)一個遺傳算法框架,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI