⑴ 什麼是遺傳演算法如何利用它進行結構優化,請形象的加以闡述。
如果要培養優良品種,我們就要先培育第一代,然後看他們的生長發育有什麼不同,然後呢,把好的個體雜交,壞的個體舍棄不要,好的個體再經過培育再次舍棄壞的合體,這樣依次類推經過很多代肯定可以搜索到新品種的。遺傳演算法在尋找最優解時候也是這個道理,先隨即生成一些數,這裡面有的接近最優值,有的不是的,這時候就計算他們各自的函數值,比較好的保留差的舍棄,好解再進行交叉變異等操作差生下一代,再次進行類操作,如此循環總可以找到最優的解。自己的話比較朴實,需要在理解要泡論壇了!
⑵ 遺傳演算法可以用來求多目標優化么
我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化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的工具箱就行了。
1st.設置種群規模,並初始化種群p,並計算各個個體的適應度。
例如,20個個體,每個個體包含5個變數,x1,x2,x3,x4,x5.
如果你用matlab來編程的話,這個可以很容易實現,會用到random('unif',a,b)這個函數吧。
例如x1的取值范圍是[0,1],那麼x1=random('unif',0,1).
2nd.採用輪盤賭選出可以產生後代的父本,p_parents。
額,輪盤賭的實質就是適應度大的被選出的概率大。這個不難,但說起來比較長,你可以自己去看一下。
3rd.雜交過程的思路隨機將p_parents中的個體隨機兩兩配對,然後隨機產生一個1到n的數(n為變數的個數),設為i,交換每對父本中i之後的變數值。交換以後的p_parents成為後代p_offspring.
這里變起來有點點復雜,不過只要耐心一點,編好配對過程和交換過程。
4th.變異過程,這個比較簡單,不過需要自己把握的較好。
基本的思路是設置一個概率,例如0.05,然後產生一個隨機數如果隨機數比0.05小那麼這個變數值就要產生微小的增加或減少。
這個變異過程要歷遍p_offspring所有的變數喔。
5th.將p和p_offspring合並起來,然後選出適應度大的,重新構成一個如原始種群規模相等的種群。
⑸ 遺傳演算法為什麼可以優化bp神經網路
遺傳演算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。遺傳演算法是從代表問題可能潛在的解集的一個種群(population)開始的,而一個種群則由經過基因(gene)編碼的一定數目的個體(indivial)組成。每個個體實際上是染色體(chromosome)帶有特徵的實體。染色體作為遺傳物質的主要載體,即多個基因的集合,其內部表現(即基因型)是某種基因組合,它決定了個體的形狀的外部表現,如黑頭發的特徵是由染色體中控制這一特徵的某種基因組合決定的。因此,在一開始需要實現從表現型到基因型的映射即編碼工作。由於仿照基因編碼的工作很復雜,我們往往進行簡化,如二進制編碼,初代種群產生之後,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,並藉助於自然遺傳學的遺傳運算元(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。這個過程將導致種群像自然進化一樣的後生代種群比前代更加適應於環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。
⑹ matlab上的遺傳演算法函數優化
用ga函數,ga函數就是遺傳演算法的函數,它的調用格式為:
x
=
ga(fitnessfcn,nvars,a,b,aeq,beq,lb,ub,nonlcon,options)
fitnessfcn就是待優化函數,nvars為變數個數,然後後面的lb是下界,ub是上界,你這個問題就需要這4個位置的參數,其他位置的參數用[]代替就行,由於ga函數默認是求待優化函數的最小值,所以要想求最大值需要把待優化函數取負,即編寫為
function
y=myfun(x)
y=-x.*sin(10*pi.*x)-2;
把這個函數存為myfun.m,然後在命令行里敲
x=ga(@myfun,1,[],[],[],[],[1],[2])
會返回
optimization
terminated:
average
change
in
the
fitness
value
less
than
options.tolfun.
x
=
1.8506
由於遺傳演算法的原理其實是在取值范圍內隨機選擇初值然後進行遺傳,所以可能每次運行給出的值都不一樣,比如再運行一次會返回
optimization
terminated:
average
change
in
the
fitness
value
less
than
options.tolfun.
x
=
1.6507
這個具體原因需要參考遺傳演算法的有關資料
⑺ 用遺傳演算法工具箱求解一個多目標優化問題,現在需要一個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值。
⑻ 如何用遺傳演算法實現多變數的最優化問題
將多個變數的數值編碼編排進去,進行組合。
⑼ 求一個遺傳演算法進行電力系統優化調度 代碼
發一份自編的MATLAB遺傳演算法代碼,用簡單遺傳演算法(Simple Genetic Algorithm or Standard Genetic Algorithm ,SGA)求取函數最大值,初版編寫於7年前上學期間,當時是MATLAB 5.x,在演算法運行效率方面做了修改,主要是採用矩陣操作減少了循環。
遺傳演算法為群體優化演算法,也就是從多個初始解開始進行優化,每個解稱為一個染色體,各染色體之間通過競爭、合作、單獨變異,不斷進化。
優化時先要將實際問題轉換到遺傳空間,就是把實際問題的解用染色體表示,稱為編碼,反過程為解碼,因為優化後要進行評價,所以要返回問題空間,故要進行解碼。SGA採用二進制編碼,染色體就是二進制位串,每一位可稱為一個基因;解碼時應注意將染色體解碼到問題可行域內。
遺傳演算法模擬「適者生存,優勝劣汰」的進化機制,染色體適應生存環境的能力用適應度函數衡量。對於優化問題,適應度函數由目標函數變換而來。一般遺傳演算法求解最大值問題,如果是最小值問題,則通過取倒數或者加負號處理。SGA要求適應度函數>0,對於<0的問題,要通過加一個足夠大的正數來解決。這樣,適應度函數值大的染色體生存能力強。
遺傳演算法有三個進化運算元:選擇(復制)、交叉和變異。
SGA中,選擇採用輪盤賭方法,也就是將染色體分布在一個圓盤上,每個染色體占據一定的扇形區域,扇形區域的面積大小和染色體的適應度大小成正比。如果輪盤中心裝一個可以轉動的指針的話,旋轉指針,指針停下來時會指向某一個區域,則該區域對應的染色體被選中。顯然適應度高的染色體由於所佔的扇形區域大,因此被選中的幾率高,可能被選中多次,而適應度低的可能一次也選不中,從而被淘汰。演算法實現時採用隨機數方法,先將每個染色體的適應度除以所有染色體適應度的和,再累加,使他們根據適應度的大小分布於0-1之間,適應度大的占的區域大,然後隨機生成一個0-1之間的隨機數,隨機數落到哪個區域,對應的染色體就被選中。重復操作,選出群體規模規定數目的染色體。這個操作就是「優勝劣汰,適者生存」,但沒有產生新個體。
交叉模擬有性繁殖,由兩個染色體共同作用產生後代,SGA採用單點交叉。由於SGA為二進制編碼,所以染色體為二進制位串,隨機生成一個小於位串長度的隨機整數,交換兩個染色體該點後的那部分位串。參與交叉的染色體是輪盤賭選出來的個體,並且還要根據選擇概率來確定是否進行交叉(生成0-1之間隨機數,看隨機數是否小於規定的交叉概率),否則直接進入變異操作。這個操作是產生新個體的主要方法,不過基因都來自父輩個體。
變異採用位點變異,對於二進制位串,0變為1,1變為0就是變異。採用概率確定變異位,對每一位生成一個0-1之間的隨機數,看是否小於規定的變異概率,小於的變異,否則保持原狀。這個操作能夠使個體不同於父輩而具有自己獨立的特徵基因,主要用於跳出局部極值。
遺傳演算法認為生物由低級到高級進化,後代比前一代強,但實際操作中可能有退化現象,所以採用最佳個體保留法,也就是曾經出現的最好個體,一定要保證生存下來,使後代至少不差於前一代。大致有兩種類型,一種是把出現的最優個體單獨保存,最後輸出,不影響原來的進化過程;一種是將最優個體保存入子群,也進行選擇、交叉、變異,這樣能充分利用模式,但也可能導致過早收斂。
由於是基本遺傳演算法,所以優化能力一般,解決簡單問題尚可,高維、復雜問題就需要進行改進了。
下面為代碼。函數最大值為3905.9262,此時兩個參數均為-2.0480,有時會出現局部極值,此時一個參數為-2.0480,一個為2.0480。演算法中變異概率pm=0.05,交叉概率pc=0.8。如果不採用最優模式保留,結果會更豐富些,也就是演算法最後不一定收斂於極值點,當然局部收斂現象也會有所減少,但最終尋得的解不一定是本次執行中曾找到過的最好解。
(註:一位網名為mosquitee的朋友提醒我:原代碼的變異點位置有問題。檢驗後發現是將最初的循環實現方法改為矩陣實現方法時為了最優去掉mm的第N行所致,導致變異點位置發生了變化,現做了修改,修改部分加了顏色標記,非常感謝mosquitee,2010-4-22)
% Optimizing a function using Simple Genetic Algorithm with elitist preserved
%Max f(x1,x2)=100*(x1*x1-x2).^2+(1-x1).^2; -2.0480<=x1,x2<=2.0480
% Author: Wang Yonglin ([email protected])
clc;clear all;
format long;%設定數據顯示格式
%初始化參數
T=100;%模擬代數
N=80;% 群體規模
pm=0.05;pc=0.8;%交叉變異概率
umax=2.048;umin=-2.048;%參數取值范圍
L=10;%單個參數字串長度,總編碼長度2L
bval=round(rand(N,2*L));%初始種群
bestv=-inf;%最優適應度初值
%迭代開始
for ii=1:T
%解碼,計算適應度
for i=1:N
y1=0;y2=0;
for j=1:1:L
y1=y1+bval(i,L-j+1)*2^(j-1);
end
x1=(umax-umin)*y1/(2^L-1)+umin;
for j=1:1:L
y2=y2+bval(i,2*L-j+1)*2^(j-1);
end
x2=(umax-umin)*y2/(2^L-1)+umin;
obj(i)=100*(x1*x1-x2).^2+(1-x1).^2; %目標函數
xx(i,:)=[x1,x2];
end
func=obj;%目標函數轉換為適應度函數
p=func./sum(func);
q=cumsum(p);%累加
[fmax,indmax]=max(func);%求當代最佳個體
if fmax>=bestv
bestv=fmax;%到目前為止最優適應度值
bvalxx=bval(indmax,:);%到目前為止最佳位串
optxx=xx(indmax,:);%到目前為止最優參數
end
Bfit1(ii)=bestv; % 存儲每代的最優適應度
%%%%遺傳操作開始
%輪盤賭選擇
for i=1:(N-1)
r=rand;
tmp=find(r<=q);
newbval(i,:)=bval(tmp(1),:);
end
newbval(N,:)=bvalxx;%最優保留
bval=newbval;
%單點交叉
for i=1:2:(N-1)
cc=rand;
if cc<pc
point=ceil(rand*(2*L-1));%取得一個1到2L-1的整數
ch=bval(i,:);
bval(i,point+1:2*L)=bval(i+1,point+1:2*L);
bval(i+1,point+1:2*L)=ch(1,point+1:2*L);
end
end
bval(N,:)=bvalxx;%最優保留
%位點變異
mm=rand(N,2*L)<pm;%N行
mm(N,:)=zeros(1,2*L);%最後一行不變異,強制賦0
bval(mm)=1-bval(mm);
end
%輸出
plot(Bfit1);% 繪制最優適應度進化曲線
bestv %輸出最優適應度值
optxx %輸出最優參數
⑽ 遺傳演算法的優缺點
優點:
1、遺傳演算法是以決策變數的編碼作為運算對象,可以直接對集合、序列、矩陣、樹、圖等結構對象進行操作。這樣的方式一方面有助於模擬生物的基因、染色體和遺傳進化的過程,方便遺傳操作運算元的運用。
另一方面也使得遺傳演算法具有廣泛的應用領域,如函數優化、生產調度、自動控制、圖像處理、機器學習、數據挖掘等領域。
2、遺傳演算法直接以目標函數值作為搜索信息。它僅僅使用適應度函數值來度量個體的優良程度,不涉及目標函數值求導求微分的過程。因為在現實中很多目標函數是很難求導的,甚至是不存在導數的,所以這一點也使得遺傳演算法顯示出高度的優越性。
3、遺傳演算法具有群體搜索的特性。它的搜索過程是從一個具有多個個體的初始群體P(0)開始的,一方面可以有效地避免搜索一些不必搜索的點。
另一方面由於傳統的單點搜索方法在對多峰分布的搜索空間進行搜索時很容易陷入局部某個單峰的極值點,而遺傳演算法的群體搜索特性卻可以避免這樣的問題,因而可以體現出遺傳演算法的並行化和較好的全局搜索性。
4、遺傳演算法基於概率規則,而不是確定性規則。這使得搜索更為靈活,參數對其搜索效果的影響也盡可能的小。
5、遺傳演算法具有可擴展性,易於與其他技術混合使用。以上幾點便是遺傳演算法作為優化演算法所具備的優點。
缺點:
1、遺傳演算法在進行編碼時容易出現不規范不準確的問題。
2、由於單一的遺傳演算法編碼不能全面將優化問題的約束表示出來,因此需要考慮對不可行解採用閾值,進而增加了工作量和求解時間。
3、遺傳演算法效率通常低於其他傳統的優化方法。
4、遺傳演算法容易出現過早收斂的問題。
(10)遺傳演算法求優化擴展閱讀
遺傳演算法的機理相對復雜,在Matlab中已經由封裝好的工具箱命令,通過調用就能夠十分方便的使用遺傳演算法。
函數ga:[x, fval,reason]= ga(@fitnessfun, nvars, options)x是最優解,fval是最優值,@fitnessness是目標函數,nvars是自變數個數,options是其他屬性設置。系統默認求最小值,所以在求最大值時應在寫函數文檔時加負號。
為了設置options,需要用到下面這個函數:options=gaoptimset('PropertyName1', 'PropertyValue1', 'PropertyName2', 'PropertyValue2','PropertyName3', 'PropertyValue3', ...)通過這個函數就能夠實現對部分遺傳演算法的參數的設置。