遺傳算法初級

遺傳算法是一種基于仿生學的計算機算法,通過模擬自然進化和優勝劣汰法則來搜索問題的最優解(我會說這其實就是稍微改良了一下的暴搜?)

它是由美國的J.Holland于1975年提出來的玄學概率學混合暴力搜索方法,廣泛適用于尋找算法優解、機器學習、人工生命、自適應自學習算法等等各種領域。

但是要知道,這個玄學的算法在用于尋找算法最優解時有一些限制:該算法最好是不能直接用公式套出最優解的算法。

such as luoguP1018的乘積最大,雖然理論上你可以用遺傳來做,但明顯這道題用動歸就能算出來好不好。。。

像經濟預測這類的,根本沒有一種算法能夠算出最優解(完全符合實際的趨勢)的問題,遺傳算法的極大優勢才會凸顯出來

OK現在來講講遺傳算法是什么

讓我們想像有一群山羊,每個山羊跑步的能力不同,有的跑的快,有的跑的慢。這其實就是一個種群。

比如說這群山羊有100只

1 struct goat{
2     int speed;
3 int dna; 4 }f[101];

至于dna是什么待會再說。

山羊每年都會繁殖,且假定每年種群中增加的新生兒都是10個。這樣這個種群就會以一個一次函數的形式增長好吧我只是順便溫習前幾天學的高中生物

但不幸的是,這群神奇的山羊生活的地方又有一群狼,每年狼都會吃掉羊群中的十只跑得最慢的山羊。所以很明顯的,每年山羊種群中跑得最慢的個體被淘汰掉,所以留下來的跑得越來越快,也更有機會能產下后代。慢慢的,整個山羊種群中活下來的都是跑得最快的山羊,以及它們產下的優良子代。

所以整個算法就是:計算每個個體的適應環境程度,然后根據適應度越高繁殖后代概率越大的原則,從群體中選出兩個個體作為父方母方產下后代,然后對該后代的基因進行變異。不斷重復上述操作,直到你決定停為止。然后選出一個最優個體。

怎么實現呢?

先來說繁殖。

受到人類染色體結構的啟發,我們可以設想一下,假設目前只有“0”,“1”兩種堿基,我們也用一條鏈條把他們有序的串連在一起,因為每一個單位都能表現出 1 bit的信息量,所以一條足夠長的染色體就能為我們勾勒出一個個體的所有特征。這就是二進制編碼法,染色體大致如下:

010010011011011110111110

這就是一只山羊的DNA。(當然是模擬山羊)

應當注意的是,我們要學會分辨個體的特征中哪些比較重要,哪些不大重要。比如說山羊,雖然它頭上的角花紋是螺旋形還是條紋形也算它的一個遺傳特征,但這跟它跑得快還是跑得慢完全沒有關系。對于這種特征,我們就不需要把它編程實現了。

然后來討論一下有用的特征。DNA就類似于一個二進制集合,01分別表示該特征存在還是不存在。比如01表示一只山羊沒有靈活的關節但有四條長腿,10表示山羊的關節很靈活但是腿很短,等等(至于11這種人生贏家和00這樣的辣雞都去死吧)有關于二進制集合的操作我也有發博客。

現在我們有一個父親0100和母親1001

對于后代的每一位dna,我們可以抽隨機數,表示這一位dna是隨他爸爸還是隨他媽媽。讓我們假設他的運氣比較好,第一位隨他媽媽,第二位隨他爸爸,第三位隨他媽媽,第四位又隨他媽媽

這樣后代的DNA就是1101

當然,只有遺傳是不夠的,沒有變異怎么能算的上是一個好模擬(好你可以閉嘴了)

假設對于山羊的每一位基因,有%0.01的概率,能讓該位的1變成0,0變成1。然后這個神奇的后代又足夠幸運,剛好在第三位DNA變異了

第一位羊生贏家誕生!

好了現在它的DNA序列是1111,也就是最好狀況。假設一個‘1’代表速度+1,那么它現在的速度就是4

然后自然而然的,我們就講到了父母親代的選擇上。在這里,我們用一個輪盤賭的算法來模擬哪只山羊能被選中。

首先把所有的個體適應度相加作為總適應度sum,然后 隨機生成一個1~sum之間的數random

然后從1開始遍歷群體數組,每次tot+=f[i]的適應度。當tot>=random的時候,選擇當前個體作為遺傳親代。

當然母方也是這么選咯

使用這個輪盤賭算法,你可以發現,適應度越高的個體越容易被選中,但被選中的也不全是適應度最高的個體。因為有一種可能,所有適應度高的個體普遍缺少最后兩個優勢特征,而一個適應度很低的個體卻正好擁有這兩個特征

比如說這三個

01101111000

10111111000

00000000111

很明顯第一個或者第二個跟第三個個體繁殖都會取到明顯的好效果。所以說給別人留臺階就是給自己留后路啊

這就是輪盤賭的意義

好了遺傳算法初級部分大概講完了。布置兩道小題目

1.創造一個有1000個個體的種群,并在500次進化中使最優個體的基因盡量接近這串字符DNA碼“mynameislife”。

2.試著用遺傳算法做01背包。(當然如果你得到的答案是錯誤的真的不怪你,因為這個問題有最優解算法不適合遺傳)發個luogu二維背包鏈接

本篇博客就講到這里,謝謝大家

轉載于:https://www.cnblogs.com/cellular-automaton/p/6847096.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ vector容器類型

vector類為內置數組提供了一種替代表示&#xff0c;與string類一樣 vector 類是隨標準 C引入的標準庫的一部分 &#xff0c;為了使用vector 我們必須包含相關的頭文件 &#xff1a;#include <vector> 使用vector有兩種不同的形式&#xff0c;即所謂的數組習慣和 STL習慣…

redis在linux命令行下連續進行命令操作

redis-cli -a password -n 9 keys "friend*" -a 是auth -n 是選擇數據池 keys就是找key啦、 要是后面再跟上 xargs */redis-cli del redis-cli -a password -n 9 keys "friend*" | xargs redis-cli -a password -n 9 del 就完美了23333 轉載于:https://www…

Calibration校準halcon算子,持續更新

目錄Calibration校準Binocular雙目相機binocular_calibrationCalibration Object 校準物體caltab_pointscreate_caltabdisp_caltabfind_calib_objectfind_caltabfind_marks_and_posegen_caltabsim_caltabCamera parameter相機參數cam_mat_to_cam_parcam_par_to_cam_matdeserial…

javascript:正則表達式、一個表單驗證的例子

閱讀目錄 本文內容&#xff1a;正則表達式&#xff1a;利用正則表達式進行表單驗證的例子&#xff1a;回到頂部本文內容&#xff1a; 正則表達式正則表達式的使用方法正則表達式的特殊匹配字符正則表達式修飾符利用正則表達式進行表單驗證的例子首發日期&#xff1a;2018-05-13…

Spring_01 spring容器、控制反轉(IOC)、依賴注入(DI)

目錄 1 什么是spring框架 2 spring框架的特點 3 spring容器 3.1 什么是spring容器 3.2 spring容器創建對象的編程步驟 3.4 spring容器創建對象的方式 3.5 bean元素的幾個重要屬性 4 IOC 4.1 什么是IOC 4.2 什么事DI 4.3 DI的三種方式 1 什么是spring框架 是一個開源的用來簡化企…

EntityFramework 插件之EntityFramework.Extended (批量處理)

接手了一個用EF來做的項目&#xff0c;由于項目中使用的原生處理&#xff0c;導致很多update都是采用先select 后 update的方式來實現&#xff0c;同時無法批量執行邏輯如&#xff1a;根據訂單類型統一更新狀態等。所以在經過了N多查找之后 發現了一個國外寫的擴展插件EntityFr…

一個傳值的問題”*”與”*”

1/********************************************************* 2* Desc:參數傳遞&#xff1a;使用引用傳遞指針和直接傳遞指針地址的區別 3* Author:charley 4* DateTime:2010-12-7 11:00 02***********************************************************/ 03#include <…

Classification分類halcon算子,持續更新

目錄ClassificationGaussian Mixture Models高斯混合模型add_class_train_data_gmmadd_sample_class_gmmclassify_class_gmmclear_class_gmmclear_samples_class_gmmcreate_class_gmmdeserialize_class_gmmevaluate_class_gmmget_class_train_data_gmmget_params_class_gmmget_…

spring boot 擴展之AutoConfigurationImportListener

最近閱讀spring boot源碼時發現&#xff0c;發現當spring使用ConfigurationClassParser加載使用Configuration注解類后&#xff0c;會使用AutoConfigurationImportSelector對加載的 Configuration注解的類進行一次過濾。當AutoConfigurationImportSelector過濾完成后會自動加載…

classpath: spring 中的查找方式

Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件. 比如 resource1.jar中的package com.test.rs 有一個 jarAppcontext.xml 文件,內…

《高效程序員的45個習慣》-之一

敏捷開發是當下最流行的開發方法&#xff0c;它采用的是一種以人為核心、迭代、循序漸進的開發思想&#xff0c;值得你關注和學習。 最近我就閱讀了一本有關敏捷開發的書籍&#xff0c;《高效程序員的45個習慣》。 它以“舉反例”的方式來講述了敏捷開發中程序員應該運用的…

教你如何在 elasticsearch 中重建索引

序言 Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎&#xff0c;為用戶提供搜索服務&#xff0c;當我們決定存儲某種數據時&#xff0c;我們需要使用PUT /teambition創建索引&#xff0c;在創建索引的時候需要將數據結構完整確定下…

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程&#xff0c;但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

MIME Type的介紹

轉載自&#xff1a; http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先&#xff0c;我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么&#xff0c;瀏覽器是如何區分它們&#xff0c;決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神&#xff0c;該項目的想法來源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代碼的重構&#xff0c;并且更換了博客主題。 關于項目&#xff0c;對于開發的練手項目&#xff0c;能夠工程化&#xff0c;嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification&#xff1a;分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…