《基于Java實現的遺傳算法》筆記(7 / 7):個人總結

文章目錄

  • 為何采用遺傳算法
  • 哪些問題適合用遺傳算法解決
  • 遺傳算法基本術語
  • 一般遺傳算法的過程
  • 基本遺傳算法的偽代碼

為何采用遺傳算法

遺傳算法是機器學習的子集。在實踐中,遺傳算法通常不是用來解決單一的、特定問題的最好算法。對任何一個問題,幾乎總有更好的、更有針對性的解決方案!那么何必麻煩呢?

遺傳算法是一個極好的多用途工具,可以應用于許多不同類型的問題。這是瑞士軍刀與合適的螺絲刀之間的差異。如果任務是擰緊300顆螺絲,你會跳起來找螺絲刀。但如果任務是擰幾顆螺絲、割開一些布、在皮革上打一個孔,然后打開一瓶冰蘇打水獎勵自己的努力工作,那么瑞士軍刀是更好的選擇。

此外,遺傳算法是整體研究機器學習的不錯入門。如果機器學習是一座冰山,遺傳算法就是尖端的一部分。遺傳算法有趣、令人興奮且充滿創新。遺傳算法的模型基于自然生物過程,建立了計算世界和自然世界之間的連接。編寫第一個遺傳算法,觀看從混亂和隨機中出現的驚人結果,讓人嘆為觀止。

機器學習冰山頂端的其他研究領域也同樣令人興奮,但它們往往關注的問題更狹窄,更難以理解。遺傳算法則不然,它很容易理解,是有趣的實現,它們引入了所有機器學習技術都會使用的許多概念。

哪些問題適合用遺傳算法解決

下面是一個問題特征列表,這類問題是采用遺傳算法的良好候選者:

  • 如果問題足夠困難,難以寫代碼來解決;
  • 如果人不知道如何解決這個問題;
  • 如果問題是不斷變化的;
  • 如果搜索每個可能解是不可行的;
  • 如果可以接受“足夠好”的解。

遺傳算法基本術語

遺傳算法建立在生物進化的概念上的。

  • 種群:這就是一個候選解(個體)集合,可以有變異和交叉這樣的遺傳操作應用于它們。
  • 候選解(個體):給定問題的一個可能的解。
  • 基因:組成染色體的不可分割的構建塊。經典的基因包含0或1。
  • 染色體:染色體是一串基因。染色體定義了一個特定的候選解(個體)。用二進制編碼一個典型的染色體可能包含“01101011”這樣的內容。
  • 變異:一個過程,其中候選解中的基因被隨機改變,以創建新的性狀。
  • 交叉:其中染色體被組合以創建新的候選解決方案的方法。這有時稱為重組。
  • 選擇:這是選擇的候選解,繁殖下一代解的技術。
  • 適應度:一個評分,衡量候選解適合給定問題的程度。

一般遺傳算法的過程

在這里插入圖片描述

  1. 遺傳算法開始,初始化候選解(個體)的種群。這通常是隨機提供整個搜索空間的均勻覆蓋。涉及參數有種群規模。
  2. 接下來,通過為種群中的每個個體分配一個適應度值,對種群進行評估。在這個階段,常常要注意當前最優解,以及種群的平均適應度。
  3. 評估后,根據終止條件集,該算法決定它是否應該終止搜索。通常這是因為該算法已達到指定的世代數量,或已經找到適當的解。
    1. 如果終止條件最終滿足,算法會跳出循環,通常向用戶返回最后的搜索結果。
    2. 一些典型的終止條件是:
      • 到達世代的最大數目;
      • 超過分配給它的時間;
      • 發現一個滿足所需條件的解;
      • 該算法已經達到了一個穩定階段。
  4. 如果終止條件不滿足,種群經過一個選擇階段,基于適應度評分,從種群中選擇個體。適應度越高,個體就更有機會被選擇。選擇目的為下一步“交叉和變異”作準備。選擇方法有:
    • 輪盤賭選擇(也稱為適應度比例選擇)。個體的適應度越高,在輪盤上占據的空間就越多,也就是選中的概率越大。(參考第2章)
    • 錦標賽選擇。隨機從種群中選擇一些個體,進入錦標賽。以通過比較這些個體的適應度值來競爭,然后選擇適應度最高的個體作為親代。(參考第3章)
  5. 下一階段對選擇的個體應用交叉和變異。這個階段為下一代創建新個體。如果是種群中的精英(種群中適應度最靠前的一小部分個體),直接跳過進入下一代。涉及參數有交叉率、變異率。交叉和變異后,確保仍然得到一個有效解(合格的個體)。
    1. 交叉方法有:
      • 均勻交叉(uniform crossover)。后代的每個基因都有50%的機會來自第一個親代或其第二個親代。(參考第2章)
      • 單點交叉。隨機選擇基因組中的一個位置,確定哪些基因來自于哪個親代。交叉位置之前的遺傳信息來自于親代1,之后的遺傳信息來自于親代2。(參考第3章)
      • 排序交叉。在這種交叉方法中,第一個親代染色體的一個子集被選中。然后該子集被添加到后代染色體的相同位置。下一步是將第二個親代的遺傳信息添加到后代的染色體中。通常從所選子集的結束位置開始,然后包括親代2的每個基因,只要后代染色體中還沒有該基因。(參考第4章)
  6. 此時新種群返回到評估步驟(步驟2),過程重新開始。我們稱這種循環的每一圈為一個世代。

基本遺傳算法的偽代碼

generation = 0;
population[generation] = initializePopulation(populationSize);
evaluatePopulation(population[generation]);
while isTerminationConditionMet() == false doparents = selectParents(population[generation]);population[generation+1] = crossover(parents);population[generation+1] = mutate(population[generation+1]);evaluatePopulation(population[generation]);generation++;
End loop;

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

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

相關文章

單鏈表不帶頭標準c語言實現

鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是…

Java設計模式(4 / 23):單例模式

文章目錄單例模式的應用場景餓漢式單例模式懶漢式單例模式改進:synchronized改進:雙重檢查鎖改進:靜態內部類破壞單例用反射破壞單例用序列化破壞單例解密注冊式單例模式枚舉式單例模式解密容器式單例線程單例實現ThreadLocal單例模式小結參考…

約瑟夫環-(數組、循環鏈表、數學)

約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報…

Ubuntu麒麟下搭建FTP服務

一.怎么搭建FTP服務: 第一步>>更新庫 linuxidclinuxidc:~$ sudo apt-get update 第二步>>采用如下命令安裝VSFTPD的包 linuxidclinuxidc:~$ sudo apt-get install vsftpd 第三步>>安裝完成后打開 /etc/vsftpd.conf 文件,按如下所述…

《數據結構上機實驗(C語言實現)》筆記(1 / 12):緒論

文章目錄驗證性實驗求1~n的連續整數和說明放碼結果常見算法時間函數的增長趨勢分析說明放碼結果設計性實驗求素數個數說明放碼結果求連續整數階乘的和說明放碼結果驗證性實驗 求1~n的連續整數和 說明 對于給定的正整數n,求12…n12…n12…n,采用逐個累…

線性表實現一元多項式操作

數組存放: 不需要記錄冪,下標就是。 比如1,2,3,5表示12x3x^25x^3 有了思路,我們很容易定義結構 typedef struct node{float * coef;//系數數組int maxSize;//最大容量int order;//最高階數 }Polynomial…

ubuntu下解壓縮zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去壓縮文件或者目錄呢? 在這里我們將學習zip, tar, tar.gz和tar.bz2等壓縮格式的基本用法。 首先了解下Linux里面常用的壓縮格式。 在我們探究這些用法之前,我想先跟大家分享一下使用不同壓縮格式的經驗。當然,我這里講到的只…

《數據結構上機實驗(C語言實現)》筆記(2 / 12):線性表

文章目錄驗證性實驗實現順序表各種基本運算的算法放碼sqlist.hsqlist.cppexp2-1.cpp結果實現單鏈表各種基本運算的算法放碼linklist.hlinklist.cppexp2-2.cpp結果實現雙鏈表各種基本運算的算法放碼dlinklist.hdlinklist.cppexp2-3.cpp結果實現循環單鏈表各種基本運算的算法放碼…

鏈表排序-歸并

鏈表排序,可以插入排序,我就不寫了。 實現歸并排序 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并&…

ubuntu麒麟下安裝并啟用搜狗輸入法

1.首先打開UK軟件,輸入搜狗尋找搜狗拼音軟件 然后下載搜狗拼音軟件 接著點擊啟動該軟件 2.點擊搜狗拼音的圖標,進入搜狗拼音的設置窗口 點擊高級,并打開FCITX設置 加入英語輸入法 3.這樣就可以進行中英文切換了

線性表表示集合

集合我們高中都學過吧? 最重要的幾個特點:元素不能重復、各個元素之間沒有關系、沒有順序 集合內的元素可以是單元素或者是集合。 對集合的操作:交集并集差集等,還有對自身的加減等。 需要頻繁的加減元素,所以順序…

家用無線路由器購買入門指南

視頻一:「白問」普通大眾 買路由器關注這幾個點就夠了 來源 例如商品名:AC 1200M 雙頻 AX前綴wifi6IEEE 802.11 AX AC前綴wifi5IEEE 802.11 AC AX比AC好 1200M 理論峰值 和網速無關 商家噱頭 MIMO SU-MIMO 單用戶多進多出(早期&#xff…

ubuntu linux下執行.sh文件

ubuntu linux下執行.sh文件 首先,要確保這個文件的類型是可執行的。 有兩種辦法把文件設置為可執行文件。 1) 直接在文件屬性標簽中選中 "可執行",--b 如果用的是圖形界面,這個方法最簡單直接。 2) 使用命令 chmod x file.sh。將可…

鏈表相交問題

本來想自己寫,寫了一半發現一篇文章,解釋寫得簡單易懂,我就直接拿過來了。 這個問題值得反復地寫,鍛煉鏈表coding能力的好題。 //如果兩個鏈表都不帶環 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS寫了一個模擬串行加法器

在重溫《編碼:隱匿在計算機軟硬件背后的語言》第12章——二進制加法器時,心血來潮用JS寫了一個模擬串行加法器。 測試斷言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android學習路線總結

title: Android學習路線總結,絕對干貨 tags: Android學習路線,Android學習資料,怎么學習android grammar_cjkRuby: true --- 一、前言 不知不覺自己已經做了幾年開發了,由記得剛出來工作的時候感覺自己能牛X,現在回想起來感覺好無知。懂的越…

雙棧

利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個空間。 具體實現方法大概有兩種: 一種是奇偶棧,就是所有下標為奇數的是一個棧,偶數是另一個棧。但是這樣一個棧的最大存儲就確定了,并沒有起到互補空缺的作用&a…

Error when loading the SDK:解決方案

錯誤情況: 當打開eclipse時出現如下窗口(內容如下) Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

單調隊列優化的背包問題

對于背包問題,經典的背包九講已經講的很明白了,本來就不打算寫這方面問題了。 但是吧。 我發現,那個最出名的九講竟然沒寫隊列優化的背包。。。。 那我必須寫一下咯嘿嘿,這么好的思想。 我們回顧一下背包問題吧。 01背包問題 …

用Python去除掃描型PDF中的水印

內容概述 含水印掃描型PDF文件,其中某頁如下圖所示,用Python去除其頁頂及頁底的水印。 處理思路:PDF中的每一頁的水印的相對位置基本相同,將PDF每一頁輸出成圖片,然后進行圖片編輯,用白色填充方形覆蓋水印…