matlab遺傳演算法實例
Ⅰ matlab遺傳演算法實例求指導
主函數m文件代碼:
lb=[0.2 1.234 0.01 1190 0.15];
ub=[0.4 3 0.04 1398 0.4];
x0=lb;
[x,fval]=fmincon('llzy',x0,[],[],[],[],lb,ub);
目標函數m文件代碼:
function y=llzy(x)
y=(0.0206*x(2)^2/(2*9.81*x(1))+(0.5*(1-(x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2))))+((0.25*(x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2)))-1)^2+x(5)*x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2)))^0.5)*(x(4)/1040-1)+1.8413*(x(2)/(9.81*x(1)))^2.7736*(0.5*(1-(x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2))))+((0.25*(x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2)))-1)^2+x(5)*x(2)/(4*x(3)*9.81*(x(4)-1040)/(3*0.43*1040))^0.5*(1-(x(3)/x(1))^2)*exp(-(2.65*x(5)-3.32*x(5)^2.2)))^0.5)*0.43*x(3)/x(1)*(x(4)/1040-1))/(x(4)*x(5)/1040);
Ⅱ matlab遺傳演算法求函數最小值問題!
如果你的函數是求maxf(x)的問題,要編程求最小值問題,那麼你需要對這個函數取負值求最小值即可
舉例來說:
求max(z)=ax+bx^2
等同於
求min(z)=-(ax+bx^2)
-----------------------------------------
我這里有一個使用matlab遺傳演算法工具箱的案例,你可以用來快速求解,如果你想自己編程實現遺傳演算法,可以加我QQ:34508855
核心函數: (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
Ⅲ 如何用matlab解決多元遺傳演算法問題
如何用matlab解決多元遺傳演算法的極值問題?可以按下列步驟做
1、首先,建立自定義帶條件的最大值目標函數文件,ga_fun.m
if x(1)+x(2)>=-1
y=-(exp(-0.1*(x(1)^4+x(2)^4))+ exp(cos(2*pi*x(1))+cos(2*pi*x(2)))
)
else
y=inf
end
式中:x=x(1),y=x(2)
2、利用ga遺傳演算法工具箱求解
3、在工具箱中,Fitness function項輸入@ga_fun;Number of variables項輸入2;Lower項輸入[-1,2];Upper項輸入[2,1];
4、點擊Start按鈕,運行可以得到 fmax(0,0)值(Objective function value)。說明這里負號是最大值的標志
運行界面
Ⅳ 在matlab中如何用遺傳演算法求極值
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是傳遞給變異函數的參數。
Ⅳ 遺傳演算法的matlab代碼實現是什麼
遺傳演算法我懂,我的論文就是用著這個演算法,具體到你要遺傳演算法是做什麼?優化什麼的。。。我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化BP神經網路函數極值尋優:
%% 該代碼為基於神經網路遺傳演算法的系統極值尋優
%% 清空環境變數
clc
clear
%% 初始化遺傳演算法參數
%初始化參數
maxgen=100; %進化代數,即迭代次數
sizepop=20; %種群規模
pcross=[0.4]; %交叉概率選擇,0和1之間
pmutation=[0.2]; %變異概率選擇,0和1之間
lenchrom=[1 1]; %每個變數的字串長度,如果是浮點變數,則長度都為1
bound=[-5 5;-5 5]; %數據范圍
indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個結構體
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%% 初始化種群計算適應度值
% 初始化種群
for i=1:sizepop
%隨機產生一個種群
indivials.chrom(i,:)=Code(lenchrom,bound);
x=indivials.chrom(i,:);
%計算適應度
indivials.fitness(i)=fun(x); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
%% 迭代尋優
% 進化開始
for i=1:maxgen
i
% 選擇
indivials=Select(indivials,sizepop);
avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 變異
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,[i maxgen],bound);
% 計算適應度
for j=1:sizepop
x=indivials.chrom(j,:); %解碼
indivials.fitness(j)=fun(x);
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次進化中最好的染色體
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;
avgfitness=sum(indivials.fitness)/sizepop;
trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%進化結束
%% 結果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('適應度曲線','fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);
axis([0,100,0,1])
disp('適應度 變數');
x=bestchrom;
% 窗口顯示
disp([bestfitness x]);
Ⅵ 用matlab實現的遺傳演算法
f=inline('-(x+10*sin(5*x)+7*cos(4*x))');
[x,val]=ga(f,1,[],[],[],[],0,9);
x,val=-val%註:由於遺傳法的不確定性,每次得到的解可能不同。
————————————————————————————————
ga是matlab自帶的遺傳工具箱中的遺傳演算法函數,其中已經用到了選擇、交叉、變異,你如果想知道其具體是怎麼實現的,可以自己打開ga的源程序去看。
Ⅶ 求遺傳演算法的matlab程序
function
my_ga()
options=gaoptimset;
%設置變數范圍
options=gaoptimset(options,'PopInitRange',[0;9]);
%設置種群大小
options=gaoptimset(options,'PopulationSize',100);
%設置迭代次數
options=gaoptimset(options,'Generations',100);
%選擇選擇函數
options=gaoptimset(options,'SelectionFcn',@selectionroulette);
%選擇交叉函數
options=gaoptimset(options,'CrossoverFcn',@crossoverarithmetic);
%選擇變異函數
options=gaoptimset(options,'MutationFcn',@mutationuniform);
%設置繪圖:解的變化、種群平均值的變化
options=gaoptimset(options,'PlotFcns',{@gaplotbestf});
%執行遺傳演算法,fitness.m是函數文件
[x,fval]=ga(@fitness,1,options)
Ⅷ matlab 遺傳演算法
function m_main()
clear
clc
Max_gen=100;% 運行代數
pop_size=100;%種群大小
chromsome=10;%染色體的長度
pc=0.9;%交叉概率
pm=0.25;%變異概率
gen=0;%統計代數
%初始化
init=40*rand(pop_size,chromsome)-20;
pop=init;
fit=obj_fitness(pop);
[max_fit,index_max]=max(fit);maxfit=max_fit;
[min_fit,index_min]=min(fit);best_indiv=pop(index_max,:);
%迭代操作
while gen<Max_gen
gen=gen+1; bt(gen)=max_fit;
if maxfit<max_fit;maxfit=max_fit;pop(index_min,:)=pop(index_max,:);best_indiv=pop(index_max,:);end
best_indiv_tmp(gen)=pop(index_max);
newpop=ga(pop,pc,pm,chromsome,fit);
fit=obj_fitness(newpop);
[max_fit,index_max]=max(fit);
[min_fit,index_min]=min(fit);
pop=newpop;
trace(1,gen)=max_fit;
trace(2,gen)=sum(fit)./length(fit);
end
%運行結果
[f_max gen_ct]=max(bt)%求的最大值以及代數
maxfit
best_indiv
%畫圖
% bt
hold on
plot(trace(1,:),'.g:');
plot( trace(2,:),'.r-');
title('實驗結果圖')
xlabel('迭代次數/代'),ylabel('最佳適應度(最大值)');%坐標標注
plot(gen_ct-1,0:0.1:f_max+1,'c-');%畫出最大值
text(gen_ct,f_max+1, '最大值')
hold off
function [fitness]=obj_fitness(pop)
%適應度計算函數
[r c]=size(pop);
x=pop;
fitness=zeros(r,1);
for i=1:r
for j=1:c
fitness(i,1)=fitness(i,1)+sin(sqrt(abs(40*x(i))))+1-abs(x(i))/20.0;
end
end
function newpop=ga(pop,pc,pm,chromsome,fit);
pop_size=size(pop,1);
%輪盤賭選擇
ps=fit/sum(fit);
pscum=cumsum(ps);%size(pscum)
r=rand(1,pop_size);qw=pscum*ones(1,pop_size);
selected=sum(pscum*ones(1,pop_size)<ones(pop_size,1)*r)+1;
newpop=pop(selected,:);
%交叉
if pop_size/2~=0
pop_size=pop_size-1;
end
for i=1:2:pop_size-1
while pc>rand
c_pt=round(8*rand+1);
pop_tp1=newpop(i,:);pop_tp2=newpop(i+1,:);
newpop(i+1,1:c_pt)=pop_tp1(1,1:c_pt);
newpop(i,c_pt+1:chromsome)=pop_tp2(1,c_pt+1:chromsome);
end
end
% 變異
for i=1:pop_size
if pm>rand
m_pt=1+round(9*rand);
newpop(i,m_pt)=40*rand-20;
end
end