遺傳算法求函數極值_第1頁
遺傳算法求函數極值_第2頁
遺傳算法求函數極值_第3頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、WORD格式智能優化算法第一次作業- 遺傳算法洪文杰S151000853問題:用遺傳算法求解f(x)=xsin(10 *x)+2.0 的最大值, x 取 -1,2.一、分析:遺傳算法根本思路二、實例簡介1. 產生初始種群專業資料整理WORD格式s1=13(01101)專業資料整理WORD格式s2=24(11000)s3=8(01000)s4=19(10011)2. 計算適應度假定適應度為f(s)=s2,那么f(s1)=f(13)=132=169f(s2)=f(24)=242=576f(s3)=f(8)=82= 64f(s4)=f(19)=192=3613. 選擇染色體的選擇概率為:專業資料整理

2、WORD格式染色體的累計概率為:專業資料整理WORD格式根據上面的式子,可得到:專業資料整理WORD格式例如設從區間0,1中產生4 個隨機數:專業資料整理WORD格式r1=0.450126,r2=0.110347r3=0.572496,r4=0.98503專業資料整理WORD格式4. 穿插根本遺傳算法SGA 中穿插算子采用單點穿插算子。單點穿插運算專業資料整理WORD格式5. 變異專業資料整理WORD格式6. 至下一代,適應度計算選擇穿插變異,直至滿足終止條件專業資料整理WORD格式三、解決問題專業資料整理WORD格式初始化輸入種群大小,穿插概率,變異概率等條件根據精度編碼將區間-1,2 分成

3、 Num份,再通過Num 求解種群基因個數 -1,2 用二進制等分計算每個個體的適應度,該題適應度函數就是f(X)根據適應度求解積累概率,并用輪盤賭法選著個體產生備選種群在備選種群中,利用穿插概率,隨機選擇個體,再隨機選擇穿插點進行單點穿插,形成穿插后的種群在穿插后種群中,利用變異概率,隨機選擇個體,再隨機選擇變異點進展單點變異,形成變異后的種群是否輸出結果最大是否到達值。迭代次數專業資料整理WORD格式四、實驗結果源代碼:專業資料整理WORD格式/* 問題:用遺傳算法求解f(x)=xsin(10 *x)+2.0 的最大值,/* 洪文杰2021-3-9. 智能優化算法第一次作業 */#incl

4、ude<iostream>/#includ<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#include<float.h>using namespace std;#define NUMBER 50/ 種群規模#define GENE_NUMBER 10000/ 迭代次數int UnitNUMBER30;/初始種群int Unit_chooseNUMBER30;/選擇、穿插、變異后的種群int NumberNUMBER;/ 被選擇的個體編號float F

5、itnessNUMBER;/ 適應度float select_probabilityNUMBER;/選擇概率float accumula_probabilityNUMBER ;/積累概率float f_max=0.0;/ 最大值float f_x=0.0;/ 最大值對應的自變量int hwj_coding(int start,int end);/編碼void hwj_initial_population(int num);/產生初始種群x 取 -1,2.*/專業資料整理WORD格式void hwj_fitness(int num);/適應度計算void hwj_choose();/ 選擇個體專

6、業資料整理WORD格式int hwj_binary_search(int l, int r,float temp);/查找選擇/void hwj_N_M(int a,int b,int N, int M);/從 M 個數中選N 個不一樣的數void hwj_cross(int num,float cross);/穿插后的得到種群void hwj_aberrance(int num,float aberrance);/變異后的得到的種群void hwj_max(int num);/找到最適應的個體int main()int strat,end;/ 區間int Num;/ 編碼大小float cr

7、oss=0.8;/ 穿插概率float aberrance = 0.04;/ 變異概率int key=1;cout<<" 請輸入求解區間:"<<endl;cin>>strat>>end;Num=hwj_coding(strat,end);cout<<"Num:"<<Num<<endl;/cout<<"-1-"<<endl;hwj_initial_population(Num);/cout<<"-2初始種群

8、-"<<endl;/*for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unitij<<' 'cout<<endl;專業資料整理WORD格式/*/while(key!=GENE_NUMBER)hwj_fitness(Num);cout<<"-3適應度-"<<endl;專業資料整理WORD格式/ for(int i=0;i<NUMBER;i+)/ cout<<Fitnessi<<endl

9、;/ hwj_choose();/cout<<"-4被選擇的個體 -"<<endl;/*for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unit_chooseij<<' 'cout<<endl;*/hwj_cross(Num,cross);/*cout<<"-5穿插后的種群 -"<<endl;for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+

10、)專業資料整理WORD格式cout<<Unitij<<' 'cout<<endl;專業資料整理WORD格式/*/hwj_aberrance(Num,aberrance);cout<<"-6變異后的種群for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unitij<<' '-"<<endl;專業資料整理WORD格式cout<<endl;*/key+;hwj_max(Num);專業資料整理

11、WORD格式cout<<" 最大值是對應的 cout<<f_x<<endl;x 值是 :"<<endl;專業資料整理WORD格式cout<<" 最大值為 :"<<f_max<<endl;return 0;int hwj_coding(int start,int end)/種群編碼float precision;int temp=2;int sum;int N=1;cout<<" 請輸入精度X圍:"<<endl;cin>&g

12、t;precision;if(precision=0)cout<<" 對不起精度不能為零:"<<endl;return 0;elsesum=(end-start)/precision;cout<<"sum:"<<sum<<endl;while(temp<sum)temp*=2;N+;return N;專業資料整理WORD格式void hwj_initial_population(int num)/生成初始種群srand(time(NULL);for(int i=0;i<NUMBER;

13、i+)for(int j=0;j<num;j+)Unitij=rand()%2;void hwj_fitness(int num)/計算適應度float sum;int temp;for(int i=0;i<NUMBER;i+)temp=1;sum=0.0;for(int j=num-1;j>=0;j-)sum+=Unitij*temp;temp*=2.0;Fitnessi=sum*3/(temp-1.0)-1.0;/ cout<<Fitnessi;/ cout<<"-+"Fitnessi=Fitnessi*sin(10*3.141

14、5926*Fitnessi)+2.0;/ cout<<Fitnessi<<endl;int hwj_binary_search(int l,int r,float temp)for(int i=0;i<NUMBER;i+)if(temp<=accumula_probabilityi&&temp>accumula_probabilityi-1) return i;return -1;void hwj_choose()/ 選擇個體float sum=0.0;float temp;int i;for(i=0;i<NUMBER;i+)su

15、m+=Fitnessi;select_probability0=Fitness0/sum;temp=accumula_probability0=select_probability0;for(i=1;i<NUMBER;i+)專業資料整理WORD格式select_probabilityi=Fitnessi/sum;temp+=select_probabilityi;accumula_probabilityi=temp;/ cout<<accumula_probabilityi<<endl;for(i=0;i<NUMBER;i+)/ srand(time(NUL

16、L);temp=(rand()%1000000)/1000000.0;/ cout<<temp;Numberi=hwj_binary_search(0,NUMBER,temp);/ cout<<Numberi<<endl; for(int j=0;j<NUMBER;j+)Unit_chooseij=UnitNumberij;/*void hwj_N_M(int a,int b,int N,int M)/從 M 個數中選 N 個不一樣的數 int i=1;srand(time(NULL);a0=rand()%M;ba0=1;while(i!=N)ai=r

17、and()%M;if(bai=0)i+;bai=1;cout<<ai<<endl;/ cout<<ai<<' '<<bai<<endl;*/voidhwj_cross(int num,float cross)/穿插后的得到種群int num_cross=NUMBER*cross;int k;/ 穿插點int i , j;if(num_cross%2!=0)num_cross=num_cross+1;/ 需要穿插的個體數int croNUMBER;/ 被穿插的個體編號int tempNUMBER;/ 是否穿插

18、數組一覽for(i=0;i<NUMBER;i+)croi=-1;tempi=0;專業資料整理WORD格式/ hwj_N_M(cro,temp,num_cross,NUMBER); srand(time(NULL);cro0=rand()%NUMBER;tempcro0=1;i=1;while(i!=num_cross)croi=rand()%NUMBER;if(tempcroi=0)tempcroi=1;i+;/ for(int i=0;i<NUMBER;i+)/ cout<<tempi<<""<<croi<<en

19、dl;/ / cout<<num_cross<<endl; for(i=0;i<num_cross/2;i+)srand(time(NULL);k=rand()%num;for(j=0;j<num;j+)if(j<=k)Unitij=Unit_choosecronum_cross-ij;Uniti+num_cross/2j=Unit_choosecroij;elseUnitij=Unit_choosecroij;Uniti+num_cross/2j=Unit_choosecroij;for(i=0;i<NUMBER;i+)/ cout<<tempi<<endl;if(tempi=0)for(j=0;j<num;j+)Unitnum_crossj=Unit_chooseij;num_cross+;void hwj_aberrance(int num,float aberrance)/變異后的得到的種群 int num_aberrance=NUMBER*aberrance;/ 變異的個體數int k;/ 變異點專業資料整理WORD格式int abeNUMBER;/ 變異的個體編號int t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論