導航:首頁 > 五金知識 > matlab遺傳演算法工具箱應用實例

matlab遺傳演算法工具箱應用實例

發布時間:2023-09-18 02:55:40

A. 如何調用MATLAB遺傳演算法工具箱

1、打開MATLAB軟體。

B. 雷英傑編著的《MATLAB遺傳演算法工具箱及應用》第七章的第一個例子

程序倒數第六行應該是variable',還有注釋掉倒數12行。把hold on的分號都去掉。
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;
legend('解的變化','種群均值的變化')

C. MATLAB遺傳演算法

function ret=Code(lenchrom,bound)
%本函數將變數編碼成染色體,用於隨機初始化一個種群
% lenchrom input : 染色體長度
% bound input : 變數的取值范圍
% ret output: 染色體的編碼值

flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %線性插值
flag=test(lenchrom,bound,ret); %檢驗染色體的可行性
end
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函數完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色體的長度
% chrom input : 染色體群
% sizepop input : 種群規模
% ret output : 交叉後的染色體

for i=1:sizepop

% 隨機選擇兩個染色體進行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率決定是否進行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
flag=0;
while flag==0
% 隨機選擇交叉位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %隨機選擇進行交叉的位置,即選擇第幾個變數進行交叉,注意:兩個染色體交叉的位置相同
pick=rand; %交叉開始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉結束
flag1=test(lenchrom,bound,chrom(index(1),:)); %檢驗染色體1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %檢驗染色體2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果兩個染色體不是都可行,則重新交叉
end
end
ret=chrom;

clc
clear all
% warning off

%% 遺傳演算法參數
maxgen=50; %進化代數
sizepop=100; %種群規模
pcross=[0.6]; %交叉概率
pmutation=[0.1]; %變異概率
lenchrom=[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)= (x(1)*exp(-(x(1)^2 + x(2)^2)));
%-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289
% 這個是我的測試函數
% 如果有這個函數的話,可以得到最優值

end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[];

%% 進化開始
for i=1:maxgen

% 選擇操作
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)=(x(1)*exp(-(x(1)^2 + x(2)^2)));
%-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289
% -20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289;

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);
figure
plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');
title(['函數值曲線 ' '終止代數=' num2str(maxgen)],'fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('函數值','fontsize',12);
legend('各代平均值','各代最佳值','fontsize',12);
ylim([-0.5 5])
disp('函數值 變數');
% 窗口顯示
disp([bestfitness x]);

D. 使用matlab遺傳演算法工具箱如何加入目標函數中變數的約束條件啊,可否在M文件中加

首先回答你第一個問題:怎麼加入變數的約束條件?

打開遺傳演算法工具箱的窗體中會有下圖所示的選項,即是約束條件的編輯

至於添加的方式,這里要重點的提一下,首先將問題抽象成規劃問題的標准形式(如果你不懂什麼是標准形式的話,建議你去翻閱運籌學那本書,上告訴你什麼是標准形式),然後用矩陣語言寫出來,最後將矩陣的系數填寫到線性不等約束和線性相等約束中,同時定義所求變數x的上界和下界(記住有多少個變數就有多少列,如果你發現有些條件中沒有出現某些變數,那麼就應該用0補足,這個是matlab解決規劃問題與lingo想比較麻煩的一個地方,)。

然後回答你第二個問題:可否在M文件中添加約束條件?

當然可以,界面的東西是為了方便不熟悉matlab編程的人而設計出來的,但是其底層的演算法和介面肯定是有的。

碰到不懂的函數,請記得:help函數名

helpga之後會得到一下一些函數

ga

//這個是定義

Syntax //這個是語法也即是調用的規則

x=ga(fitnessfcn,nvars)

x=ga(fitnessfcn,nvars,A,b)

x=ga(fitnessfcn,nvars,A,b,Aeq,beq)

x=ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB)

x=ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon)

x=ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)

x=ga(problem)

[x,fval]=ga(...)

[x,fval,exitflag]=ga(...)

直接給你將最長的那個吧

x=ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)

X是返回所求的解

fitnessfcn是適應度函數

nvars是適應度函數中所含變數的維數

A是不等式約束中變數的系數矩陣,b是不等式約束中不含變數的值矩陣

Aeq是等式約束中變數的系數矩陣,beq是等式約束中不含變數的值矩陣

LB是下界,UB是上界

nonlcon是非線性約束條件

至於options嘛 我也木有用過,其實你也可以不用管的。

懂了木有呢,親?

E. 用遺傳演算法工具箱求解一個多目標優化問題,現在需要一個matlab程序,求高人指點

用遺傳演算法工具箱求解一個多目標優化問題的步驟:

1、根據題意,建立自定專義目標函數,ga_fun1(x)

2、在命令窗屬口中,輸入

>> optimtool %調用遺傳演算法工具箱

3、在遺傳演算法工具箱界面中,分別對Fitnessfunction框內輸入@ga_fun1();A框內輸入[1,1,1];b框內輸入16;Aeq框內輸入[];beq框內輸入[];Lower框內輸入[0,0,0];Upper框內輸入[];

4、單擊Start。得到x=4.508 y=2.513 z=1.912值。

F. 求解:怎樣使用MATLAB中的遺傳演算法計算器Optimization Tool中的GA——Genetic Algorithm,如圖,重謝

比如通過MATLAB遺傳演算法的思想求解f(x)=x*sin(10pi*x)+2.0,-1<=x<=2的最大值問題,結果精確版到3位小數。

首先在matlab命令權窗口輸入f=@(x)-(x*sin(10*pi*x)+2) 輸出結果為

>> f=@(x)-(x*sin(10*pi*x)+2)

f =

@(x)-(x*sin(10*pi*x)+2)

接著輸入gatool會打開遺傳演算法工具箱

顯示51代之後演算法終止,最小結果為-3.85027334719567,對應的x為1.851,由於自定義函數加了負號,所以原式的最大值為3.85027334719567,對應的x為1.851。

不過這是遺傳演算法得到的結果,每次運行的結果可能會有所不同,而且不一定是確切的最大值。

遺傳演算法適合應用在一些求最優解比較復雜的問題(常規的演算法運算時間過長,甚至無法解決)。

G. matlab遺傳演算法工具箱及應用的內容簡介

本書系統介紹MATLAB遺傳演算法和直接搜索工具箱的功能特點、編程原理及使用方法。全書共分為9章。第一章至第四章介紹遺傳演算法的基礎知識,包括遺傳演算法的基本原理,編碼、選擇、交叉、變異,適應度函數,控制參數選擇,約束條件處理,模式定理,改進的遺傳演算法,早熟收斂問題及其防止等。第五章至第七章介紹英國設菲爾德(Sheffield)大學的MATLAB遺傳演算法工具箱及其使用方法,舉例說明如何利用遺傳演算法工具箱函數編寫求解實際優化問題的MATLAB程序。第八章和第九章介紹MathWorks公司最新發布的MATLAB遺傳演算法與直接搜索工具箱及其使用方法。
本書取材新穎,內容豐富,邏輯嚴謹,語言通俗,理例結合,圖文並茂,注重基礎,面向應用。書中包含大量的實例,便於自學和應用。

閱讀全文

與matlab遺傳演算法工具箱應用實例相關的資料

熱點內容
客機為什麼不能設計逃生裝置 瀏覽:11
煤礦c級儀表是什麼意思 瀏覽:681
通風管道中閥門是否包括 瀏覽:583
汽車儀表盤上的膠怎麼辦 瀏覽:769
儀表盤istop亮是什麼 瀏覽:39
蛋糕麵包機械大概多少錢一個 瀏覽:562
空調製冷的正常是什麼狀態 瀏覽:910
久裕交通器材怎麼出口 瀏覽:821
碳酸鈣生產管道用閥門 瀏覽:596
洗衣機放水閥門彈簧怎麼安裝 瀏覽:150
蘋果手機怎麼添加別人的設備 瀏覽:721
哈弗儀表出現感嘆號什麼原因 瀏覽:304
三星手機熱點僅限允許設備怎麼取消 瀏覽:653
機床台板是什麼材料 瀏覽:532
機械制圖什麼時候用細實線 瀏覽:381
大眾朗逸工具箱 瀏覽:43
手持電動工具電源線應怎麼樣接安全 瀏覽:83
關閥門為什麼會回火 瀏覽:644
手動機械表保護裝置 瀏覽:942
排氣閥門井井室安裝圖集 瀏覽:720