重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
有兩種可能:1.有多種組合等于X,因此組合有多種
目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、蓮都網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
2.你的遺傳算法容易局部收斂
對(duì)于2解決辦法:增加判斷,當(dāng)種群最優(yōu)染色體一直不變持續(xù)N代,重新初始化一個(gè)種群,或者往種群中注入新的隨機(jī)染色體來(lái)跳出局部收斂區(qū)域。
對(duì)補(bǔ)充的回答:
遺傳算法本身就是一種智能尋優(yōu)的隨機(jī)算法,搜索過(guò)程中存在隨機(jī)性,在具有多個(gè)最優(yōu)解的情況下,很難每次都尋優(yōu)到同一組參數(shù)組合,因?yàn)槊看蔚乃阉髀窂绞遣煌摹?/p>
如果樓主真是尋求最后結(jié)果一樣的效果的話,可以先得到一組最優(yōu)組合數(shù)字集合S,按從小到大排列處理后變?yōu)镾'(n1,n2...ni)
然后搜索過(guò)程中的某組數(shù)字集合Q的目標(biāo)函數(shù)
既滿足:
相加的和最接近X,
還要滿足:
1.數(shù)字個(gè)數(shù)=i
2.臨時(shí)將Q從小達(dá)到排列,各個(gè)位置上的元素和S'的元素最接近
這樣可能會(huì)增加很多計(jì)算時(shí)間,但理論上是可以每次都得到S
遺傳算法(Genetic Algorithm, GA)是近幾年發(fā)展起來(lái)的一種嶄新的全局優(yōu)化算法,它借
用了生物遺傳學(xué)的觀點(diǎn),通過(guò)自然選擇、遺傳、變異等作用機(jī)制,實(shí)現(xiàn)各個(gè)個(gè)體的適應(yīng)性
的提高。這一點(diǎn)體現(xiàn)了自然界中"物競(jìng)天擇、適者生存"進(jìn)化過(guò)程。1962年Holland教授首次
提出了GA算法的思想,從而吸引了大批的研究者,迅速推廣到優(yōu)化、搜索、機(jī)器學(xué)習(xí)等方
面,并奠定了堅(jiān)實(shí)的理論基礎(chǔ)。 用遺傳算法解決問(wèn)題時(shí),首先要對(duì)待解決問(wèn)題的模型結(jié)構(gòu)
和參數(shù)進(jìn)行編碼,一般用字符串表示,這個(gè)過(guò)程就將問(wèn)題符號(hào)化、離散化了。也有在連續(xù)
空間定義的GA(Genetic Algorithm in Continuous Space, GACS),暫不討論。
一個(gè)串行運(yùn)算的遺傳算法(Seguential Genetic Algoritm, SGA)按如下過(guò)程進(jìn)行:
(1) 對(duì)待解決問(wèn)題進(jìn)行編碼;
(2) 隨機(jī)初始化群體X(0):=(x1, x2, … xn);
(3) 對(duì)當(dāng)前群體X(t)中每個(gè)個(gè)體xi計(jì)算其適應(yīng)度F(xi),適應(yīng)度表示了該個(gè)體的性能好
壞;
(4) 應(yīng)用選擇算子產(chǎn)生中間代Xr(t);
(5) 對(duì)Xr(t)應(yīng)用其它的算子,產(chǎn)生新一代群體X(t+1),這些算子的目的在于擴(kuò)展有限
個(gè)體的覆蓋面,體現(xiàn)全局搜索的思想;
(6) t:=t+1;如果不滿足終止條件繼續(xù)(3)。
GA中最常用的算子有如下幾種:
(1) 選擇算子(selection/reproduction): 選擇算子從群體中按某一概率成對(duì)選擇個(gè)
體,某個(gè)體xi被選擇的概率Pi與其適應(yīng)度值成正比。最通常的實(shí)現(xiàn)方法是輪盤(pán)賭(roulett
e wheel)模型。
(2) 交叉算子(Crossover): 交叉算子將被選中的兩個(gè)個(gè)體的基因鏈按概率pc進(jìn)行交叉
,生成兩個(gè)新的個(gè)體,交叉位置是隨機(jī)的。其中Pc是一個(gè)系統(tǒng)參數(shù)。
(3) 變異算子(Mutation): 變異算子將新個(gè)體的基因鏈的各位按概率pm進(jìn)行變異,對(duì)
二值基因鏈(0,1編碼)來(lái)說(shuō)即是取反。
上述各種算子的實(shí)現(xiàn)是多種多樣的,而且許多新的算子正在不斷地提出,以改進(jìn)GA的
某些性能。系統(tǒng)參數(shù)(個(gè)體數(shù)n,基因鏈長(zhǎng)度l,交叉概率Pc,變異概率Pm等)對(duì)算法的收斂速度
及結(jié)果有很大的影響,應(yīng)視具體問(wèn)題選取不同的值。
GA的程序設(shè)計(jì)應(yīng)考慮到通用性,而且要有較強(qiáng)的適應(yīng)新的算子的能力。OOP中的類的繼
承為我們提供了這一可能。
定義兩個(gè)基本結(jié)構(gòu):基因(ALLELE)和個(gè)體(INDIVIDUAL),以個(gè)體的集合作為群體類TP
opulation的數(shù)據(jù)成員,而TSGA類則由群體派生出來(lái),定義GA的基本操作。對(duì)任一個(gè)應(yīng)用實(shí)
例,可以在TSGA類上派生,并定義新的操作。
TPopulation類包含兩個(gè)重要過(guò)程:
FillFitness: 評(píng)價(jià)函數(shù),對(duì)每個(gè)個(gè)體進(jìn)行解碼(decode)并計(jì)算出其適應(yīng)度值,具體操
作在用戶類中實(shí)現(xiàn)。
Statistic: 對(duì)當(dāng)前群體進(jìn)行統(tǒng)計(jì),如求總適應(yīng)度sumfitness、平均適應(yīng)度average、最好
個(gè)體fmax、最壞個(gè)體fmin等。
TSGA類在TPopulation類的基礎(chǔ)上派生,以GA的系統(tǒng)參數(shù)為構(gòu)造函數(shù)的參數(shù),它有4個(gè)
重要的成員函數(shù):
Select: 選擇算子,基本的選擇策略采用輪盤(pán)賭模型(如圖2)。輪盤(pán)經(jīng)任意旋轉(zhuǎn)停止
后指針?biāo)赶騾^(qū)域被選中,所以fi值大的被選中的概率就大。
Crossover: 交叉算子,以概率Pc在兩基因鏈上的隨機(jī)位置交換子串。
Mutation: 變異算子,以概率Pm對(duì)基因鏈上每一個(gè)基因進(jìn)行隨機(jī)干擾(取反)。
Generate: 產(chǎn)生下代,包括了評(píng)價(jià)、統(tǒng)計(jì)、選擇、交叉、變異等全部過(guò)程,每運(yùn)行一
次,產(chǎn)生新的一代。
SGA的結(jié)構(gòu)及類定義如下(用C++編寫(xiě)):
[code] typedef char ALLELE; // 基因類型
typedef struct{
ALLELE *chrom;
float fitness; // fitness of Chromosome
}INDIVIDUAL; // 個(gè)體定義
class TPopulation{ // 群體類定義
public:
int size; // Size of population: n
int lchrom; // Length of chromosome: l
float sumfitness, average;
INDIVIDUAL *fmin, *fmax;
INDIVIDUAL *pop;
TPopulation(int popsize, int strlength);
~TPopulation();
inline INDIVIDUAL Individual(int i){ return pop[i];};
void FillFitness(); // 評(píng)價(jià)函數(shù)
virtual void Statistics(); // 統(tǒng)計(jì)函數(shù)
};
class TSGA : public TPopulation{ // TSGA類派生于群體類
public:
float pcross; // Probability of Crossover
float pmutation; // Probability of Mutation
int gen; // Counter of generation
TSGA(int size, int strlength, float pm=0.03, float pc=0.6):
TPopulation(size, strlength)
{gen=0; pcross=pc; pmutation=pm; } ;
virtual INDIVIDUAL Select();
virtual void Crossover(INDIVIDUAL parent1, INDIVIDUAL parent2,
INDIVIDUAL child1, INDIVIDUAL child2);
child1, INDIVIDUAL child2);
virtual ALLELE Mutation(ALLELE alleleval);
virtual void Generate(); // 產(chǎn)生新的一代
};
用戶GA類定義如下:
class TSGAfit : public TSGA{
public:
TSGAfit(int size,float pm=0.0333,float pc=0.6)
:TSGA(size,24,pm,pc){};
void print();
}; [/code]
由于GA是一個(gè)概率過(guò)程,所以每次迭代的情況是不一樣的;系統(tǒng)參數(shù)不同,迭代情況
也不同。在實(shí)驗(yàn)中參數(shù)一般選取如下:個(gè)體數(shù)n=50-200,變異概率Pm=0.03, 交叉概率Pc=
0.6。變異概率太大,會(huì)導(dǎo)致不穩(wěn)定。
參考文獻(xiàn)
● Goldberg D E. Genetic Algorithm in Search, Optimization, and machine
Learning. Addison-Wesley, Reading, MA, 1989
● 陳根社、陳新海,"遺傳算法的研究與進(jìn)展",《信息與控制》,Vol.23,
NO.4, 1994, PP215-222
● Vittorio Maniezzo, "Genetic Evolution of the Topology and Weight Distri
bution of the Neural Networks", IEEE, Trans. on Neural Networks, Vol.5, NO
.1, 1994, PP39-53
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space. Part Ⅰ
l Networks, Vol.5, NO.1, 1994, PP102-119
● Xiaofeng Qi, Francesco Palmieri, "Theoretical Analysis of Evolutionary
Algorithms with an Infinite Population Size in Continuous Space. Part Ⅱ
al Networks, Vol.5, NO.1, 1994, PP102-119
● Gunter Rudolph, Convergence Analysis of Canonical Genetic Algorithms, I
EEE, Trans. on Neural Networks, Vol.5, NO.1, 1994, PP96-101
● A E Eiben, E H L Aarts, K M Van Hee. Gloable convergence of genetic alg
orithms: A Markov chain analysis. in Parallel Problem Solving from Nat
ure. H.-P.Schwefel, R.Manner, Eds. Berlin and Heidelberg: Springer, 1991
, PP4-12
● Wirt Atmar, "Notes on the Simulation of Evolution", IEEE, Trans. on Neu
ral Networks, Vol.5, NO.1, 1994, PP130-147
● Anthony V. Sebald, Jennifer Schlenzig, "Minimax Design of Neural Net Co
ntrollers for Highly Uncertain Plants", IEEE, Trans. on Neural Networks, V
ol.5, NO.1, 1994, PP73-81
● 方建安、邵世煌,"采用遺傳算法自學(xué)習(xí)模型控制規(guī)則",《自動(dòng)化理論、技術(shù)與應(yīng)
用》,中國(guó)自動(dòng)化學(xué)會(huì) 第九屆青年學(xué)術(shù)年會(huì)論文集,1993, PP233-238
● 方建安、邵世煌,"采用遺傳算法學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)控制器",《控制與決策》,199
3,8(3), PP208-212
● 蘇素珍、土屋喜一,"使用遺傳算法的迷宮學(xué)習(xí)",《機(jī)器人》,Vol.16,NO.5,199
4, PP286-289
● M.Srinivas, L.M.Patnaik, "Adaptive Probabilities of Crossover and Mutat
ion", IEEE Trans. on S.M.C, Vol.24, NO.4, 1994 of Crossover and Mutation",
IEEE Trans. on S.M.C, Vol.24, NO.4, 1994
● Daihee Park, Abraham Kandel, Gideon Langholz, "Genetic-Based New Fuzzy
Reasoning Models with Application to Fuzzy Control", IEEE Trans. S. M. C,
Vol.24, NO.1, PP39-47, 1994
● Alen Varsek, Tanja Urbancic, Bodgan Filipic, "Genetic Algorithms in Con
troller Design and Tuning", IEEE Trans. S. M. C, Vol.23, NO.5, PP1330-13
39, 1993
1、函數(shù)優(yōu)化
函數(shù)優(yōu)化是遺傳算法的經(jīng)典應(yīng)用領(lǐng)域,也是遺傳算法進(jìn)行性能評(píng)價(jià)的常用算例,許多人構(gòu)造出了各種各樣復(fù)雜形式的測(cè)試函數(shù):連續(xù)函數(shù)和離散函數(shù)、凸函數(shù)和凹函數(shù)、低維函數(shù)和高維函數(shù)、單峰函數(shù)和多峰函數(shù)等。
2、組合優(yōu)化
隨著問(wèn)題規(guī)模的增大,組合優(yōu)化問(wèn)題的搜索空間也急劇增大,有時(shí)在目前的計(jì)算上用枚舉法很難求出最優(yōu)解。對(duì)這類復(fù)雜的問(wèn)題,人們已經(jīng)意識(shí)到應(yīng)把主要精力放在尋求滿意解上,而遺傳算法是尋求這種滿意解的最佳工具之一。
此外,GA也在生產(chǎn)調(diào)度問(wèn)題、自動(dòng)控制、機(jī)器人學(xué)、圖象處理、人工生命、遺傳編碼和機(jī)器學(xué)習(xí)等方面獲得了廣泛的運(yùn)用。
3、車(chē)間調(diào)度
車(chē)間調(diào)度問(wèn)題是一個(gè)典型的NP-Hard問(wèn)題,遺傳算法作為一種經(jīng)典的智能算法廣泛用于車(chē)間調(diào)度中,很多學(xué)者都致力于用遺傳算法解決車(chē)間調(diào)度問(wèn)題,現(xiàn)今也取得了十分豐碩的成果。
從最初的傳統(tǒng)車(chē)間調(diào)度(JSP)問(wèn)題到柔性作業(yè)車(chē)間調(diào)度問(wèn)題(FJSP),遺傳算法都有優(yōu)異的表現(xiàn),在很多算例中都得到了最優(yōu)或近優(yōu)解。
擴(kuò)展資料:
遺傳算法的缺點(diǎn)
1、編碼不規(guī)范及編碼存在表示的不準(zhǔn)確性。
2、單一的遺傳算法編碼不能全面地將優(yōu)化問(wèn)題的約束表示出來(lái)。考慮約束的一個(gè)方法就是對(duì)不可行解采用閾值,這樣,計(jì)算的時(shí)間必然增加。
3、遺傳算法通常的效率比其他傳統(tǒng)的優(yōu)化方法低。
4、遺傳算法容易過(guò)早收斂。
5、遺傳算法對(duì)算法的精度、可行度、計(jì)算復(fù)雜性等方面,還沒(méi)有有效的定量分析方法。
參考資料來(lái)源:百度百科-遺傳算法
遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)建模借鑒別人的程序做出的仿真,最近才有時(shí)間整理。
目標(biāo):
對(duì)y=x1^2+x2^2非線性系統(tǒng)進(jìn)行建模,用1500組數(shù)據(jù)對(duì)網(wǎng)絡(luò)進(jìn)行構(gòu)建網(wǎng)絡(luò),500組數(shù)據(jù)測(cè)試網(wǎng)絡(luò)。由于BP神經(jīng)網(wǎng)絡(luò)初始神經(jīng)元之間的權(quán)值和閾值一般隨機(jī)選擇,因此容易陷入局部最小值。本方法使用遺傳算法優(yōu)化初始神經(jīng)元之間的權(quán)值和閾值,并對(duì)比使用遺傳算法前后的效果。
步驟:
未經(jīng)遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)建模
1、 隨機(jī)生成2000組兩維隨機(jī)數(shù)(x1,x2),并計(jì)算對(duì)應(yīng)的輸出y=x1^2+x2^2,前1500組數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)input_train,后500組數(shù)據(jù)作為測(cè)試數(shù)據(jù)input_test。并將數(shù)據(jù)存儲(chǔ)在data中待遺傳算法中使用相同的數(shù)據(jù)。
2、 數(shù)據(jù)預(yù)處理:歸一化處理。
3、 構(gòu)建BP神經(jīng)網(wǎng)絡(luò)的隱層數(shù),次數(shù),步長(zhǎng),目標(biāo)。
4、 使用訓(xùn)練數(shù)據(jù)input_train訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)net。
5、 用測(cè)試數(shù)據(jù)input_test測(cè)試神經(jīng)網(wǎng)絡(luò),并將預(yù)測(cè)的數(shù)據(jù)反歸一化處理。
6、 分析預(yù)測(cè)數(shù)據(jù)與期望數(shù)據(jù)之間的誤差。
遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)建模
1、 讀取前面步驟中保存的數(shù)據(jù)data;
2、 對(duì)數(shù)據(jù)進(jìn)行歸一化處理;
3、 設(shè)置隱層數(shù)目;
4、 初始化進(jìn)化次數(shù),種群規(guī)模,交叉概率,變異概率
5、 對(duì)種群進(jìn)行實(shí)數(shù)編碼,并將預(yù)測(cè)數(shù)據(jù)與期望數(shù)據(jù)之間的誤差作為適應(yīng)度函數(shù);
6、 循環(huán)進(jìn)行選擇、交叉、變異、計(jì)算適應(yīng)度操作,直到達(dá)到進(jìn)化次數(shù),得到最優(yōu)的初始權(quán)值和閾值;
7、 將得到最佳初始權(quán)值和閾值來(lái)構(gòu)建BP神經(jīng)網(wǎng)絡(luò);
8、 使用訓(xùn)練數(shù)據(jù)input_train訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)net;
9、 用測(cè)試數(shù)據(jù)input_test測(cè)試神經(jīng)網(wǎng)絡(luò),并將預(yù)測(cè)的數(shù)據(jù)反歸一化處理;
10、 分析預(yù)測(cè)數(shù)據(jù)與期望數(shù)據(jù)之間的誤差。
程序:
1、未經(jīng)遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)建模
clear;
clc;
%%%%%%%%%%%%%輸入?yún)?shù)%%%%%%%%%%%%%%
N=2000; %數(shù)據(jù)總個(gè)數(shù)
M=1500; %訓(xùn)練數(shù)據(jù)
%%%%%%%%%%%%%訓(xùn)練數(shù)據(jù)%%%%%%%%%%%%%%
for i=1:N
input(i,1)=-5+rand*10;
input(i,2)=-5+rand*10;
end
output=input(:,1).^2+input(:,2).^2;
save data input output
load data.mat
%從1到N隨機(jī)排序
k=rand(1,N);
[m,n]=sort(k);
%找出訓(xùn)練數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)
input_train=input(n(1:M),:)';
output_train=output(n(1:M),:)';
input_test=input(n((M+1):N),:)';
output_test=output(n((M+1):N),:)';
%數(shù)據(jù)歸一化
[inputn,inputs]=mapminmax(input_train);
[outputn,outputs]=mapminmax(output_train);
%構(gòu)建BP神經(jīng)網(wǎng)絡(luò)
net=newff(inputn,outputn,5);
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0000004;
%BP神經(jīng)網(wǎng)絡(luò)訓(xùn)練
net=train(net,inputn,outputn);
%測(cè)試樣本歸一化
inputn_test=mapminmax('apply',input_test,inputs);
%BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)
an=sim(net,inputn_test);
%%網(wǎng)絡(luò)得到數(shù)據(jù)反歸一化
BPoutput=mapminmax('reverse',an,outputs);
figure(1)
%plot(BPoutput,':og');
scatter(1:(N-M),BPoutput,'rx');
hold on;
%plot(output_test,'-*');
scatter(1:(N-M),output_test,'o');
legend('預(yù)測(cè)輸出','期望輸出','fontsize',12);
title('BP網(wǎng)絡(luò)預(yù)測(cè)輸出','fontsize',12);
xlabel('樣本','fontsize',12);
xlabel('優(yōu)化前輸出的誤差','fontsize',12);
figure(2)
error=BPoutput-output_test;
plot(1:(N-M),error);
xlabel('樣本','fontsize',12);
ylabel('優(yōu)化前輸出的誤差','fontsize',12);
%save net net inputs outputs
2、遺傳算法優(yōu)化的BP神經(jīng)網(wǎng)絡(luò)建模
(1)主程序
%清空環(huán)境變量
clc
clear
%讀取數(shù)據(jù)
load data.mat
%節(jié)點(diǎn)個(gè)數(shù)
inputnum=2;
hiddennum=5;
outputnum=1;
%訓(xùn)練數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)
input_train=input(1:1500,:)';
input_test=input(1501:2000,:)';
output_train=output(1:1500)';
output_test=output(1501:2000)';
%選連樣本輸入輸出數(shù)據(jù)歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%構(gòu)建網(wǎng)絡(luò)
net=newff(inputn,outputn,hiddennum);
%% 遺傳算法參數(shù)初始化
maxgen=10; %進(jìn)化代數(shù),即迭代次數(shù)
sizepop=30; %種群規(guī)模
pcross=[0.3]; %交叉概率選擇,0和1之間
pmutation=[0.1]; %變異概率選擇,0和1之間
%節(jié)點(diǎn)總數(shù)
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
lenchrom=ones(1,numsum);
bound=[-3*ones(numsum,1) 3*ones(numsum,1)]; %數(shù)據(jù)范圍
%------------------------------------------------------種群初始化------------------------------%------------------
--------
individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個(gè)結(jié)構(gòu)體
%avgfitness=[]; %每一代種群的平均適應(yīng)度
bestfitness=[]; %每一代種群的最佳適應(yīng)度
bestchrom=[]; %適應(yīng)度最好的染色體
%初始化種群
for i=1:sizepop
%隨機(jī)產(chǎn)生一個(gè)種群
individuals.chrom(i,:)=Code(lenchrom,bound); %編碼
x=individuals.chrom(i,:);
%計(jì)算適應(yīng)度
individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色體的適應(yīng)度
end
%找最好的染色體
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色體
%avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應(yīng)度
% 記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
%trace=[avgfitness bestfitness];
%% 迭代求解最佳初始閥值和權(quán)值
% 進(jìn)化開(kāi)始
for i=1:maxgen
i
% 選擇
individuals=Select(individuals,sizepop);
% avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
% 變異
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
% 計(jì)算適應(yīng)度
for j=1:sizepop
x=individuals.chrom(j,:); %解碼
individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);
end
%找到最小和最大適應(yīng)度的染色體及它們?cè)诜N群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
% 代替上一次進(jìn)化中最好的染色體
if bestfitnessnewbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%avgfitness=sum(individuals.fitness)/sizepop;
% trace=[trace;avgfitness bestfitness]; %記錄每一代進(jìn)化中最好的適應(yīng)度和平均適應(yīng)度
end
%% 遺傳算法結(jié)果分析
%figure(3)
%[r c]=size(trace);
%plot([1:r]',trace(:,2),'b--');
%title(['適應(yīng)度曲線 ' '終止代數(shù)=' num2str(maxgen)]);
%xlabel('進(jìn)化代數(shù)');ylabel('適應(yīng)度');
%legend('平均適應(yīng)度','最佳適應(yīng)度');
disp('適應(yīng)度 變量');
x=bestchrom;
%% 把最優(yōu)初始閥值權(quán)值賦予網(wǎng)絡(luò)預(yù)測(cè)
% %用遺傳算法優(yōu)化的BP網(wǎng)絡(luò)進(jìn)行值預(yù)測(cè)
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x
(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
%% BP網(wǎng)絡(luò)訓(xùn)練
%網(wǎng)絡(luò)進(jìn)化參數(shù)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
%網(wǎng)絡(luò)訓(xùn)練
[net,per2]=train(net,inputn,outputn);
%% BP網(wǎng)絡(luò)預(yù)測(cè)
%數(shù)據(jù)歸一化
inputn_test=mapminmax('apply',input_test,inputps);
an=sim(net,inputn_test);
test_simu=mapminmax('reverse',an,outputps);
error=test_simu-output_test;
%figure(4);
hold on;plot(1:500,error,'r');
legend('優(yōu)化前的誤差','優(yōu)化后的誤差','fontsize',12)
(2)編碼子程序code.m
function ret=Code(lenchrom,bound)
%本函數(shù)將變量編碼成染色體,用于隨機(jī)初始化一個(gè)種群
% lenchrom input : 染色體長(zhǎng)度
% bound input : 變量的取值范圍
% ret output: 染色體的編碼值
flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %線性插值,編碼結(jié)果以實(shí)數(shù)向量存入ret中
flag=test(lenchrom,bound,ret); %檢驗(yàn)染色體的可行性
end
(3)適應(yīng)度函數(shù)fun.m
function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
%該函數(shù)用來(lái)計(jì)算適應(yīng)度值
%x input 個(gè)體
%inputnum input 輸入層節(jié)點(diǎn)數(shù)
%outputnum input 隱含層節(jié)點(diǎn)數(shù)
%net input 網(wǎng)絡(luò)
%inputn input 訓(xùn)練輸入數(shù)據(jù)
%outputn input 訓(xùn)練輸出數(shù)據(jù)
%error output 個(gè)體適應(yīng)度值
%提取
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net=newff(inputn,outputn,hiddennum);
%網(wǎng)絡(luò)進(jìn)化參數(shù)
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網(wǎng)絡(luò)權(quán)值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2;
%網(wǎng)絡(luò)訓(xùn)練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(abs(an-outputn));
(4)選擇操作Select.m
function ret=select(individuals,sizepop)
% 該函數(shù)用于進(jìn)行選擇操作
% individuals input 種群信息
% sizepop input 種群規(guī)模
% ret output 選擇后的新種群
%求適應(yīng)度值倒數(shù)
[a bestch]=min(individuals.fitness);
%b=individuals.chrom(bestch);
%c=individuals.fitness(bestch);
fitness1=10./individuals.fitness; %individuals.fitness為個(gè)體適應(yīng)度值
%個(gè)體選擇概率
sumfitness=sum(fitness1);
sumf=fitness1./sumfitness;
%采用輪盤(pán)賭法選擇新個(gè)體
index=[];
for i=1:sizepop %sizepop為種群數(shù)
pick=rand;
while pick==0
pick=rand;
end
for i=1:sizepop
pick=pick-sumf(i);
if pick0
index=[index i];
break;
end
end
end
%index=[index bestch];
%新種群
individuals.chrom=individuals.chrom(index,:); %individuals.chrom為種群中個(gè)體
individuals.fitness=individuals.fitness(index);
%individuals.chrom=[individuals.chrom;b];
%individuals.fitness=[individuals.fitness;c];
ret=individuals;
(5)交叉操作cross.m
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函數(shù)完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色體的長(zhǎng)度
% chrom input : 染色體群
% sizepop input : 種群規(guī)模
% ret output : 交叉后的染色體
for i=1:sizepop %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次交叉操作,染色體是隨機(jī)選擇的,交叉位置也是隨機(jī)選擇的,%但該輪for循環(huán)中是否進(jìn)行交叉操作則由交叉概率決定(continue控制)
% 隨機(jī)選擇兩個(gè)染色體進(jìn)行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率決定是否進(jìn)行交叉
pick=rand;
while pick==0
pick=rand;
end
if pickpcross
continue;
end
flag=0;
while flag==0
% 隨機(jī)選擇交叉位
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %隨機(jī)選擇進(jìn)行交叉的位置,即選擇第幾個(gè)變量進(jìn)行交叉,注意:兩個(gè)染色體交叉的位置相同
pick=rand; %交叉開(kāi)始
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; %交叉結(jié)束
flag1=test(lenchrom,bound,chrom(index(1),:)); %檢驗(yàn)染色體1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %檢驗(yàn)染色體2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果兩個(gè)染色體不是都可行,則重新交叉
end
end
ret=chrom;
(6)變異操作Mutation.m
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函數(shù)完成變異操作
% pcorss input : 變異概率
% lenchrom input : 染色體長(zhǎng)度
% chrom input : 染色體群
% sizepop input : 種群規(guī)模
% opts input : 變異方法的選擇
% pop input : 當(dāng)前種群的進(jìn)化代數(shù)和最大的進(jìn)化代數(shù)信息
% bound input : 每個(gè)個(gè)體的上屆和下屆
% maxgen input :最大迭代次數(shù)
% num input : 當(dāng)前迭代次數(shù)
% ret output : 變異后的染色體
for i=1:sizepop %每一輪for循環(huán)中,可能會(huì)進(jìn)行一次變異操作,染色體是隨機(jī)選擇的,變異位置也是隨機(jī)選擇的,
%但該輪for循環(huán)中是否進(jìn)行變異操作則由變異概率決定(continue控制)
% 隨機(jī)選擇一個(gè)染色體進(jìn)行變異
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 變異概率決定該輪循環(huán)是否進(jìn)行變異
pick=rand;
if pickpmutation
continue;
end
flag=0;
while flag==0
% 變異位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %隨機(jī)選擇了染色體變異的位置,即選擇了第pos個(gè)變量進(jìn)行變異
pick=rand; %變異開(kāi)始
fg=(rand*(1-num/maxgen))^2;
if pick0.5
chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
else
chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
end %變異結(jié)束
flag=test(lenchrom,bound,chrom(i,:)); %檢驗(yàn)染色體的可行性
end
end
ret=chrom;
最近在做遺傳算法的項(xiàng)目,簡(jiǎn)單記錄一下。
遺傳算法是模擬自然界生物進(jìn)化機(jī)制的一種算法,在尋優(yōu)過(guò)程中有用的保留無(wú)用的去除。包括3個(gè)基本的遺傳算子:選擇(selection)、交叉(crossover)和變異(mutation)。遺傳操作的效果與上述3個(gè)遺傳算子所取的操作概率、編碼方法、群體大小、初始群體,以及適應(yīng)度函數(shù)的設(shè)定密切相關(guān)。
1、種群初始化
popsize 種群大小,一般為20-100,太小會(huì)降低群體的多樣性,導(dǎo)致早熟;較大會(huì)影響運(yùn)行效率;迭代次數(shù)一般100-500;交叉概率:0.4-0.99,太小會(huì)破壞群體的優(yōu)良模式;變異概率:0.001-0.1,太大搜索趨于隨機(jī)。編碼包括實(shí)數(shù)編碼和二進(jìn)制編碼,可以參考遺傳算法的幾個(gè)經(jīng)典問(wèn)題,TSP、背包問(wèn)題、車(chē)間調(diào)度問(wèn)題。
2、選擇
目的是把優(yōu)化個(gè)體直接遺傳到下一代或通過(guò)配對(duì)交叉產(chǎn)生新的個(gè)體再遺傳到下一代,我大部分采用了輪盤(pán)賭的方法。具體可參考 輪盤(pán)賭方法各個(gè)個(gè)體的選擇概率和其適應(yīng)值成比例,個(gè)體適應(yīng)值越大,被選擇的概率也越高,反之亦然。在實(shí)際問(wèn)題中,經(jīng)常需要最小值作為最優(yōu)解,有以下幾種方法進(jìn)行轉(zhuǎn)換
a、0-1之間的數(shù)據(jù),可以用1-該數(shù)值,則最小值與最大值互換;
b、 求倒數(shù);
c、求相反數(shù);
以上幾種方法均可以將最大值變?yōu)樽钚≈担钚≈底優(yōu)樽畲笾担阌诶幂啽P(pán)賭選擇最優(yōu)個(gè)體,根據(jù)實(shí)際情況來(lái)確定。
3、交叉
交叉即將兩個(gè)父代個(gè)體的部分結(jié)構(gòu)加以替換重組而生成新個(gè)體的操作,通過(guò)交叉,遺傳算法的搜索能力得以飛躍提高。根據(jù)編碼方法的不同,可以有以下的算法:
a、實(shí)值重組
離散重組、中間重組、線性重組、擴(kuò)展線性重組
b、二進(jìn)制交叉
單點(diǎn)交叉、多點(diǎn)交叉、均勻交叉、洗牌交叉、縮小代理交叉
4、變異
基本步驟:對(duì)群中所有個(gè)體以事先設(shè)定的變異概率判斷是否進(jìn)行變異;對(duì)進(jìn)行變異的個(gè)體隨機(jī)選擇變異位進(jìn)行變異。根據(jù)編碼表示方法的不同,有實(shí)值變異和二進(jìn)制變異
變異的目的:
a、使遺傳算法具有局部的隨機(jī)搜索能力。當(dāng)遺傳算法通過(guò)交叉算子已接近最優(yōu)解鄰域時(shí),利用變異算子的這種局部搜索能力可以加速向最優(yōu)解收斂。顯然該情況下變異概率應(yīng)取較小值,否則接近最優(yōu)解的積木塊會(huì)因?yàn)樽儺愒獾狡茐摹?/p>
b、使遺傳算法可維持多樣性,以防止未成熟收斂現(xiàn)象。此時(shí)收斂概率應(yīng)取較大值。
變異概率一般取0.001-0.1。
5、終止條件
當(dāng)最優(yōu)個(gè)體的適應(yīng)度達(dá)到給定的閾值,或者最優(yōu)個(gè)體的適應(yīng)度和群體適應(yīng)度不再上升時(shí),或者迭代次數(shù)達(dá)到預(yù)設(shè)的代數(shù)時(shí),算法終止。預(yù)設(shè)代數(shù)一般為100-500。
6、其它
多變量:將多個(gè)變量依次連接
多目標(biāo):一種方法是轉(zhuǎn)化為單目標(biāo),例如按大小進(jìn)行排序,根據(jù)排序和進(jìn)行選擇,可以參考