A. 關於遺傳演算法的疑惑!請高人指點!非常感謝! 模擬退火遺傳演算法和免疫遺傳演算法哪個改進的效果好
這些演算法的本質都是隨機搜索,帶有隨機性,對參數依賴程度還是比較強的,所以出現結果時好時壞也是正常的。
至於這些演算法的比較,你可以查查相關的論文。特別是首先提出該改進演算法的論文,不過要注意,國內的論文的實驗結果可信程度還是值得懷疑的。作者往往為了「證明」其演算法的優勢,只列舉那些對演算法效果有利的實驗結果,不好的結果經常不列出來。所以你看到別人說什麼演算法好,但你自己用的時候卻沒發現該演算法的優勢也是正常的。
B. 遺傳演算法的運算過程
遺傳操作是模擬生物基因遺傳的做法。在遺傳演算法中,通過編碼組成初始群體後,遺傳操作的任務就是對群體的個體按照它們對環境適應度(適應度評估)施加一定的操作,從而實現優勝劣汰的進化過程。從優化搜索的角度而言,遺傳操作可使問題的解,一代又一代地優化,並逼近最優解。
遺傳操作包括以下三個基本遺傳運算元(genetic operator):選擇(selection);交叉(crossover);變異(mutation)。這三個遺傳運算元有如下特點:
個體遺傳運算元的操作都是在隨機擾動情況下進行的。因此,群體中個體向最優解遷移的規則是隨機的。需要強調的是,這種隨機化操作和傳統的隨機搜索方法是有區別的。遺傳操作進行的高效有向的搜索而不是如一般隨機搜索方法所進行的無向搜索。
遺傳操作的效果和上述三個遺傳運算元所取的操作概率,編碼方法,群體大小,初始群體以及適應度函數的設定密切相關。 從群體中選擇優勝的個體,淘汰劣質個體的操作叫選擇。選擇運算元有時又稱為再生運算元(reproction operator)。選擇的目的是把優化的個體(或解)直接遺傳到下一代或通過配對交叉產生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的,目前常用的選擇運算元有以下幾種:適應度比例方法、隨機遍歷抽樣法、局部選擇法。
其中輪盤賭選擇法 (roulette wheel selection)是最簡單也是最常用的選擇方法。在該方法中,各個個體的選擇概率和其適應度值成比例。設群體大小為n,其中個體i的適應度為,則i 被選擇的概率,為遺傳演算法
顯然,概率反映了個體i的適應度在整個群體的個體適應度總和中所佔的比例。個體適應度越大。其被選擇的概率就越高、反之亦然。計算出群體中各個個體的選擇概率後,為了選擇交配個體,需要進行多輪選擇。每一輪產生一個[0,1]之間均勻隨機數,將該隨機數作為選擇指針來確定被選個體。個體被選後,可隨機地組成交配對,以供後面的交叉操作。 在自然界生物進化過程中起核心作用的是生物遺傳基因的重組(加上變異)。同樣,遺傳演算法中起核心作用的是遺傳操作的交叉運算元。所謂交叉是指把兩個父代個體的部分結構加以替換重組而生成新個體的操作。通過交叉,遺傳演算法的搜索能力得以飛躍提高。
交叉運算元根據交叉率將種群中的兩個個體隨機地交換某些基因,能夠產生新的基因組合,期望將有益基因組合在一起。根據編碼表示方法的不同,可以有以下的演算法:
a)實值重組(real valued recombination)
1)離散重組(discrete recombination)
2)中間重組(intermediate recombination)
3)線性重組(linear recombination)
4)擴展線性重組(extended linear recombination)。
b)二進制交叉(binary valued crossover)
1)單點交叉(single-point crossover)
2)多點交叉(multiple-point crossover)
3)均勻交叉(uniform crossover)
4)洗牌交叉(shuffle crossover)
5)縮小代理交叉(crossover with reced surrogate)。
最常用的交叉運算元為單點交叉(one-point crossover)。具體操作是:在個體串中隨機設定一個交叉點,實行交叉時,該點前或後的兩個個體的部分結構進行互換,並生成兩個新個體。下面給出了單點交叉的一個例子:
個體A:1 0 0 1 ↑1 1 1 → 1 0 0 1 0 0 0 新個體
個體B:0 0 1 1 ↑0 0 0 → 0 0 1 1 1 1 1 新個體 變異運算元的基本內容是對群體中的個體串的某些基因座上的基因值作變動。依據個體編碼表示方法的不同,可以有以下的演算法:
a)實值變異
b)二進制變異。
一般來說,變異運算元操作的基本步驟如下:
a)對群中所有個體以事先設定的變異概率判斷是否進行變異
b)對進行變異的個體隨機選擇變異位進行變異。
遺傳演算法引入變異的目的有兩個:一是使遺傳演算法具有局部的隨機搜索能力。當遺傳演算法通過交叉運算元已接近最優解鄰域時,利用變異運算元的這種局部隨機搜索能力可以加速向最優解收斂。顯然,此種情況下的變異概率應取較小值,否則接近最優解的積木塊會因變異而遭到破壞。二是使遺傳演算法可維持群體多樣性,以防止出現未成熟收斂現象。此時收斂概率應取較大值。
遺傳演算法中,交叉運算元因其全局搜索能力而作為主要運算元,變異運算元因其局部搜索能力而作為輔助運算元。遺傳演算法通過交叉和變異這對相互配合又相互競爭的操作而使其具備兼顧全局和局部的均衡搜索能力。所謂相互配合.是指當群體在進化中陷於搜索空間中某個超平面而僅靠交叉不能擺脫時,通過變異操作可有助於這種擺脫。所謂相互競爭,是指當通過交叉已形成所期望的積木塊時,變異操作有可能破壞這些積木塊。如何有效地配合使用交叉和變異操作,是目前遺傳演算法的一個重要研究內容。
基本變異運算元是指對群體中的個體碼串隨機挑選一個或多個基因座並對這些基因座的基因值做變動(以變異概率P.做變動),(0,1)二值碼串中的基本變異操作如下:
基因位下方標有*號的基因發生變異。
變異率的選取一般受種群大小、染色體長度等因素的影響,通常選取很小的值,一般取0.001-0.1。 當最優個體的適應度達到給定的閾值,或者最優個體的適應度和群體適應度不再上升時,或者迭代次數達到預設的代數時,演算法終止。預設的代數一般設置為100-500代。
C. 遺傳演算法研究進展
遺傳演算法[56,53]研究的興起是在20世紀80年代末和90年代初期,但它的歷史起源可追溯到20世紀60年代初期。早期的研究大多以對自然遺傳系統的計算機模擬為主。早期遺傳演算法的研究特點是側重於對一些復雜的操作的研究。雖然其中像自動博弈、生物系統模擬、模式識別和函數優化等給人以深刻的印象,但總的來說這是一個無明確目標的發展時期,缺乏帶有指導性的理論和計算工具的開拓。這種現象直到20世紀70年代中期由於Holland和De Jong的創造性研究成果的發表才得到改觀。當然,早期的研究成果對於遺傳演算法的發展仍然有一定的影響,尤其是其中一些有代表性的技術和方法已為當前的遺傳演算法所吸收和發展。
在遺傳演算法作為搜索方法用於人工智慧系統中之前,已有不少生物學家用計算機來模擬自然遺傳系統。尤其是Fraser的模擬研究,他於1962年提出了和現在的遺傳演算法十分相似的概念和思想。但是,Fraser和其他一些學者並未認識到自然遺傳演算法可以轉化為人工遺傳演算法。Holland教授及其學生不久就認識到這一轉化的重要性,Holland認為比起尋找這種或那種具體的求解問題的方法來說,開拓一種能模擬自然選擇遺傳機制的帶有一般性的理論和方法更有意義。在這一時期,Holland不但發現了基於適應度的人工遺傳選擇的基本作用,而且還對群體操作等進行了認真的研究。1965年,他首次提出了人工遺傳操作的重要性,並把這些應用於自然系統和人工系統中。
1967年,Bagley在他的論文中首次提出了遺傳演算法(genetic algorithm)這一術語,並討論了遺傳演算法在自動博弈中的應用。他所提出的包括選擇、交叉和變異的操作已與目前遺傳演算法中的相應操作十分接近。尤其是他對選擇操作做了十分有意義的研究。他認識到,在遺傳進化過程的前期和後期,選擇概率應合適地變動。為此,他引入了適應度定標(scaling)概念,這是目前遺傳演算法中常用的技術。同時,他也首次提出了遺傳演算法自我調整概念,即把交叉和變異的概率融於染色體本身的編碼中,從而可實現演算法自我調整優化。盡管Bagley沒有對此進行計算機模擬實驗,但這些思想對於後來遺傳演算法的發展所起的作用是十分明顯的。
在同一時期,Rosenberg也對遺傳演算法進行了研究,他的研究依然是以模擬生物進化為主,但他在遺傳操作方面提出了不少獨特的設想。1970年Cavicchio把遺傳演算法應用於模式識別中。實際上他並未直接涉及到模式識別,而僅用遺傳演算法設計一組用於識別的檢測器。Cavicchio對於遺傳操作以及遺傳演算法的自我調整也做了不少有特色的研究。
Weinberg於1971年發表了題為《活細胞的計算機模擬》的論文。由於他和Rosenberg一樣注意於生物遺傳的模擬,所以他對遺傳演算法的貢獻有時被忽略。實際上,他提出的多層次或多級遺傳演算法至今仍給人以深刻的印象。
第一個把遺傳演算法用於函數優化的是Hollstien。1971年他在論文《計算機控制系統中的人工遺傳自適應方法》中闡述了遺傳演算法用於數字反饋控制的方法。實際上,他主要是討論了對於二變數函數的優化問題。其中,對於優勢基因控制、交叉和變異以及各種編碼技術進行了深入的研究。
1975年在遺傳演算法研究的歷史上是十分重要的一年。這一年,Holland出版了他的著名專著《自然系統和人工系統的適配》。該書系統地闡述了遺傳演算法的基本理論和方法,並提出了對遺傳演算法的理論研究和發展極為重要的模式理論(schemata theory)。該理論首次確認了結構重組遺傳操作對於獲得隱並行性的重要性。直到這時才知道遺傳操作到底在干什麼,為什麼又幹得那麼出色,這對於以後陸續開發出來的遺傳操作具有不可估量的指導作用。
同年,De Jong完成了他的重要論文《遺傳自適應系統的行為分析》。他在該論文中所做的研究工作可看作是遺傳演算法發展進程中的一個里程碑,這是因為他把Holland的模式理論與他的計算實驗結合起來。盡管De Jong和Hollstien一樣主要側重於函數優化的應用研究,但他將選擇、交叉和變異操作進一步完善和系統化,同時又提出了諸如代溝(generation gap)等新的遺傳操作技術。可以認為,De Jong的研究工作為遺傳演算法及其應用打下了堅實的基礎,他所得出的許多結論迄今仍具有普遍的指導意義。
進入20世紀80年代,遺傳演算法迎來了興盛發展時期,無論是理論研究還是應用研究都成了十分熱門的課題。尤其是遺傳演算法的應用研究顯得格外活躍,不但它的應用領域擴大,而且利用遺傳演算法進行優化和規則學習的能力也顯著提高,同時產業應用方面的研究也在摸索之中。此外一些新的理論和方法在應用研究中亦得到了迅速的發展,這些無疑均給遺傳演算法增添了新的活力。
隨著應用領域的擴展,遺傳演算法的研究出現了幾個引人注目的新動向:一是基於遺傳演算法的機器學習(Genetic Base Machine Learning),這一新的研究課題把遺傳演算法從歷來離散的搜索空間的優化搜索演算法擴展到具有獨特的規則生成功能的嶄新的機器學習演算法。這一新的學習機制對於解決人工智慧中知識獲取和知識優化精煉的瓶頸難題帶來了希望。二是遺傳演算法正日益和神經網路、模糊推理以及混沌理論等其他智能計算方法相互滲透和結合,這對開拓21世紀中新的智能計算技術將具有重要的意義。三是並行處理的遺傳演算法的研究十分活躍。這一研究不僅對遺傳演算法本身的發展,而且對於新一代智能計算機體系結構的研究都是十分重要的。四是遺傳演算法和另一個稱為人工生命的嶄新研究領域正不斷滲透。所謂人工生命即是用計算機模擬自然界豐富多彩的生命現象,其中生物的自適應、進化和免疫等現象是人工生命的重要研究對象,而遺傳演算法在這方面將會發揮一定的作用。五是遺傳演算法和進化規劃(Evolution Programming,EP)以及進化策略(Evolution Strategy,ES)等進化計算理論日益結合。EP和ES幾乎是和遺傳演算法同時獨立發展起來的,同遺傳演算法一樣,它們也是模擬自然界生物進化機制的智能計算方法,既同遺傳演算法具有相同之處,也有各自的特點。
隨著遺傳演算法研究和應用的不斷深入和發展,一系列以遺傳演算法為主題的國際會議十分活躍。從1985年開始,國際遺傳演算法會議,即ICGA(International Conference on Genetic Algorithm)每兩年舉行一次。在歐洲,從1990年開始也每隔一年舉辦一次類似的會議,即 PPSN(Parallel Problem Solving from Nature)會議。除了遺傳演算法外,大部分有關ES和EP的學術論文也出現在PPSN中。另外,以遺傳演算法的理論基礎為中心的學術會議有FOGA(Foundation of Genetic Algorithm)。它也是從1990年開始,隔年召開一次。這些國際學術會議論文集中反映了遺傳演算法近些年來的最新發展和動向。
D. matlab 免疫遺傳演算法中抗體的促進和抑制策略怎麼理解
每代群體每體適應度都必須算吧存向量面每代適應度max()平均值mean()取放向量面進化完畢候畫向量行
E. 免疫遺傳演算法怎麼和其他結合在一起
在使用遞歸操作的時候,經常會遇到遞歸條件報錯:ORA-01436: 用戶數據中的 CONNECT BY 循環。特別是在做一些技巧性操作的時候,比如常見的復制和展開行,字元串拆分。這時候經常會使用層次查詢CONNECT BY。但是稍加不慎,就會報遞歸循環錯誤,為了避免這種錯誤,有個技巧,那就是增加prior dbms_random.value is not null。
例1:復制與展開行
比如對1 ID,5 times按5次展開5行。那麼這很簡單,如下:
SQL> WITH t AS
2 (
3 SELECT 1 ID,5 times FROM al
4 )
5 SELECT ID FROM t
6 CONNECT BY LEVEL<=times;
ID
----------
1
1
1
1
1
F. 使用遺傳演算法和免疫演算法的優化結果是否有差別
遺傳演算法是一種智能計算方法,針對不同的實際問題可以設計不同的計算程序。它主要有復制,交叉,變異三部分完成,是仿照生物進化過程來進行計算方法的設計。 模糊數學是研究現實生活中一類模糊現象的數學。簡單地說就是像好與壞怎樣精確的描述,將好精確化,用數字來表達。 神經網路是一種仿生計算方法,仿照生物體中信息的傳遞過程來進行數學計算。 這三種知識都是近40年興起的新興學科,主要應用在智能模糊控制上面。這三者可以結合起來應用。如用模糊數學些遺傳演算法的程序,優化神經網路,最後用神經網路控制飛行器或其他物體
G. 我需要一個基於免疫遺傳演算法的matlab程序,關於函數尋優的,最好在附有講解
% 主程序
%遺傳演算法主程序
%Name:genmain.m
%author:楊冪
clear
clf
%%初始化
popsize=50; %群體大小
chromlength=30; %字元串長度(個體長度)
pc=0.6; %交叉概率
pm=0.1; %變異概率
pop=initpop(popsize,chromlength); %隨機產生初始群體
%%開始迭代
for i=1:20 %20為迭代次數
[objvalue]=calobjvalue(pop); %計算目標函數
fitvalue=calfitvalue(objvalue); %計算群體中每個個體的適應度
[newpop]=selection(pop,fitvalue); %復制
[newpop]=crossover(pop,pc); %交叉
[newpop]=mutation(pop,pm); %變異
[bestindivial,bestfit]=best(pop,fitvalue); %求出群體中適應值最大的個體及其適應值
y(i)=max(bestfit);%儲存最優個體適應值
n(i)=i;
pop5=bestindivial;%儲存最優個體
%解碼
x1(i)=decodechrom(pop5,1,chromlength/2)*2/32767;
x2(i)=10+decodechrom(pop5,chromlength/2+1,chromlength/2)*10/32767;
pop=newpop;%將新產生的種群作為當前種群
end
%%繪圖
figure(1)%最優點變化趨勢圖
i=1:20;
plot(y(i),'-r*')
xlabel('迭代次數');
ylabel('最優個體適應值');
title('最優點變化趨勢');
legend('最優點');
grid on
figure(2)%最優點分布圖
[X1,X2]=meshgrid(0:0.1:2,10:0.1:20);
Z=X1.^2+X2.^2;
mesh(X1,X2,Z);
xlabel('自變數x1'),ylabel('自變數x2'),zlabel('函數值f(x1,x2)');
hold on
plot3(x1,x2,y,'ro','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',5)
title('最優點分布');
legend('最優點');
hold off
[z index]=max(y); %計算最大值及其位置
x5=[x1(index),x2(index)]%計算最大值對應的x值
z
H. 免疫演算法的提出
在生命科學領域中,人們已經對遺傳(Heredity)與免疫(Immunity)等自然現象進行了廣泛深入的研究。六十年代Bagley和Rosenberg等先驅在對這些研究成果進行分析與理解的基礎上,借鑒其相關內容和知識,特別是遺傳學方面的理論與概念,並將其成功應用於工程科學的某些領域,收到了良好的效果。時至八十年代中期,美國Michigan大學的Hollan教授不僅對以前的學者們提出的遺傳概念進行了總結與推廣,而且給出了簡明清晰的演算法描述,並由此形成目前一般意義上的遺傳演算法(GeneticAlgorithm)GA。由於遺傳演算法較以往傳統的搜索演算法具有使用方便、魯棒性強、便於並行處理等特點,因而廣泛應用於組合優化、結構設計、人工智慧等領域。另一方面,Farmer和Bersini等人也先後在不同時期、不同程度地涉及到了有關免疫的概念。遺傳演算法是一種具有生成+檢測 (generate and test)的迭代過程的搜索演算法。從理論上分析,迭代過程中,在保留上一代最佳個體的前提下,遺傳演算法是全局收斂的。然而,在對演算法的實施過程中不難發現兩個主要遺傳運算元都是在一定發生概率的條件下,隨機地、沒有指導地迭代搜索,因此它們在為群體中的個體提供了進化機會的同時,也無可避免地產生了退化的可能。在某些情況下,這種退化現象還相當明顯。另外,每一個待求的實際問題都會有自身一些基本的、顯而易見的特徵信息或知識。然而遺傳演算法的交叉和變異運算元卻相對固定,在求解問題時,可變的靈活程度較小。這無疑對演算法的通用性是有益的,但卻忽視了問題的特徵信息對求解問題時的輔助作用,特別是在求解一些復雜問題時,這種忽視所帶來的損失往往就比較明顯了。實踐也表明,僅僅使用遺傳演算法或者以其為代表的進化演算法,在模仿人類智能處理事物的能力方面還遠遠不足,還必須更加深層次地挖掘與利用人類的智能資源。從這一點講,學習生物智能、開發、進而利用生物智能是進化演算法乃至智能計算的一個永恆的話題。所以,研究者力圖將生命科學中的免疫概念引入到工程實踐領域,藉助其中的有關知識與理論並將其與已有的一些智能演算法有機地結合起來,以建立新的進化理論與演算法,來提高演算法的整體性能。基於這一思想,將免疫概念及其理論應用於遺傳演算法,在保留原演算法優良特性的前提下,力圖有選擇、有目的地利用待求問題中的一些特徵信息或知識來抑制其優化過程中出現的退化現象,這種演算法稱為免疫演算法(ImmuneAlgorithm)IA。下面將會給出演算法的具體步驟,證明其全局收斂性,提出免疫疫苗的選擇策略和免疫運算元的構造方法,理論分析和對TSP問題的模擬結果表明免疫演算法不僅是有效的而且也是可行的,並較好地解決了遺傳演算法中的退化問題。
I. 請問什麼是遺傳演算法,並給兩個例子
遺傳演算法(Genetic Algorithm, GA)是近幾年發展起來的一種嶄新的全局優化演算法,它借
用了生物遺傳學的觀點,通過自然選擇、遺傳、變異等作用機制,實現各個個體的適應性
的提高。這一點體現了自然界中"物競天擇、適者生存"進化過程。1962年Holland教授首次
提出了GA演算法的思想,從而吸引了大批的研究者,迅速推廣到優化、搜索、機器學習等方
面,並奠定了堅實的理論基礎。 用遺傳演算法解決問題時,首先要對待解決問題的模型結構
和參數進行編碼,一般用字元串表示,這個過程就將問題符號化、離散化了。也有在連續
空間定義的GA(Genetic Algorithm in Continuous Space, GACS),暫不討論。
一個串列運算的遺傳演算法(Seguential Genetic Algoritm, SGA)按如下過程進行:
(1) 對待解決問題進行編碼;
(2) 隨機初始化群體X(0):=(x1, x2, … xn);
(3) 對當前群體X(t)中每個個體xi計算其適應度F(xi),適應度表示了該個體的性能好
壞;
(4) 應用選擇運算元產生中間代Xr(t);
(5) 對Xr(t)應用其它的運算元,產生新一代群體X(t+1),這些運算元的目的在於擴展有限
個體的覆蓋面,體現全局搜索的思想;
(6) t:=t+1;如果不滿足終止條件繼續(3)。
GA中最常用的運算元有如下幾種:
(1) 選擇運算元(selection/reproction): 選擇運算元從群體中按某一概率成對選擇個
體,某個體xi被選擇的概率Pi與其適應度值成正比。最通常的實現方法是輪盤賭(roulett
e wheel)模型。
(2) 交叉運算元(Crossover): 交叉運算元將被選中的兩個個體的基因鏈按概率pc進行交叉
,生成兩個新的個體,交叉位置是隨機的。其中Pc是一個系統參數。
(3) 變異運算元(Mutation): 變異運算元將新個體的基因鏈的各位按概率pm進行變異,對
二值基因鏈(0,1編碼)來說即是取反。
上述各種運算元的實現是多種多樣的,而且許多新的運算元正在不斷地提出,以改進GA的
某些性能。系統參數(個體數n,基因鏈長度l,交叉概率Pc,變異概率Pm等)對演算法的收斂速度
及結果有很大的影響,應視具體問題選取不同的值。
GA的程序設計應考慮到通用性,而且要有較強的適應新的運算元的能力。OOP中的類的繼
承為我們提供了這一可能。
定義兩個基本結構:基因(ALLELE)和個體(INDIVIDUAL),以個體的集合作為群體類TP
opulation的數據成員,而TSGA類則由群體派生出來,定義GA的基本操作。對任一個應用實
例,可以在TSGA類上派生,並定義新的操作。
TPopulation類包含兩個重要過程:
FillFitness: 評價函數,對每個個體進行解碼(decode)並計算出其適應度值,具體操
作在用戶類中實現。
Statistic: 對當前群體進行統計,如求總適應度sumfitness、平均適應度average、最好
個體fmax、最壞個體fmin等。
TSGA類在TPopulation類的基礎上派生,以GA的系統參數為構造函數的參數,它有4個
重要的成員函數:
Select: 選擇運算元,基本的選擇策略採用輪盤賭模型(如圖2)。輪盤經任意旋轉停止
後指針所指向區域被選中,所以fi值大的被選中的概率就大。
Crossover: 交叉運算元,以概率Pc在兩基因鏈上的隨機位置交換子串。
Mutation: 變異運算元,以概率Pm對基因鏈上每一個基因進行隨機干擾(取反)。
Generate: 產生下代,包括了評價、統計、選擇、交叉、變異等全部過程,每運行一
次,產生新的一代。
SGA的結構及類定義如下(用C++編寫):
[code] typedef char ALLELE; // 基因類型
typedef struct{
ALLELE *chrom;
float fitness; // fitness of Chromosome
}INDIVIDUAL; // 個體定義
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 &Indivial(int i){ return pop[i];};
void FillFitness(); // 評價函數
virtual void Statistics(); // 統計函數
};
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(); // 產生新的一代
};
用戶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是一個概率過程,所以每次迭代的情況是不一樣的;系統參數不同,迭代情況
也不同。在實驗中參數一般選取如下:個體數n=50-200,變異概率Pm=0.03, 交叉概率Pc=
0.6。變異概率太大,會導致不穩定。
參考文獻
● Goldberg D E. Genetic Algorithm in Search, Optimization, and machine
Learning. Addison-Wesley, Reading, MA, 1989
● 陳根社、陳新海,"遺傳演算法的研究與進展",《信息與控制》,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
● 方建安、邵世煌,"採用遺傳演算法自學習模型控制規則",《自動化理論、技術與應
用》,中國自動化學會 第九屆青年學術年會論文集,1993, PP233-238
● 方建安、邵世煌,"採用遺傳演算法學習的神經網路控制器",《控制與決策》,199
3,8(3), PP208-212
● 蘇素珍、土屋喜一,"使用遺傳演算法的迷宮學習",《機器人》,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
J. 遺傳演算法求解tsp問題的matlab程序
把下面的(1)-(7)依次存成相應的.m文件,在(7)的m文件下運行就可以了
(1) 適應度函數fit.m
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end
(2)個體距離計算函數 mylength.m
function len=myLength(D,p)
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
len=len+D(p(1,i),p(1,i+1));
end
end
(3)交叉操作函數 cross.m
function [A,B]=cross(A,B)
L=length(A);
if L<10
W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10)+8;
else
W=floor(L/10)+8;
end
p=unidrnd(L-W+1);
fprintf('p=%d ',p);
for i=1:W
x=find(A==B(1,p+i-1));
y=find(B==A(1,p+i-1));
[A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));
[A(1,x),B(1,y)]=exchange(A(1,x),B(1,y));
end
end
(4)對調函數 exchange.m
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
end
(5)變異函數 Mutation.m
function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;
end
(6)連點畫圖函數 plot_route.m
function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
x0=a(R(i-1),1);
y0=a(R(i-1),2);
x1=a(R(i),1);
y1=a(R(i),2);
xx=[x0,x1];
yy=[y0,y1];
plot(xx,yy);
hold on;
end
end
(7)主函數
clear;
clc;
%%%%%%%%%%%%%%%輸入參數%%%%%%%%
N=50; %%城市的個數
M=100; %%種群的個數
C=100; %%迭代次數
C_old=C;
m=2; %%適應值歸一化淘汰加速指數
Pc=0.4; %%交叉概率
Pmutation=0.2; %%變異概率
%%生成城市的坐標
pos=randn(N,2);
%%生成城市之間距離矩陣
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
D(i,j)=dis^(0.5);
D(j,i)=D(i,j);
end
end
%%如果城市之間的距離矩陣已知,可以在下面賦值給D,否則就隨機生成
%%生成初始群體
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);
end
%%隨機選擇一個種群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R); %%畫出種群各城市之間的連線
axis([-3 3 -3 3]);
%%初始化種群及其適應函數
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
R=popm(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(C+1,1); %%各次迭代的最小的種群的距離
while C>=0
fprintf('迭代第%d次\n',C);
%%選擇操作
nn=0;
for i=1:size(popm,1)
len_1(i,1)=myLength(D,popm(i,:));
jc=rand*0.3;
for j=1:size(popm,1)
if fitness(j,1)>=jc
nn=nn+1;
popm_sel(nn,:)=popm(j,:);
break;
end
end
end
%%每次選擇都保存最優的種群
popm_sel=popm_sel(1:nn,:);
[len_m len_index]=min(len_1);
popm_sel=[popm_sel;popm(len_index,:)];
%%交叉操作
nnper=randperm(nn);
A=popm_sel(nnper(1),:);
B=popm_sel(nnper(2),:);
for i=1:nn*Pc
[A,B]=cross(A,B);
popm_sel(nnper(1),:)=A;
popm_sel(nnper(2),:)=B;
end
%%變異操作
for i=1:nn
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%求適應度函數
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(C+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
C=C-1;
%pause(1);
end
figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);