成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

GAFT:一個使用Python實現的遺傳算法框架

開發 后端 算法
對于遺傳算法來說,就非常適合寫個相對固定的框架然后給算子、參數等留出空間以便對新算法進行測試和改進。于是就動手寫了個遺傳算法的小框架gaft,本文對此框架進行一些介紹并分別以一個一維搜索和二維搜索為例子對使用方法進行了介紹。

前言

最近需要用到遺傳算法來優化一些東西,最初是打算直接基于某些算法實現一個簡單的函數來優化,但是感覺單純寫個非通用的函數運行后期改進算子或者別人使用起來都會帶來困難,同時遺傳算法基本概念和運行流程相對固定,改進也一般通過編碼機制,選擇策略,交叉變異算子以及參數設計等方面,對于算法的整體結構并沒有大的影響。這樣對于遺傳算法來說,就非常適合寫個相對固定的框架然后給算子、參數等留出空間以便對新算法進行測試和改進。于是就動手寫了個遺傳算法的小框架gaft,本文對此框架進行一些介紹并分別以一個一維搜索和二維搜索為例子對使用方法進行了介紹。

  • GitHub: https://github.com/PytLab/gaft
  • PyPI: https://pypi.python.org/pypi/gaft

目前框架只是完成了最初的版本,比較簡陋,內置了幾個基本的常用算子,使用者可以根據接口規則實現自定義的算子并放入框架中運行。我自己也會根據自己的需求后續添加更多的改進算子,同時改進框架使其更加通用.

 

正文

遺傳算法介紹

這里我對遺傳算法的基本概念進行簡要的介紹,并闡述gaft的設計原則。

簡單而言,遺傳算法使用群體搜索技術,將種群代表一組問題的可行解,通過對當前種群施加選擇,交叉,變異等一些列遺傳操作來產生新一代的種群,并逐步是種群進化到包含近似全局***解的狀態。下面我將遺傳學和遺傳算法相關術語的對應關系總結一下:

術語 

 

算法特點

  1. 以決策變量的編碼作為運算對象,使得優化過程借鑒生物學中的概念成為可能
  2. 直接以目標函數作為搜索信息,確定搜索方向很范圍,屬于無導數優化
  3. 同時使用多個搜索點的搜索信息,算是一種隱含的并行性
  4. 是一種基于概率的搜索技術
  5. 具有自組織,自適應和自學習等特性

算法流程

 

gaft 設計原則

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

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

GAFT文件結構

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

  1.  
  2. ├── LICENSE 
  3.  
  4. ├── MANIFEST.in 
  5.  
  6. ├── README.rst 
  7.  
  8. ├── examples 
  9.  
  10. │ ├── ex01 
  11.  
  12. │ └── ex02 
  13.  
  14. ├── gaft 
  15.  
  16. │ ├── __init__.py 
  17.  
  18. │ ├── __pycache__ 
  19.  
  20. │ ├── analysis 
  21.  
  22. │ ├── components 
  23.  
  24. │ ├── engine.py 
  25.  
  26. │ ├── operators 
  27.  
  28. │ └── plugin_interfaces 
  29.  
  30. ├── setup.cfg 
  31.  
  32. ├── setup.py 
  33.  
  34. └── tests 
  35.  
  36. ├── flip_bit_mutation_test.py 
  37.  
  38. ├── gaft_test.py 
  39.  
  40. ├── individual_test.py 
  41.  
  42. ├── population_test.py 
  43.  
  44. ├── roulette_wheel_selection_test.py 
  45.  
  46. └── 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. 先導入需要的模塊

  1. from math import sin, cos 
  2.  
  3.   
  4.  
  5. # 導入種群和內置算子相關類 
  6.  
  7. from gaft import GAEngine 
  8.  
  9. from gaft.components import GAIndividual 
  10.  
  11. from gaft.components import GAPopulation 
  12.  
  13. from gaft.operators import RouletteWheelSelection 
  14.  
  15. from gaft.operators import UniformCrossover 
  16.  
  17. from gaft.operators import FlipBitMutation 
  18.  
  19.   
  20.  
  21. # 用于編寫分析插件的接口類 
  22.  
  23. from gaft.plugin_interfaces.analysis import OnTheFlyAnalysis 
  24.  
  25.   
  26.  
  27. # 內置的存檔適應度函數的分析類 
  28.  
  29. from gaft.analysis.fitness_store import FitnessStoreAnalysis 
  30.  
  31.   
  32.  
  33. # 我們將用兩種方式將分析插件注冊到遺傳算法引擎中  

2. 創建引擎

  1. # 定義種群 
  2.  
  3. indv_template = GAIndividual(ranges=[(0, 10)], encoding='binary', eps=0.001) 
  4.  
  5. population = GAPopulation(indv_template=indv_template, size=50) 
  6.  
  7.   
  8.  
  9. # 創建遺傳算子 
  10.  
  11. selection = RouletteWheelSelection() 
  12.  
  13. crossover = UniformCrossover(pc=0.8, pe=0.5) 
  14.  
  15. mutation = FlipBitMutation(pm=0.1) 
  16.  
  17.   
  18.  
  19. # 創建遺傳算法引擎, 分析插件和適應度函數可以以參數的形式傳入引擎中 
  20.  
  21. engine = GAEngine(population=population, selection=selection, 
  22.  
  23.                   crossover=crossover, mutation=mutation, 
  24.  
  25.                   analysis=[FitnessStoreAnalysis])  

3. 自定義適應度函數

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

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

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

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

  1. @engine.analysis_register 
  2.  
  3. class ConsoleOutputAnalysis(OnTheFlyAnalysis): 
  4.  
  5.     interval = 1 
  6.  
  7.   
  8.  
  9.     def register_step(self, ng, population, engine): 
  10.  
  11.         best_indv = population.best_indv(engine.fitness) 
  12.  
  13.         msg = 'Generation: {}, best fitness: {:.3f}'.format(ng, engine.fitness(best_indv)) 
  14.  
  15.         engine.logger.info(msg) 
  16.  
  17.   
  18.  
  19.     def finalize(self, population, engine): 
  20.  
  21.         best_indv = population.best_indv(engine.fitness) 
  22.  
  23.         x = best_indv.variants 
  24.  
  25.         y = engine.fitness(best_indv) 
  26.  
  27.         msg = 'Optimal solution: ({}, {})'.format(x, y) 
  28.  
  29.         engine.logger.info(msg)  

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

我們這里跑100代種群.

  1. if '__main__' == __name__: 
  2.  
  3.     # Run the GA engine. 
  4.  
  5.     engine.run(ng=100)  

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

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

 

優化過程動畫:

 

二維搜索

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

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

  1. ''
  2.  
  3. Find the global maximum for binary function: f(x) = y*sim(2*pi*x) + x*cos(2*pi*y) 
  4.  
  5. ''
  6.  
  7.   
  8.  
  9. from math import sin, cos, pi 
  10.  
  11.   
  12.  
  13. from gaft import GAEngine 
  14.  
  15. from gaft.components import GAIndividual 
  16.  
  17. from gaft.components import GAPopulation 
  18.  
  19. from gaft.operators import RouletteWheelSelection 
  20.  
  21. from gaft.operators import UniformCrossover 
  22.  
  23. from gaft.operators import FlipBitMutation 
  24.  
  25.   
  26.  
  27. # Built-in best fitness analysis. 
  28.  
  29. from gaft.analysis.fitness_store import FitnessStoreAnalysis 
  30.  
  31. from gaft.analysis.console_output import ConsoleOutputAnalysis 
  32.  
  33.   
  34.  
  35. # Define population. 
  36.  
  37. indv_template = GAIndividual(ranges=[(-2, 2), (-2, 2)], encoding='binary', eps=0.001) 
  38.  
  39. population = GAPopulation(indv_template=indv_template, size=50) 
  40.  
  41.   
  42.  
  43. Create genetic operators. 
  44.  
  45. selection = RouletteWheelSelection() 
  46.  
  47. crossover = UniformCrossover(pc=0.8, pe=0.5) 
  48.  
  49. mutation = FlipBitMutation(pm=0.1) 
  50.  
  51.   
  52.  
  53. Create genetic algorithm engine. 
  54.  
  55. # Here we pass all built-in analysis to engine constructor. 
  56.  
  57. engine = GAEngine(population=population, selection=selection, 
  58.  
  59.                   crossover=crossover, mutation=mutation, 
  60.  
  61.                   analysis=[ConsoleOutputAnalysis, FitnessStoreAnalysis]) 
  62.  
  63.   
  64.  
  65. # Define fitness function
  66.  
  67. @engine.fitness_register 
  68.  
  69. def fitness(indv): 
  70.  
  71.     x, y = indv.variants 
  72.  
  73.     return y*sin(2*pi*x) + x*cos(2*pi*y) 
  74.  
  75.   
  76.  
  77. if '__main__' == __name__: 
  78.  
  79.     engine.run(ng=100)  

進化曲線:

 

二維函數面: 

 

搜索過程動畫:

 

可見目前內置的基本算子都能很好的找到例子中函數的***點。

總結

本文主要介紹了本人開發的一個用于遺傳算法做優化計算的Python框架,框架內置了遺傳算法中常用的組件,包括不同編碼方式的個體,種群,以及遺傳算子等。同時框架還提供了自定義遺傳算子和分析插件的接口,能夠方便快速搭建遺傳算法流程并用于算法測試。

目前框架僅僅處于初步階段,后續會在自己使用的過程中逐步完善更多的內置算子,是框架更加通用。本文中的兩個優化例子均能在GitHub上找到源碼(https://github.com/PytLab/gaft/tree/master/examples)

目前的計劃:1. 添加更多的內置算子; 2. 給內置算子和組件添加C++ backend; 3. 并行化

參考

  • 《智能優化算法及其MATLAB實例》
  • 《MATLAB***化計算》 
責任編輯:龐桂玉 來源: Python開發者
相關推薦

2017-10-17 14:25:56

機器學習算法優化

2025-01-16 07:10:00

2024-09-12 10:06:21

2017-11-16 15:25:54

Go語言算法代碼

2024-07-03 08:00:00

2017-08-21 10:00:23

遺傳算法Python生物學

2020-06-11 08:32:50

Python遺傳算法代碼

2021-03-16 11:30:33

2017-09-22 15:03:08

Python遺傳算法GAFT框架

2021-03-10 15:49:20

人工智能遺傳算法

2017-07-12 14:23:25

遺傳算法java自然選擇

2020-10-26 13:42:28

Python算法垃圾

2025-06-19 02:11:00

2009-08-14 09:41:03

C#遺傳算法

2014-11-28 16:08:33

射頻識別RFID

2020-08-07 10:40:56

Node.jsexpress前端

2009-07-22 17:15:04

C#實現

2020-08-17 08:20:16

iOSAOP框架

2010-05-11 11:00:44

遺傳算法宋詞

2018-09-08 08:41:21

Python 3API框架API Star
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文一区二区 | 日韩免费视频 | 韩日在线 | 新超碰97| 欧美日日 | 97精品国产手机 | 最近最新中文字幕 | 91影院 | 91在线视频一区 | 凹凸日日摸日日碰夜夜 | 国产日韩一区二区三区 | 日本黄色高清视频 | 青青伊人久久 | 国产亚洲一区二区三区 | 日本福利在线观看 | 日韩中出| 日日干夜夜操 | 先锋影音资源网站 | 一区二区精品电影 | av网站免费在线观看 | 成人深夜小视频 | 一区二区三区四区不卡视频 | 日本久久黄色 | 精品在线观看一区二区 | 国产 日韩 欧美 中文 在线播放 | 久久久久国产 | 在线91 | 精品一区二区三区免费视频 | 午夜激情小视频 | 999观看免费高清www | 亚洲一区二区三区福利 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 亚洲精美视频 | 久久亚洲精品久久国产一区二区 | 超碰97人人人人人蜜桃 | 欧美激情精品久久久久 | 亚洲精品美女在线观看 | 国产精品永久久久久久久www | 午夜影视免费片在线观看 | 日韩中文一区二区三区 | 久久夜视频 |