91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Python中怎么實現一個遺傳算法框架

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

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

算法特點

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

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

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

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

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

算法流程

Python中怎么實現一個遺傳算法框架

gaft 設計原則

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

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

GAFT文件結構

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

.  ├── 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中定義了內置的個體和種群類型,提供了兩種不同的遺傳編碼方式:二進制編碼和實數編碼。

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

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

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

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

使用GAFT

下面我就以兩個函數作為例子來使用GAFT對目標函數進行優化.

一維搜索

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

1. 先導入需要的模塊

from math import sin, cos     # 導入種群和內置算子相關類  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     # 內置的存檔適應度函數的分析類  from gaft.analysis.fitness_store import FitnessStoreAnalysis     # 我們將用兩種方式將分析插件注冊到遺傳算法引擎中

2. 創建引擎

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

3. 自定義適應度函數

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

@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, 開始跑(優化)吧!

我們這里跑100代種群.

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

內置的分析插件會在每步迭代中記錄得到的每一代的***個體,并生成數據保存。

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

Python中怎么實現一個遺傳算法框架

優化過程動畫:

Python中怎么實現一個遺傳算法框架

二維搜索

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

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

'''  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中怎么實現一個遺傳算法框架

二維函數面:

Python中怎么實現一個遺傳算法框架

搜索過程動畫:

Python中怎么實現一個遺傳算法框架

以上就是Python中怎么實現一個遺傳算法框架,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

旺苍县| 长兴县| 三河市| 额尔古纳市| 响水县| 涟源市| 无棣县| 高阳县| 峡江县| 剑川县| 调兵山市| 万盛区| 墨脱县| 丰县| 东乌| 尚义县| 克山县| 镶黄旗| 勃利县| 二连浩特市| 德清县| 家居| 云龙县| 盐津县| 齐河县| 乐清市| 阿坝| 芦溪县| 张掖市| 甘洛县| 来安县| 眉山市| 阳高县| 阿合奇县| 中牟县| 阿瓦提县| 蓝山县| 太白县| 正蓝旗| 石楼县| 绍兴市|