資源描述:
《機械優(yōu)化設(shè)計——復(fù)合形方法及源程序》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、機械優(yōu)化設(shè)計——復(fù)合形方法及源程序(一)題目:用復(fù)合形法求約束優(yōu)化問題minfxx1524x262;g164x12x220;g3x1100的最優(yōu)解?;舅悸罚涸诳尚杏蛑袠?gòu)造一個具有K個頂點的初始復(fù)合形。對該復(fù)合形各頂點的目標(biāo)函數(shù)值進行比較,找到目標(biāo)函數(shù)值最大的頂點(即最壞點),然后按一定的法則求出目標(biāo)函數(shù)值有所下降的可行的新點,并用此點代替最壞點,構(gòu)成新的復(fù)合形,復(fù)合形的形狀每改變一次,就向最優(yōu)點移動一步,直至逼近最優(yōu)點。(二)復(fù)合形法的計算步驟1)選擇復(fù)合形的頂點數(shù)k,一般取n1k2n,在可行域內(nèi)構(gòu)成具有k個頂點的初始復(fù)合形。2)計算復(fù)合形個頂點的目標(biāo)函數(shù)值,比較其大小,
2、找出最好點xL、最壞點xH、及此壞點xG..3)計算除去最壞點xH以外的(k-1)個頂點的中心xC。判別xC是否可行,若xC為可行點,則轉(zhuǎn)步驟4);若xC為非可行點,則重新確定設(shè)計變量的下限和上限值,即令axL,bxC,然后轉(zhuǎn)步驟1),重新構(gòu)造初始復(fù)合形。4)按式xRxCxCxH計算反射點xR,必要時改變反射系數(shù)α的值,直至反射成功,即滿足式gjxR0,j1,2,,m;fxRfxH。然后xR以取代xH,構(gòu)成新的復(fù)合形。11k25)若收斂條件fxj2得到滿足,計算終止。約束最優(yōu)解為:1jfxLk1x*xL,fx*fxL。(三)復(fù)合形法程序框圖見下圖:開始輸入n,k,ε形成初始
3、復(fù)合形的k個頂點xj(j=1,2,??,k)計算各頂點的目標(biāo)函數(shù)值f(xj)(j=1,2,??,k)將各定點的目標(biāo)函數(shù)值和坐標(biāo)按目標(biāo)函數(shù)值的大小排序axLbxC是*xL,f*fL?x否結(jié)束計算出去xH后的各頂點中心k1xC(xj),jHk1j1否xC可行?是求反射點xRxCxCxH否xR可行?0.5是否fxRfxH?否1010?是是xHxR一次壞點xG代替最壞點xH(四)源程序如下:/*輸入值選擇n=2,k=3,本程序可以處理n為2或3,k為3或4的情況*/#include#include#include#i
4、nclude#defineE01e-5/*復(fù)合形法收斂控制精度*/double**apply(int,int);doublef(double*);double*g(double*);/*申請矩陣空間/*目標(biāo)函數(shù)*//*約束函數(shù)*/*/booljudge(double*);/*可行點的判斷*/intmain(){intn,k;inti,j,k1;intl;doubletemporary;doublerestrain;doublereflect;/*收斂條件/*反射系數(shù)*/*/srand((unsigned)time(NULL));printf(
5、"請輸入目標(biāo)函數(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));/*存放目標(biāo)函數(shù)值*/double*p=(double*)calloc(3,sizeof(double));/*存放約束函數(shù)值*/double*a=(double*)calloc(n,sizeof(double));/*存放設(shè)計變量的下限*/double*b=(d
6、ouble*)calloc(n,sizeof(double));/*存放設(shè)計變量的上限*/double*x_c=(double*)calloc(n,sizeof(double));/*存放可行點中心*/double*x_r=(double*)calloc(n,sizeof(double));/*存放最壞點的反射點*/printf("本程序中的所有輸入,兩個數(shù)之間用空格隔開,然后按enter鍵時不要長時間的按,否則,可能會出錯");printf("請輸入選定的第一個可行點x1(包含%d個數(shù)):",n);for(i=0;i7、);printf("請輸入初選變量的下限a(包含%d個數(shù)):",n);for(i=0;i