導航:首頁 > 五金知識 > 遺傳演算法工具箱求函數最小值

遺傳演算法工具箱求函數最小值

發布時間:2023-05-27 20:55:53

❶ 遺傳演算法求函數最小值 最小值怎麼算

用遺傳演算法求已知函數的最小值點的方法:1、首先建立自定義函數,f(x)ga_fun=@(x)11*sin(6*x)+7*cos(5*x);2、其二用ga()函數求解最小或祥值[x,fval,exitflag]=ga(ga_fun,1,[],[],[],[],lb) 3、悔團羨然後用ezplot()函數或plot()函數,繪出其函數f(x)的圖形及最小值點4、運行結果5、執碧拍行代碼

❷ 麻煩問一下,遺傳演算法工具箱函數求最小值的時候為什麼每一代都一樣,是沒有進化嗎還是哪裡出了問題

檢查一下約束條件,遺傳沒尺演算法的精華就是擇優,擇優未體現可能原因:一是可埋滾行解集合定義域,二是適應彎察余度定義域是不是沒有設置好

❸ 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程序。

需要很多的子函數
%子程序:新物種交叉操作,函數名稱存儲為crossover.m
function scro=crossover(population,seln,pc);
BitLength=size(population,2);
pcc=IfCroIfMut(pc);%根據交叉概率決定是否進行交叉操作,1則是,0則否
if pcc==1
chb=round(rand*(BitLength-2))+1;%在[1,BitLength-1]范圍內隨機產生一個交叉位
scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)]
scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)]
else
scro(1,:)=population(seln(1),:);
scro(2,:)=population(seln(2),:);
end
%子程序跡棚:計算適應度函數,函數名稱存儲余旦為fitnessfun.m
function [Fitvalue,cumsump]=fitnessfun(population);
global BitLength
global boundsbegin
global boundsend
popsize=size(population,1);%有popsize個個體
for i=1:popsize
x=transform2to10(population(i,:));%將二進制轉換為十進制
%轉化為[-2,2]區間的實數
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
Fitvalue(i)=targetfun(xx);%計算函數值,即適應度
end
%給適應度函數加上一個大豎州擾小合理的數以便保證種群適應度值為正數
Fitvalue=Fitvalue'+203;
%計算選擇概率
fsum=sum(Fitvalue);
Pperpopulation=Fitvalue/fsum;
%計算累計概率
cumsump(1)=Pperpopulation(1);
for i=2:popsize
cumsump(i)=cumsump(i-1)+Pperpopulation(i);
end
cumsump=cumsump';
%子程序:判斷遺傳運算是否需要進行交叉或變異,函數名稱存儲為IfCroIfMut.m
function pcc=IfCroIfMut(mutORcro);
test(1:100)=0;
l=round(100*mutORcro);
test(1:l)=1;
n=round(rand*99)+1;
pcc=test(n);
%子程序:新種群變異操作,函數名稱存儲為mutation.m
function snnew=mutation(snew,pmutation);
BitLength=size(snew,2);
snnew=snew;
pmm=IfCroIfMut(pmutation);%根據變異概率決定是否進行變異操作,1則是,0則否
if pmm==1
chb=round(rand*(BitLength-1))+1;%在[1,BitLength]范圍內隨機產生一個變異位
snnew(chb)=abs(snew(chb)-1);
end
%子程序:新種群選擇操作,函數名稱存儲為selection.m
function seln=selection(population,cumsump);
%從種群中選擇兩個個體
for i=1:2
r=rand;%產生一個隨機數
prand=cumsump-r;
j=1;
while prand(j)<0
j=j+1;
end
seln(i)=j;%選中個體的序號
end
%子程序:對於優化最大值或極大值函數問題,目標函數可以作為適應度函數
%函數名稱存儲為targetfun.m
function y=targetfun(x);%目標函數
%子程序:將二進制數轉換為十進制數,函數名稱存儲為transform2to10.m
function x=transform2to10(Population);
BitLength=size(Population,2);
x=Population(BitLength);
for i=1:BitLength-1
x=x+Population(BitLength-i)*power(2,i);
end
k=[0 0.1 0.2 0.3 0.5 1];
for i=1:1:5
%主程序:用遺傳演算法求解targetfun.m中目標函數在區間[-2,2]的最大值
clc;
clear all;
close all;
global BitLength
global boundsbegin
global boundsend
bounds=[-2 2];%一維自變數的取值范圍
precision=0.0001;%運算精度
boundsbegin=bounds(:,1);
boundsend=bounds(:,2);
%計算如果滿足求解精度至少需要多長的染色體
BitLength=ceil(log2((boundsend-boundsbegin)'./precision));
popsize=50;%初始種群大小
Generationmax=12;%最大代數
pcrossover=0.90;%交配概率
pmutation=0.09;%變異概率
%產生初始種群
population=round(rand(popsize,BitLength));
%計算適應度值,返回Fitvalue和累計概率cumsump
[Fitvalue,cumsump]=fitnessfun(population);
Generation=1;
while Generation<Generationmax+1
for j=1:2:popsize
%選擇操作
seln=selection(population,cumsump);
%交叉操作
scro=crossover(population,seln,pcrossover);
scnew(j,:)=scro(1,:);
scnew(j+1,:)=scro(2,:);
%變異操作
smnew(j,:)=mutation(scnew(j,:),pmutation);
smnew(j+1,:)=mutation(scnew(j+1,:),pmutation);
end%產生了新種群
population=smnew;
%計算新種群的適應度
[Fitvalue,cumsump]=fitnessfun(population);
%記錄當前代最好的適應度和平均適應度
[fmax,nmax]=max(Fitvalue);
fmean=mean(Fitvalue);
ymax(Generation)=fmax;
ymean(Generation)=fmean;
%記錄當前代的最佳染色體個體
x=transform2to10(population(nmax,:));
%自變數取值范圍是[-2 2],需要把經過遺傳運算的最佳染色體整合到[-2 2]區間
xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1);
xmax(Generation)=xx;
Generation=Generation+1;
end
Generation=Generation-1;
Bestpopuation=xx;
Besttargetfunvalue=targetfun(xx);
%繪制經過遺傳運算後的適應度曲線。一般地,如果進化過程中種群的平均適應度與最大適
%應度在曲線上有相互趨同的形態,表示演算法收斂進行得很順利,沒有出現震盪;在這種前
%提下,最大適應度個體連續若干代都沒有發生進化表明種群已經成熟
figure(1);
hand1=plot(1:Generation,ymax);
set(hand1,'linestyle','-','linewidth',1.8,'marker','*','markersize',6)
hold on;
hand2=plot(1:Generation,ymean);
set(hand2,'color','r','linestyle','-','linewidth',1.8,'marker','h','markersize',6)
xlabel('進化代數');ylabel('(最大/平均適應度)');xlim([1 Generationmax]);
legend('最大適應度','平均適應度');
box off;hold off;
y=(x(i)-k(i))^2-10*sin(2*pi*(x(i)-k(i)))+10;
end

❺ 為什麼我應用matlab自帶的遺傳演算法工具箱求函數最小值,,每次運行結果都不一樣

一樣才怪!遺傳演算法是一種帶有隨機性的搜索型的求解全局最優解的方法。隨機性就是在優化過程中變數的取值是隨機變化的,但是這種變化是朝向全局最優的方向隨機變化。但是當種群數量足夠大,而且進化代數足夠多的時候,最優解是具有穩定性的,雖然每次都不一樣,但是最優解的變化一般不會很大。

myfun沒有給出,這個是ga函數求解的部分設置,通過改變populationsize和generations可以達到獲得穩定最優解的目的。變異概率和雜交概率也有一定的影響,在局部收斂的情況下可以增大變異概率等來避免局部最優。

閱讀全文

與遺傳演算法工具箱求函數最小值相關的資料

熱點內容
路由器上有unknown連接是什麼設備 瀏覽:525
啟辰D50分離軸承多少錢 瀏覽:386
牙機雕刻機與電動工具 瀏覽:208
外匯期貨交易實驗裝置 瀏覽:791
設備投資怎麼算 瀏覽:95
好的攝影器材有哪些 瀏覽:463
溫州新五金製品有限公司怎麼樣 瀏覽:293
錦州五金機電城出租出售 瀏覽:417
卡爾蔡司公司有哪些醫學器材 瀏覽:261
重慶市機械鑿打岩石套什麼定額 瀏覽:557
閥門外面加個框是什麼意思 瀏覽:756
會議設備系統哪裡有 瀏覽:340
列印室需要哪些設備多少錢 瀏覽:577
通用型機床設備加工用於什麼 瀏覽:290
書畫工具箱套裝 瀏覽:772
燃燒固體需要哪些儀器 瀏覽:969
2213ktn1是什麼軸承 瀏覽:640
電腦固體硬碟怎麼加機械硬碟 瀏覽:197
崑山汽車門板超聲波焊接機怎麼樣 瀏覽:787
發說說怎麼隱藏設備 瀏覽:804