摘要:開篇先提到一些生物學的觀點是因為,人工智能中遺傳算法的靈感來源于生物學,它是一種仿生的概念。我理解的遺傳算法,就是一個多點的不定向搜索。
生物學中的進化論的核心為“物競天擇,適者生存”,暗含了的規則是生物能否生存是不定的,但是適應環境的生物更容易生存。生物的多樣性能夠保持來源于繁殖和變異。
沒錯,你沒有點錯,這的確是一篇有關人工智能入門的博客。開篇先提到一些生物學的觀點是因為,人工智能中遺傳算法的靈感來源于生物學,它是一種仿生的概念。
一.遺傳算法
那么,什么是遺傳算法呢?我們來舉個栗子吧。
在爬蟲動物園里有著各種各樣的螞蟻,我想選出一種螞蟻來代表動物園去參加全城動物園的螞蟻戰斗比賽。那我該怎么選呢?這里有一個聰明人提出了一個方法:首先,我們從各個螞蟻的種群中選擇出一部分來(選擇初代種群),讓他們相互打架,然后把勝者留下來互相繁殖(交叉產生子代,選擇了比較好的基因進行遺傳)。把小螞蟻養大,然后再讓它們打架,勝者繁殖(不斷生成子代)。通過多次的繁殖和選擇,動物園有極大的可能選出的螞蟻是所有螞蟻中打架最厲害的。
好吧,這個例子不是特別的好。我理解的遺傳算法,就是一個多點的不定向搜索。它通過多次的實驗,來找到符合適應度函數的個體。
二.基本步驟
基本的步驟如下:
1.編碼:將我們可以用來搜索的部分編碼,常用二進制串
2.產生初代:
3.計算每個個體的適應度及適應度占總體的比例(這里我使用了輪盤賭方案):
4.以交叉概率選擇父代母代進行交叉
5.以變異概率進行變異
6.生成滿足種群容量的子代
7.進化多代
三.代碼及說明
Java代碼:
import java.math.BigDecimal; import java.util.Random; public class Genetic { int geneSize = 20; int populationSize = 50; int iterationNum =100; double crossoverPro =0.8; double mutationPro = 0.05; int [][] individual = new int[populationSize][geneSize]; double [] realValue =new double[populationSize]; double [] fitness =new double [50]; double [] fitnessPro =new double [populationSize]; double currentOpt =0; int currentX =0; Random random =new Random(); double [] max =new double[iterationNum]; public void init(){ for(int i =0;i=3;j--){ decimal = decimal/2+individual[i][j]; } realValue[i] += decimal/2; } } private void CalFitnessAndFitnessPro(){ double sum =0; currentOpt =0; currentX =0; for(int i =0;i =pro){ for(int k =0;k =pro){ for(int k =0;k 這里我使用了二進制編碼,單點交叉,輪盤賭加精英選擇(沒代向下完整保留最優個體)。我目標是計算f(x) = x+ 10sin5x + 7cos4x 在[0,9]區間上的極大值,之所以在適應度函數里加入還加了17是因為f(x)在某些位置的時候是取到負數(最小-17),而參與輪盤賭計算的函數必須是正數,所以我加了17.
四.小嘗試
二進制編碼在0.001這樣的數的時候是不精確的,于是我想能不能用十進制來解決這個問題呢?下面我嘗試做了十進制編碼(精確度是0.00001)
Java代碼:import java.math.BigDecimal; import java.util.Random; public class DecimalGenetic { int geneSize = 6; int populationSize = 50; int iterationNum =100; double crossoverPro =0.8; double mutationPro = 0.01; int [][] individual = new int[populationSize][geneSize]; double [] realValue =new double[populationSize]; double [] fitness =new double [50]; double [] fitnessPro =new double [populationSize]; double currentOpt =0; int currentX =0; Random random =new Random(); double []max =new double[iterationNum]; public void init(){ for(int i =0;i0;j--){ decimal = decimal/10+individual[i][j]; } realValue[i] += decimal/10; // System.out.println(realValue[i]+" "+i); } } private void CalFitnessAndFitnessPro(){ double sum =0; currentOpt =0; currentX =0; for(int i =0;i =pro){ for(int k =0;k =pro){ for(int k =0;k 實現和二進制大部分一致,但是在變異部分我用了取隨機數這個方法。
五.思考:
關于編碼,我在做完之后有一些思考,想和大家分享.我們編碼一個數據,用0-1串表示,每一位是沒有差別的,但是轉換為數字的時候,每一位的權值是不同的。對于真正的自然界,每個性狀對于生物的存活幾率的影響也是不同的。比如果蠅的翅膀大小和眼色對于它的生存幾率的影響是不同的,那反應成我們這里的編碼就是位置不同,權重不同.這里算是遺傳算法的奇妙之處吧.下面推薦一個講述比較完整的博客:https://segmentfault.com/a/1190000004155021
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19602.html
摘要:開篇先提到一些生物學的觀點是因為,人工智能中遺傳算法的靈感來源于生物學,它是一種仿生的概念。我理解的遺傳算法,就是一個多點的不定向搜索。 生物學中的進化論的核心為物競天擇,適者生存,暗含了的規則是生物能否生存是不定的,但是適應環境的生物更容易生存。生物的多樣性能夠保持來源于繁殖和變異。沒錯,你沒有點錯,這的確是一篇有關人工智能入門的博客。開篇先提到一些生物學的觀點是因為,人工智能中遺傳...
摘要:為我們提供了許多內置函數,例如并提供了創建用戶定義函數的能力。會將該變量視為函數級作用域中的局部變量?;氐侥夸浿泻瘮档挠猛臼鞘裁词侵械膬戎煤瘮抵?。請注意,這種類型的參數語法不允許將命名參數傳遞給函數。函數接受一個稱為的可選參數。 ...
摘要:遺傳算法回顧核心算子其中代表第個粒子的速度,代表慣性權值和表示學習參數,表示在之間的隨機數代表第個粒子搜索到的歷史最優值代表整個集群搜索到的最優值代表第個粒子的當前位置。 導言 粒子群PSO算法相比遺傳算法實現會簡單一點,核心就是根據算子更新個體歷史最優和全局最優。粒子群用的不多,給我的感覺是收斂很快的一種算法。這種算法較為容易陷入局部最優,若問題具有欺騙性(具有多個假峰,且優化資源集...
摘要:已有的經典求解算法可以分為精確解算法和啟發式算法兩大類。所以還有一大部分研究集中于啟發式算法領域。此外,經過不斷的探索研究,元啟發式算法被證明在求解方面具有很好的效果和效率。 showImg(https://segmentfault.com/img/remote/1460000018814897); 阿里妹導讀:車輛路徑規劃問題(Vehicle Routing Problem, VR...
閱讀 3199·2021-09-29 09:34
閱讀 3551·2021-09-10 10:51
閱讀 1948·2021-09-10 10:50
閱讀 6731·2021-08-12 13:31
閱讀 3000·2019-08-30 15:54
閱讀 1560·2019-08-30 15:44
閱讀 1430·2019-08-29 12:26
閱讀 2654·2019-08-26 18:36