多種群多編碼遺傳算法通用控件MPGA 1.5
HBD 2007
(一) 多種群多編碼遺傳算法通用控件介紹
設計遺傳算法通用控件的目的是向用戶(hù)提供一個(gè)工程優(yōu)化工具箱, 利用此工具箱用戶(hù)可以方便地把遺傳算法加入自己的軟件中來(lái)優(yōu)化用戶(hù)自己定義的目標函數。用戶(hù)只需要提供目標函數,再加入相應的設置代碼后便可以用遺傳算法進(jìn)行優(yōu)化,使用戶(hù)從繁瑣的遺傳算法編程中脫離出來(lái),把注意力集中到目標函數的設計上來(lái)。
采用控件把遺傳算法封裝起來(lái)的好處是可以適用于各種開(kāi)發(fā)平臺如:VC++、VB、Delphi等等,另外利用控件的消息處理,用戶(hù)可以方便的加入目標函數和計算結果通知函數。
多種群多編碼遺傳算法通用控件并不是采用簡(jiǎn)單的標準遺傳算法,而是采用了一系列的改進(jìn)方法:
1. 實(shí)現了多種編碼:二進(jìn)制編碼、實(shí)數編碼、整數編碼。用戶(hù)可以自行選擇。
2. 其次實(shí)現了多種群進(jìn)化,種群的數量由用戶(hù)定義,每個(gè)種群的編碼方式也是用戶(hù)自定義。每個(gè)種群的進(jìn)化都是在獨立的線(xiàn)程中的,多種群進(jìn)化時(shí)進(jìn)化線(xiàn)程是并發(fā)的,如有5個(gè)種群進(jìn)化,便有5個(gè)線(xiàn)程同時(shí)并發(fā)優(yōu)化。種群間的個(gè)體是可以移民的,每隔一定的進(jìn)化代數后,每個(gè)種群或引入其他種群的優(yōu)良個(gè)體,或輸出自己的優(yōu)良個(gè)體到其他種群。每個(gè)種群的編碼方式、交叉函數、變異函數、交叉概率、變異概率、保留比率都可以互不相同,保證了各種群的多樣性。
3. 每個(gè)種群的進(jìn)化都采用了精英法則,加速了收斂速度。
(二) 多種群多編碼遺傳算法通用控件的使用方法
1. 注冊控件
開(kāi)始菜單-》運行,輸入
regsvr32 相應目錄\MPGA.ocx
2. 加入控件到自己的工程
在VC++下,在設計窗單擊右鍵選擇”Insert ActiveX control”在彈出的窗體中選擇MPGA
3. 響應消息
為控件添加兩個(gè)消息響應函數。
兩個(gè)消息分別為GetEvaluation和 Report, 在響應GetEvaluation消息函數中添加目標函數,Report消息響應函數得到當前計算出的最優(yōu)解。
4. 關(guān)聯(lián)控件變量
為控件關(guān)聯(lián)一個(gè)變量,如m_ga。
5. 添加目標函數
目標函數添加到GetEvaluation消息函數,消息函數原型如下:
void CTestmpDlg::OnGetEvaluationMpgactrl1(long iPopulation, long iIndividual, double FAR* Evaluation)
iPopulation 表示第幾個(gè)種群
iIndividual 表示種群中的第幾個(gè)個(gè)體
Evaluation 表示要傳回的評價(jià)值
舉例:
{
double x1,x2;
x1=m_ga.GetVarFromInd(iPopulation,iIndividual,0);
x2=m_ga.GetVarFromInd(iPopulation,iIndividual,1);
(*Evaluation)=-20*exp(-0.2*sqrt(0.5*(x1*x1+x2*x2)))-exp(0.5*(cos(2*3.1415926*x1)+cos(2*3.1415926*x2)))+22.71282;
}
在這個(gè)目標函數的例子中,優(yōu)化變量有兩個(gè)x1,x2。通過(guò)函數m_ga.GetVarFromInd(iPopulation,iIndividual,0)得到當前的變量值,0表示變量的編號,即第0個(gè)變量。
(*Evaluation)=-20*exp(-0.2*sqrt(0.5*(x1*x1+x2*x2)))-exp(0.5*(cos(2*3.1415926*x1)+cos(2*3.1415926*x2)))+22.71282;此句話(huà)便把目標函數給出,目標函數為:
-20*exp(-0.2*sqrt(0.5*(x1*x1+x2*x2)))-exp(0.5*(cos(2*3.1415926*x1)+cos(2*3.1415926*x2)))+22.71282
6. 添加 Report函數
Report消息響應函數被調用時(shí),即控件通知軟件計算出結果,一般是每隔幾代報告一個(gè),這是可以設置的具體見(jiàn)接口說(shuō)明。Report消息響應函數原型為:
void CTestmpDlg::OnReportMpgactrl1(long iGeneration, long iPopulation, double Evaluation)
iGeneration 表示當前進(jìn)化到第幾代
iPopulation 表示第幾個(gè)種群
Evaluation 表示但前計算出的最佳目標函數值
舉例:
{ CString str;
double x1,x2;
x1=m_ga.GetVarFromBestInd(0);
x2=m_ga.GetVarFromBestInd(1);
str.Format("Generation=%d Population=%d Evaluation%f :\r\n",iGeneration,iPopulation,Evaluation);
disstr+=str;
str.Format("1--%f 2--%f\r\n\r\n",x1,x2);
disstr+=str;
this->SetDlgItemText(IDC_EDIT1,disstr);
}
在此例中有兩個(gè)優(yōu)化變量,當前最佳個(gè)體的變量是通過(guò)函數m_ga.GetVarFromBestInd(0)得到的,0代表變量的編號,即第0個(gè)變量。得到之后顯示結果給用戶(hù)。
7. 添加初始化及運行代碼
舉例:
void CTestmpDlg::OnOK()
{
m_ga.RestGA();
m_ga.AddPopulation(1,100,0,0.9,0,0.1,60);//增加一個(gè)種群
//1-實(shí)數編碼 100-種群規模 0-交叉方法 0.9-交叉概率 0-變異方法 0.1-變異概率 60-保留百分比
m_ga.AddPopulation(0,500,0,0.8,0,0.03,70); //增加一個(gè)種群
//1-二進(jìn)制編碼 500-種群規模 0-交叉方法 0.8-交叉概率 0-變異方法 0.03-變異概率 70-保留百分比
m_ga.AddVariable(-5,5,20,0);//增加一個(gè)變量
//-5-變量的下限 5-變量的上限 20-若為二進(jìn)制編碼為二進(jìn)制編碼長(cháng)度 0-非整數
m_ga.AddVariable(-5,5,20,0); //增加一個(gè)變量
m_ga.InitGA(0,1000,20,10);//初始化
//0-求最小值 1000-進(jìn)化1000代 20-report間隔20代 10-移民間隔10代
m_ga.RunGA();//開(kāi)始進(jìn)行優(yōu)化
}
(三) 多種群多編碼遺傳算法通用控件接口說(shuō)明
Ø long AddPopulation(long EncodeMethod, long PopSize, long CrossoverMethod, float CrossoverProbability, long MutMethod, float MutProbability, float KeepPercentage)
接口含義:增加一個(gè)種群
EncodeMethod 編碼方式,0-二進(jìn)制編碼 1-實(shí)數編碼 2-整數編碼
PopSize 種群規模 大于0
CrossoverMethod 交叉方法 在試用版本中對二進(jìn)制編碼 0-單點(diǎn)交叉 1-雙點(diǎn)交叉 對實(shí)數編碼 0-算術(shù)交叉
CrossoverProbability 交叉概率 范圍為 0-1
MutMethod 變異方法 在試用版本下設為0
MutProbability 變異概率 范圍0-1
KeepPercentage 保留百分比 范圍 1-100
返回值:0為成功
Ø long AddVariable(double Min, double Max, long nBits, short IsInteger)
接口含義:增加一個(gè)優(yōu)化變量
Min 優(yōu)化變量的最小值
Max 優(yōu)化變量的最大值
nBits 當為二進(jìn)值編碼時(shí),二進(jìn)制編碼的長(cháng)度 大于0
IsInteger 是否為整數 1-為整數 0-非整數
返回值:0為成功
Ø long InitGA(short IsMax, long GenerationNumber, long ReportPeriod, long MigrationPeriod)
接口含義:初始化
IsMax 0-求最小值 1-求最大值
GenerationNumber 進(jìn)化代數 大于0
ReportPeriod report間隔代數,要求為MigrationPeriod的倍數
MigrationPeriod 移民間隔代數 >0,建議值10-100
返回值:0為成功
Ø void RestGA()
接口含義:rest GA, 當前正在進(jìn)化時(shí),會(huì )停止所有進(jìn)化線(xiàn)程。
Ø long RunGA()
接口含義:開(kāi)始進(jìn)行進(jìn)化。
返回值:0為成功
Ø double GetVarFromInd(long iPopulation, long iIndividual, long iVariable)
接口含義:從當前個(gè)體得到優(yōu)化變量值,此接口提供變量值給目標函數計算。
iPopulation 第幾個(gè)種群 此參數賦消息響應函數參數iPopulation
iIndividual 第幾個(gè)個(gè)體 此參數賦消息響應函數參數iIndividual
iVariable 第幾個(gè)變量 變量編號從0開(kāi)始
返回值:變量值
Ø double GetVarFromBestInd(long iVariable);
接口含義:從當前最佳個(gè)體得到優(yōu)化變量值,此接口用戶(hù)顯示結果給用戶(hù)。
iVariable 第幾個(gè)變量 變量編號從0開(kāi)始
返回值:變量值
(四) 多種群多編碼遺傳算法通用控件消息說(shuō)明
Ø GetEvaluation
void GetEvaluation(long iPopulation, long iIndividual, double* Evaluation)
消息含義:獲取用戶(hù)的目標函數值
iPopulation 第幾個(gè)種群
iIndividual 第幾個(gè)個(gè)體
Evaluation 返回目標函數值
Ø Report
void Report(long iGeneration, long iPopulation, double Evaluation)
消息含義:報告結果給用戶(hù)
iGeneration 第幾代
iPopulation 第幾個(gè)種群
Evaluation 當前最佳目標函數值
(五) 其他
l VB 和delphi 用戶(hù)如何使用?
VB 和delphi環(huán)境下和VC++的使用流程類(lèi)似,不需要做額外的操作。
l 對于有約束條件的優(yōu)化問(wèn)題如何解決?
對于約束條件問(wèn)題可以采用懲罰函數法,即把不符合條件的目標函數值增加響應的懲罰項,控件在優(yōu)化時(shí)會(huì )淘汰較差個(gè)體。如:
(*Evaluation)=objectvalue+fa(x); //fa為懲罰函數
詳細例子和使用說(shuō)明:下載1 http://download.csdn.net/source/262362
聯(lián)系客服