機械優(yōu)化設(shè)計——復(fù)合形方法及源程序_第1頁
機械優(yōu)化設(shè)計——復(fù)合形方法及源程序_第2頁
機械優(yōu)化設(shè)計——復(fù)合形方法及源程序_第3頁
機械優(yōu)化設(shè)計——復(fù)合形方法及源程序_第4頁
機械優(yōu)化設(shè)計——復(fù)合形方法及源程序_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、機械優(yōu)化設(shè)計復(fù)合形方法及源程序(一) 題目:用復(fù)合形法求約束優(yōu)化問題;的最優(yōu)解。基本思路:在可行域中構(gòu)造一個具有K個頂點的初始復(fù)合形。對該復(fù)合形各頂點的目標函數(shù)值進行比較,找到目標函數(shù)值最大的頂點(即最壞點),然后按一定的法則求出目標函數(shù)值有所下降的可行的新點,并用此點代替最壞點,構(gòu)成新的復(fù)合形,復(fù)合形的形狀每改變一次,就向最優(yōu)點移動一步,直至逼近最優(yōu)點。(二) 復(fù)合形法的計算步驟1) 選擇復(fù)合形的頂點數(shù)k,一般取,在可行域內(nèi)構(gòu)成具有k個頂點的初始復(fù)合形。2) 計算復(fù)合形個頂點的目標函數(shù)值,比較其大小,找出最好點xL、最壞點xH、及此壞點xG.3) 計算除去最壞點xH以外的(k-1)個頂點的中

2、心xC。判別xC是否可行,若xC為可行點,則轉(zhuǎn)步驟4);若xC為非可行點,則重新確定設(shè)計變量的下限和上限值,即令,然后轉(zhuǎn)步驟1),重新構(gòu)造初始復(fù)合形。4) 按式計算反射點x,必要時改變反射系數(shù)的值,直至反射成功,即滿足式。然后x以取代x,構(gòu)成新的復(fù)合形。5) 若收斂條件得到滿足,計算終止。約束最優(yōu)解為:。(三) 復(fù)合形法程序框圖見下圖:是否否否否是是是是否求反射點計算各頂點的目標函數(shù)值f(xj)(j=1,2,k)一次壞點xG代替最壞點xH結(jié) 束xR可行?xC可行?計算出去xH后的各頂點中心將各定點的目標函數(shù)值和坐標按目標函數(shù)值的大小排序形成初始復(fù)合形的k個頂點xj(j=1,2,k)輸入 n,k

3、,開 始 (四) 源程序如下:/*輸入值選擇n=2,k=3,本程序可以處理n為2或3,k為3或4的情況*/#include #include #include #include #define E0 1e-5 /*復(fù)合形法收斂控制精度*/double *apply(int,int); /*申請矩陣空間*/double f(double *); /*目標函數(shù)*/double *g(double *); /*約束函數(shù)*/bool judge(double *); /*可行點的判斷*/int main()int n,k;int i,j,k1;int l;double temporary;double

4、 restrain; /*收斂條件*/double reflect; /*反射系數(shù)*/srand(unsigned)time(NULL);printf(請輸入目標函數(shù)的維數(shù)n:); /*輸入已知數(shù)據(jù)*/scanf(%d,&n);printf(請輸入復(fù)合形的頂點數(shù)k:);scanf(%d,&k);double *x=apply(k,n); /*存放復(fù)合形頂點*/double *y=(double *)calloc(k,sizeof(double); /*存放目標函數(shù)值*/double *p=(double *)calloc(3,sizeof(double); /*存放約束函數(shù)值*/double

5、*a=(double *)calloc(n,sizeof(double); /*存放設(shè)計變量的下限*/double *b=(double *)calloc(n,sizeof(double); /*存放設(shè)計變量的上限*/double *x_c=(double *)calloc(n,sizeof(double); /*存放可行點中心*/double *x_r=(double *)calloc(n,sizeof(double); /*存放最壞點的反射點*/printf(本程序中的所有輸入,兩個數(shù)之間用空格隔開,然后按enter鍵時不要長時間的按,否則,可能會出錯n); printf(請輸入選定的第一

6、個可行點x1(包含%d個數(shù)):,n);for(i=0;in;i+)scanf(%lf,*x+i);printf(請輸入初選變量的下限a(包含%d個數(shù)):,n);for(i=0;in;i+)scanf(%lf,a+i);printf(請輸入初選變量的上限b(包含%d個數(shù)):,n);for(i=0;in;i+)scanf(%lf,b+i);printf(輸出輸入結(jié)果為:nn=%d,k=%d,x1=(,n,k); /*輸出已知數(shù)據(jù)*/for(i=0;in-1;i+)printf(%.5lf ,*(*x+i);printf(%.5lf)na=(,*(*x+n-1);for(i=0;in-1;i+)pr

7、intf(%f ,*(a+i);printf(%.5lf),b=(,*(a+n-1);for(i=0;in-1;i+)printf(%f ,*(b+i);printf(%.5lf)n,*(b+n-1);L1:for(i=1;ik;i+) /*隨機得到其余(k-1)個可行點*/for(j=0;jn;j+)*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j);l=1;for(i=1;ik;i+) /*找出可行點的個數(shù)l,并把可行點放在前l(fā)個位置上*/if(judge(*(x+i)for(j=1;jk;j+)if(!judge(

8、*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;break;l+;for(i=0;il-1;i+) /*把前l(fā)個可行點按目標函數(shù)值從大到小排序*/for(j=i+1;jl;j+)if(f(*(x+i)f(*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;for(i=0;in;i+) /*求可行點中心*/*(x_c+i

9、)=0;for(i=0;il;i+)for(j=0;jn;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;in;i+)*(x_c+i)/=l;if(!judge(x_c) /*判斷可行點中心是否可行*/for(i=0;in;i+)*(a+i)=*(*(x+l-1)+i);*(b+i)=*(x_c+i);goto L1;elsefor(i=l;ik;i+) /*將不可行點可行化*/dofor(j=0;jn;j+)*(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j);while(!judge(*(x+i);L2:for(i=0;ik-1;i

10、+) /*將可行點按目標函數(shù)值從大到小排序*/for(j=i+1;jk;j+)if(f(*(x+i)f(*(x+j)for(k1=0;k1n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;restrain=0; /*求收斂條件*/for(i=0;ik;i+)restrain+=(f(*(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1);restrain=sqrt(1.0/(k-1)*restrain);if(restrainE0) /*判斷收斂條件*/printf(

11、n求得約束最優(yōu)點為:( );for(i=0;in;i+)printf(%.5f ,*(*(x+k-1)+i);printf()n目標函數(shù)的最優(yōu)解為:%.5fn,f(*(x+k-1);return 0;elseL3:for(i=0;in;i+) /*計算除去最壞點*x外的(k-1)個頂點的中心*/*(x_c+i)=0;for(i=1;ik;i+)for(j=0;jn;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;in;i+)*(x_c+i)/=k-1;reflect=1.3;L4:for(i=0;in;i+) /*求反射點*/*(x_r+i)=*(x_c+i)+reflect

12、*(*(x_c+i)-*(*x+i);if(!judge(x_r)reflect*=0.5;goto L4;else if(f(x_r)f(*x)for(i=0;in;i+)*(*x+i)=*(x_r+i);goto L2;else if(reflect=1e-10)for(i=0;in;i+)*(*x+i)=*(*(x+1)+i);goto L3;elsereflect*=0.5;goto L4;double *apply(int row,int col) /*申請矩陣空間*/int i;double *x=(double*)calloc(row*col,sizeof(double);dou

13、ble *y=(double *)calloc(row,sizeof(double *);if(!x | !y)printf(內(nèi)存分配失敗!);exit(1);for(i=0;irow;i+)*(y+i)=x+i*col;return y;double f(double *x) /*目標函數(shù)*/return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6);double *g(double *x) /*約束函數(shù)*/double *p=(double *)calloc(3,sizeof(double);if(!p)printf(內(nèi)存分配失敗!);exit(1);*p=64-(*x)*(*x)-(*(x+

溫馨提示

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

評論

0/150

提交評論