導航:首頁 > 源碼編譯 > 遺傳演算法適應值函數

遺傳演算法適應值函數

發布時間:2023-06-14 18:08:02

A. 如何用遺傳演算法工具箱中的函數畫出適應度函數曲線

matlab有遺傳演算法工具箱。

核心函數:
(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始種群的生成函數
【輸出參數】
pop--生成的初始種群
【輸入參數】
num--種群中的個體數目
bounds--代表變數的上下界的矩陣
eevalFN--適應度函數
eevalOps--傳遞給適應度函數的參數
options--選擇編碼形式(浮點編碼或是二進制編碼)[precision F_or_B],如
precision--變數進行二進制編碼時指定的精度
F_or_B--為1時選擇浮點編碼,否則為二進制編碼,由precision指定精度)

(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遺傳演算法函數
【輸出參數】
x--求得的最優解
endPop--最終得到的種群
bPop--最優種群的一個搜索軌跡
【輸入參數】
bounds--代表變數上下界的矩陣
evalFN--適應度函數
evalOps--傳遞給適應度函數的參數
startPop-初始種群
opts[epsilon prob_ops display]--opts(1:2)等同於initializega的options參數,第三個參數控制是否輸出,一般為0。如[1e-6 1 0]
termFN--終止函數的名稱,如['maxGenTerm']
termOps--傳遞個終止函數的參數,如[100]
selectFN--選擇函數的名稱,如['normGeomSelect']
selectOps--傳遞個選擇函數的參數,如[0.08]
xOverFNs--交叉函數名稱表,以空格分開,如['arithXover heuristicXover simpleXover']
xOverOps--傳遞給交叉函數的參數表,如[2 0;2 3;2 0]
mutFNs--變異函數表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']
mutOps--傳遞給交叉函數的參數表,如[4 0 0;6 100 3;4 100 3;4 0 0]

注意】matlab工具箱函數必須放在工作目錄下
【問題】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9
【分析】選擇二進制編碼,種群中的個體數目為10,二進制編碼長度為20,交叉概率為0.95,變異概率為0.08
【程序清單】
%編寫目標函數
function[sol,eval]=fitness(sol,options)
x=sol(1);
eval=x+10*sin(5*x)+7*cos(4*x);
%把上述函數存儲為fitness.m文件並放在工作目錄下

initPop=initializega(10,[0 9],'fitness');%生成初始種群,大小為10
[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',
[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遺傳迭代

運算借過為:x =
7.8562 24.8553(當x為7.8562時,f(x)取最大值24.8553)

註:遺傳演算法一般用來取得近似最優解,而不是最優解。

遺傳演算法實例2

【問題】在-5<=Xi<=5,i=1,2區間內,求解
f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282的最小值。
【分析】種群大小10,最大代數1000,變異率0.1,交叉率0.3
【程序清單】
%源函數的matlab代碼
function [eval]=f(sol)
numv=size(sol,2);
x=sol(1:numv);
eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282;
%適應度函數的matlab代碼
function [sol,eval]=fitness(sol,options)
numv=size(sol,2)-1;
x=sol(1:numv);
eval=f(x);
eval=-eval;
%遺傳演算法的matlab代碼
bounds=ones(2,1)*[-5 5];
[p,endPop,bestSols,trace]=ga(bounds,'fitness')

註:前兩個文件存儲為m文件並放在工作目錄下,運行結果為
p =
0.0000 -0.0000 0.0055

大家可以直接繪出f(x)的圖形來大概看看f(x)的最值是多少,也可是使用優化函數來驗證。matlab命令行執行命令:
fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])

evalops是傳遞給適應度函數的參數,opts是二進制編碼的精度,termops是選擇maxGenTerm結束函數時傳遞個maxGenTerm的參數,即遺傳代數。xoverops是傳遞給交叉函數的參數。mutops是傳遞給變異函數的參數。

B. 遺傳演算法中常用的適應度函數是什麼呢

1.物競――適應度函數(fitness function)

自然界生物競爭過程往往包含兩個方面:生物相互間的搏鬥與及生物與客觀環境的搏鬥過程。但在我們這個實例裡面,你可以想像到,袋鼠相互之間是非常友好的,它們並不需要互相搏鬥以爭取生存的權利。它們的生死存亡更多是取決於你的判斷。因為你要衡量哪只袋鼠該殺,哪只袋鼠不該殺,所以你必須制定一個衡量的標准。而對於這個問題,這個衡量的標准比較容易制定:袋鼠所在的海拔高度。(因為你單純地希望袋鼠爬得越高越好。)所以我們直接用袋鼠的海拔高度作為它們的適應性評分。即適應度函數直接返回函數值就行了。

引自:網頁鏈接

C. 遺傳演算法的適度函數是什麼意思舉個例說明下最好通俗

適應度用於評價個體的優劣程度,適應度越大個體越好,反之適應度越小則個體越差;根據適應度的大小對個體進行選擇,以保證適應性能好的個體有更多的機會繁殖後代,使優良特性得以遺傳.因此,遺傳演算法要求適應度函數值必須是非負數,而在許多實際問題中,求解的目標通常是費用最小,而不是效益最大,因此需要將求最小的目標根據適應度函數非負原則轉換為求最大目標的形式。
----------------
如何通俗易懂地解釋遺傳演算法?有什麼例子?
遺傳演算法,核心是達爾文優勝劣汰適者生存的進化理論的思想。

我們都知道一個種群,通過長時間的繁衍,種群的基因會向著更適應環境的趨勢進化,牛B個體的基因被保留,後代越來越多,適應能力低個體的基因被淘汰,後代越來越少。經過幾代的繁衍進化,留下來的少數個體,就是相對能力最強的個體了。

那麼在解決一些問題的時候,我們能不能學習這樣的思想,比如先隨機創造很多很多的解,然後找一個靠譜的評價體系,去篩選比較好的解,再用這些好的解像生小寶寶一樣生一堆可能更好的解,然後再篩再生,反復弄個幾代,得到的說不定就是近似最優解喲

說干就干,有一個經典組合問題叫「背包問題」,我們拿這種思路來試試

「背包問題(Knapsack problem)是一種組合優化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來源於如何選擇最合適的物品放置於給定背包中。」

這個問題的衍生簡化問題「0-1背包問題」 增加了限制條件:每件物品只有一件,可以選擇放或者不放,更適合我們來舉例

這樣的問題如果數量少,當然最好選擇窮舉法
比如一共3件商品,用0表示不取,1表示取,那麼就一共有
000 001 010
011 100 101
110 111
這樣8種方案,然後讓計算機去累加和,與重量上限比較,留下來的解里取最大即可。

但如果商品數有300,3000,甚至3w種呢,計算量太大窮舉法可能就不適用了,這時如果遺傳演算法使用得當,就能在較短的時間內幫我們找到近似的最優解,我們繼續往下看:

新的問題是12件商品的0-1背包問題

我們先讓計算機隨機產生1000個12位的二級制數

把總重量超過背包上限的解篩掉

剩下的兩兩一對隨機交換「基因片段」產生下一代
交換前:
0000 1100 1101
0011 0101 0101
交換後:
0000 0101 1101
0011 1100 0101

再篩選,再交配,如此反復幾代,留下的解攜帶的「基因「差不多就是最好的了,怎麼樣跟生物進化是不是一模一樣?
其實還差點,生物繁殖過程中,新產生的基因是有一定幾率突變的,這是很多優良性狀的重要來源,遺傳演算法中可也不能忽略它

比如:
變異前:
000101100101
變異後:
000101110101

那也有人得疑惑了,我怎麼知道要讓哪個地方產生突變呢?其實蜘蛛俠NB之前,他也不知道蜘蛛咬在那能讓他變NB而不是SB,這就是一個概率問題。我們在設計演算法的時候,會給每個基因設置一個突變概率(當然是非常非常小了)同樣的在基因交換階段交換哪些基因呢,也是一個演算法設置問題。

總結一下,遺傳演算法應該有
一個基本函數:適度函數f(x)
三個基本操作:選擇,交叉,變異

一.適度函數
適度函數很好理解,其實就是指解的篩選標准,比如我剛才說的把所有超過上限重量的解篩選掉,但是不是有更好的篩選標准或者這個現有的標准根本就是個渣呢?這將直接影響最後結果的接近程度以及求解所耗費的時間,所以設置一個好的適度函數很重要

二.選擇
剛才為了大家理解方便,我直接讓所有解都參與了後續的交叉以及變異,但真實世界可不是這樣子的,因為也不是每個人都會結婚生子的對吧。
說直白點,所謂【屌絲注孤生】【工科男注孤生】什麼的還不是因為loser的基因不適合往下傳唄。不過實際情況是我們偶爾也能看到或聽到屌絲逆襲、鮮花牛糞之類勵志故事,只不過頻率比較低咯

沒錯,概率!在遺傳演算法中選擇也是個概率問題,在解的世界中(姑且這么稱呼吧)適度更高的高富帥們是不是應該有更高的概率被選去傳宗接代才合適呢?不過和現實世界一樣,適度低的屌絲解是要給人家一點希望的對不對?所以

在選擇一些解來產生下一代時,一種常用的選擇策略是 「比例選擇」,也就是個體被選中的概率與其適應度函數值成正比。假設群體的個體總數是M,那麼那麼一個體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) )

三.交叉
這是例子中詳細說到的,交換兩個解的部分」基因」,來構造兩個子代的解。

四.變異
在繁殖子代的過程中,新產生的解中的「基因」會以一定的概率出錯,稱為變異。我們可以吧變異發生的概率設置為Pm

五.基本遺傳演算法優化
精英主義:這是基本遺傳演算法的一種優化。目的是防止進化過程中產生的最優解被變異和交叉所破壞。《遺傳演算法原理及應用》介紹的最優保存策略是:即當前種群中適應度最高的個體不參與交叉運算和變異運算,而是用它來替換掉本代群體中經過交叉、變異等遺傳操作後所產生的適應度最低的個體。

後記:
其實不管是遺傳演算法,還是模擬退火演算法或者其他演算法,其本質都是借鑒自然界中的規則規律,人為的為問題設置了一個模擬模型,然後用大自然告訴我們的規律去找最優解,在理解這些演算法的時候,可以照著這個思路去走,一般能讓你快速撥雲見日,了解演算法的核心思想。
比如遺傳演算法,我們可以對比種群的進化,給問題設置的模型就是:
這樣參照著我們熟悉的知識體系,去理解學習,原來聽上去遙不可及的理論是不是一下就變得親切易懂了吧?

可是我們再看一些教科書或者就拿網路來說(怕也是摘抄的某本書上的段落)
真的是通篇不說人話啊!對已經了解這個演算法思想的人來說,還能勉強硬著頭皮看下去,但對入門者來說,這TMD簡直就是噩夢!而這完全是國內各種教材的通病!

我其實一直在想,教材面向的明明就是望門欲入的初學者,你不弄得生動活潑一點招徠門徒就算了,在一群幼兒園小朋友面前賣弄之乎者也還顯本事了是么!我是還記得我們學校的高數書編的有多麼生澀難懂,結果第一節課老教授上課時還說「我們不用同濟的版本,那本書太淺,不適合我們學校的學生」 可是在我和大多數同學看來,同濟版本的高數倒更像是為了要入門的同學編寫的教材,自己學校編的那本卻更像是給同行評閱炫耀作者深度的大部頭。

知識明明可以講的更有趣,讓人願意入其門來探個究竟。

作者:彈彈彈球

D. 遺傳演算法的基本原理

遺傳演算法本質上是對染色體模式所進行的一系列運算,即通過選擇運算元將當前種群中的優良模式遺傳到下一代種群中,利用交叉運算元進行模式重組,利用變異運算元進行模式突變。

閱讀全文

與遺傳演算法適應值函數相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163