A. 遺傳演算法求最小值點
用遺傳演算法求已知函數的最小值點的方法:
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、運行結果
B. 如何使用遺傳演算法或神經網路在MATLAB 中求二元函數最小值
你最好能提供具體的二元函數表達式,這樣就可以有目的去幫你解決。一般遺傳演算法可以用ga()函數來求解。例如:
fun = @(x) (x(1) - 0.2)^2 + (x(2) - 1.7)^2
x = ga(fun,2)
執行結果
x = 0.20208 1.6766
C. 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
D. 為什麼我應用matlab自帶的遺傳演算法工具箱求函數最小值,,每次運行結果都不一樣
一樣才怪!遺傳演算法是一種帶有隨機性的搜索型的求解全局最優解的方法。隨機性就是在優化過程中變數的取值是隨機變化的,但是這種變化是朝向全局最優的方向隨機變化。但是當種群數量足夠大,而且進化代數足夠多的時候,最優解是具有穩定性的,雖然每次都不一樣,但是最優解的變化一般不會很大。
myfun沒有給出,這個是ga函數求解的部分設置,通過改變populationsize和generations可以達到獲得穩定最優解的目的。變異概率和雜交概率也有一定的影響,在局部收斂的情況下可以增大變異概率等來避免局部最優。
E. 在matlab中如何用遺傳演算法求解函數和的最小值
用遺傳演算法求已知函數的最小值點的方法: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、執行代碼
F. 利用遺傳演算法求函數的極小值和極大值的區別
用遺傳演算法求已知函數的最小值點的方法: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、執行代碼
G. 遺傳演算法求一個目標函數的最小值,但不論迭代多少次,每次的結果都是一樣的,這是為什麼。
電氣同行?
你的遺傳演算法相當於沒有進化呢 把你問題的模型和代碼貼出來或許能幫上忙……
H. matlab遺傳演算法求函數極小值!!!急!!
如果沒有其他約束條件,直接用ga求解:
>>fi=inline('-2.113-0.1326*x(1)+10.49*x(2)+0.1505*x(1)^2-2.924*x(1)*x(2)+10.11*x(2)^2','x');
>>ga(fi,2,[],[],[],[],[018],[0.136])
Optimizationterminated:.TolFun.
ans=
0.100018.0000
即最小值在x=0.1、y=18處。
直接畫出函數的圖像來,可以驗證結論的正確性:
ezmesh('-2.113-0.1326*x+10.49*y+0.1505*x^2-2.924*x*y+10.11*y^2',[00.1],[1836])
I. 如何用遺傳演算法求函數最小值
可以這樣,用這兩個限制條件的等式把8個未知量的目標函數降維成6個未知量的目標函數,把這個作為適應度函數,問題轉變成6個未知量,限制條件0<=xi<=1,的遺傳演算法問題。這個目標函數是線性的應該很容易搜索出最小值。我最近在研究遺傳演算法,歡迎私信交流。
J. 怎麼用遺傳演算法求一函數的極小值,編寫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