『壹』 如何用遺傳演算法實現多變數的最優化問題
將多個變數的數值編碼編排進去,進行組合。
『貳』 MATLAB 求解遺傳演算法
在MATLAB 6.5自身沒有遺傳演算法工具箱,像bs2rv,crtbp這些函數都不存在,所以運行不了,你需要自己安裝一個遺傳演算法工具箱,才能運行
『叄』 Matlab遺傳演算法求函數最大值
figure(1);
fplot('variable.*sin(10*pi*variable)+2.0',[-1,2]);
NIND=40;
MAXGEN=25;
PRECI=20;
GGAP=0.9;
trace=zeros(2,MAXGEN);
FieldD=[20;-1;2;1;0;1;1];
Chrom=CRTBP(NIND,PRECI);
gen=0;
variable=BS2RV(Chrom,FieldD);
ObjV=variable.*sin(10*pi*variable)+2.0;
while gen<MAXGEN,
FitnV=ranking(-ObjV);
SelCh=SELECT('SUS',Chrom,FitnV,GGAP);
SelCh=RECOMBIN('XOVSP',SelCh,0.7)
SelCh=MUT(SelCh);
variable=BS2RV(SelCh,FieldD);
ObjVSel=variable.*sin(10*pi*variable)+2.0;
[Chrom,ObjV]=REINS(Chrom,SelCh,1,1,ObjV,ObjVSel);
gen=gen+1;
[Y,I]=max(ObjV),hold on;
plot(variable(I),Y,'bo');
trace(1,gen)=max(ObjV);
trace(2,gen)=sum(ObjV)/length(ObjV);
end
variable=BS2RV(Chrom,FieldD);
hold on;
grid;
plot(variable',ObjV','b*');
figure(2);
plot(trace(1,:)');
hold on;
plot(trace(2,:)','-.');
grid;
看看這個能用得上么
『肆』 遺傳演算法里的「代溝」(gap)是什麼意思
代溝是用於控制每代中種群被替換的比例,即每代有N*(1-G)個父代個體被選中進入下一代種群。G=50%意味著一半的種群將被置換。
『伍』 遺傳演算法工具箱中怎麼畫出遺傳代數與優化變數的關系圖
將下屬兩個目標函數分別保存在兩個m文件中functionf1=func1(x)%第一目標函數f1=x(:,1).*x(:,1)./4+x(:,2).*x(:,2)./4;functionf2=func2(x)%第二目標函數f2=x(:,1).*(1-x(:,2))+10;functionGA()clear;clc;closeallNIND=100;%個體數目MAXGEN=50;%最大遺傳代數NVAR=2;%變數個數PRECI=20;%變數的二進制位數GGAP=0.9;%代溝trace1=[];trace2=[];trace3=[];%性能跟蹤%建立區域描述器%rep([PRECI],[1,NVAR])FieldD=[rep([PRECI],[1,NVAR]);rep([1;2],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];Chrom=crtbp(NIND,NVAR*PRECI);%初始種群v=bs2rv(Chrom,FieldD);%初始種群十進制轉換gen=1;whilegen
『陸』 目標變數為混合變數(浮點+離散)編碼遺傳演算法
最近研究了一下遺傳演算法,因為要用遺傳演算法來求解多元非線性模型。還好用遺傳演算法的工具
箱予以實現了,期間也遇到了許多問題。藉此與大家分享一下。
首先,我們要熟悉遺傳演算法的基本原理與運算流程。
基本原理:遺傳演算法是一種典型的啟發式演算法,屬於非數值演算法范疇。它是模擬達爾文的自然
選擇學說和自然界的生物進化過程的一種計算模型。它是採用簡單的編碼技術來表示各種復雜
的結構,並通過對一組編碼表示進行簡單的遺傳操作和優勝劣汰的自然選擇來指導學習和確定
搜索的方向。遺傳演算法的操作對象是一群二進制串(稱為染色體、個體),即種群,每一個染
色體都對應問題的一個解。從初始種群出發,採用基於適應度函數的選擇策略在當前種群中選
擇個體,使用雜交和變異來產生下一代種群。如此模仿生命的進化進行不斷演化,直到滿足期
望的終止條件。
運算流程:
Step 1:對遺傳演算法的運行參數進行賦值。參數包括種群規模、變數個數、交叉概率、變異概
率以及遺傳運算的終止進化代數。
Step 2:建立區域描述器。根據軌道交通與常規公交運營協調模型的求解變數的約束條件,設
置變數的取值范圍。
Step 3:在Step 2的變數取值范圍內,隨機產生初始群體,代入適應度函數計算其適應度值。
Step 4:執行比例選擇運算元進行選擇操作。
Step 5:按交叉概率對交叉運算元執行交叉操作。
Step 6:按變異概率執行離散變異操作。
Step 7:計算Step 6得到局部最優解中每個個體的適應值,並執行最優個體保存策略。
Step 8:判斷是否滿足遺傳運算的終止進化代數,不滿足則返回Step 4,滿足則輸出運算結果
。
其次,運用遺傳演算法工具箱。
運用基於Matlab的遺傳演算法工具箱非常方便,遺傳演算法工具箱里包括了我們需要的各種函數庫
。目前,基於Matlab的遺傳演算法工具箱也很多,比較流行的有英國設菲爾德大學開發的遺傳算
法工具箱GATBX、GAOT以及Math Works公司推出的GADS。實際上,GADS就是大家所看到的
Matlab中自帶的工具箱。我在網上看到有問為什麼遺傳演算法函數不能調用的問題,其實,主要
就是因為用的工具箱不同。因為,有些人用的是GATBX帶有的函數,但MATLAB自帶的遺傳演算法
工具箱是GADS,GADS當然沒有GATBX里的函數,因此運行程序時會報錯,當你用MATLAB來編寫
遺傳演算法代碼時,要根據你所安裝的工具箱來編寫代碼。
以GATBX為例,運用GATBX時,要將GATBX解壓到Matlab下的toolbox文件夾里,同時,set path
將GATBX文件夾加入到路徑當中。
最後,編寫Matlab運行遺傳演算法的代碼。
這塊內容主要包括兩方面工作:1、將模型用程序寫出來(.M文件),即目標函數,若目標函
數非負,即可直接將目標函數作為適應度函數。2、設置遺傳演算法的運行參數。包括:種群規
模、變數個數、區域描述器、交叉概率、變異概率以及遺傳運算的終止進化代數等等。
為方便大家理解,以下為例:
求解模型:TC=x1+2*x2+3*x3+4*x4,-1<=x<=0
根據上面的求解模型,可以寫出模型的.M文件如下,即適應度函數
function TC=TotalCost(x)
TC=0;
for i=1:4
TC=TC+i*x(i);
end
然後,可以利用遺傳演算法工具箱來寫出遺傳演算法運行的主要程序,如下:
%定義遺傳演算法參數
NIND=20; %個體數目
MAXGEN=200; %最大遺傳代數
NVAR=4; %變數維數
PRECI=20; %變數的二進制位數
GGAP=0.9; %代溝
trace=zeros(MAXGEN,2); %演算法性能跟蹤
%建立區域描述器
FieldD=[rep(PRECI,[1,NVAR]);rep([-1;0],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI); %創建初始種群
gen=0; %代計數器
ObjV=TotalCost(bs2rv(Chrom,FieldD)); %計算初始種群個體的目
標函數值
while gen<MAXGEN,
FitnV=ranking(ObjV); %分配適應度值
SelCh=select('sus',Chrom,FitnV,GGAP); %選擇
SelCh=recombin('xovsp',SelCh,0.7); %重組
SelCh=mut(SelCh,0.07); %變異
ObjVSel=TotalCost(bs2rv(SelCh,FieldD)); %計運算元代目標函數值
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入
gen=gen+1;
%輸出最優解及其對應的10個變數的十進制值
[Y,I]=min(ObjVSel);
Y,X=bs2rv(Chrom(I,:),FieldD);
trace(gen,1)=min(ObjV);
trace(gen,2)=sum(ObjV)/length(ObjV);
end
plot(trace(:,1));hold on;
plot(trace(:,2),'-.');grid;
legend('種群均值的變換','最優解的變化');
顯然,根據模型的特徵,最優解應該是-10,自變數分別取-1,-1,-1,-1。大家可以安裝
GATBX,在Matlab中建立目標函數的.M文件以及遺傳演算法主程序的文件來進行試驗。
希望以上內容對學習和運用遺傳演算法的同仁有所幫助,因為本人也是初學,因此有不詳之處請
見諒。
////////////////////////////////////////////////////
matlab遺傳演算法工具箱函數及實例講解(轉引)
gaotv5
核心函數:
(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
是傳遞給變異函數的參數。
『柒』 遺傳演算法中為什麼GGAP=0.9而不是1呢不是默認GGAP=1嗎還有子種群subpop什麼意思,是並行演算法
GGAP代表了代溝,一般情況下我們會取0.6到0.9之間,
說明我們在選擇父代的時候有所取捨。
而且得到的子種群數量肯定減小了,因此,為了維系種群的整體規模,必須重插入部分個體進入子種群,使得父代與子代在數量上保持一致。
重插入的方法有很多,一般選擇輪盤賭法。
遺傳演算法是典型的並行演算法之一,在種群初始化,選擇,交叉,變異等操作中都可以設置為並行運算,大大降低運行速度。
『捌』 多目標遺傳演算法 目標函數的權重問題
推薦演算法中幾種常用的多目標變單一目標的方法:
(1)目標加權法:F(x)=∑λf(x),∑λ=1。λ可固定或隨機或自適應,加權求和之前一般需要進行無量綱化處理
(2)乘除法:min F(x)=(minf1×minf2×...)/(maxfn×maxfn+1×...).
(3)主要目標法/約束法:次要目標構成對主要目標的約束條件, 缺點:需要人為設定次要目標的約束參數
謝採納~
『玖』 遺傳演算法流程圖
首先你的這個問題沒有什麼意義,明顯x=31的時候y最大嘛。。。
%定義遺傳演算法參數
NIND=40; %個體數目(Number of indivials)
MAXGEN=25; %最大遺傳代數(Maximum number of generations)
PRECI=20; %變數的二進制位數(Precision of variables)
GGAP=0.9; %代溝(Generation gap)
trace=zeros(2, MAXGEN); %尋優結果的初始值
FieldD=[20;0;31;1;0;1;1]; %區域描述器(Build field descriptor)
Chrom=crtbp(NIND, PRECI); %初始種群
gen=0; %代計數器
variable=bs2rv(Chrom, FieldD); %計算初始種群的十進制轉換
ObjV=variable.*variable; %計算目標函數值
while gen<MAXGEN
FitnV=ranking(-ObjV); %分配適應度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %選擇
SelCh=recombin('xovsp', SelCh, 0.7); %重組
SelCh=mut(SelCh); %變異
variable=bs2rv(SelCh, FieldD); %子代個體的十進制轉換
ObjVSel=variable.*variable; %計運算元代的目標函數值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新種群
variable=bs2rv(Chrom, FieldD);
gen=gen+1; %代計數器增加
%輸出最優解及其序號,並在目標函數圖像中標出,Y為最優解,I為種群的序號
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, 'bo');
trace(1, gen)=max(ObjV); %遺傳演算法性能跟蹤
trace(2, gen)=sum(ObjV)/length(ObjV);
end
variable=bs2rv(Chrom, FieldD); %最優個體的十進制轉換
hold on, grid;
plot(variable,ObjV,'b*');
figure(2);
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid
legend('解的變化','種群均值的變化')
上面是這個問題的MATLAB程序,你自己研究一下吧
運行的時候需要MATLAB遺傳演算法工具箱
『拾』 關於遺傳演算法
遺傳演算法(Genetic Algorithm,簡稱GA)是美國 Michigan大學的 John Golland提出的一種建立在自然選擇和群體遺傳學機理基礎上的隨機、迭代、進化、具有廣泛適用性的搜索方法。現在已被廣泛用於學習、優化、自適應等問題中。圖4-1 給出了 GA搜索過程的直觀描述。圖中曲線對應一個具有復雜搜索空間(多峰空間)的問題。縱坐標表示適應度函數(目標函數),其值越大相應的解越優。橫坐標表示搜索點。顯然,用解析方法求解該目標函數是困難的。採用 GA時,首先隨機挑選若干個搜索點,然後分別從這些搜索點開始並行搜索。在搜索過程中,僅靠適應度來反復指導和執行 GA 搜索。在經過若干代的進化後,搜索點後都具有較高的適應度並接近最優解。
一個簡單GA由復制、雜交和變異三個遺傳運算元組成:
圖4-2 常規遺傳演算法流程圖