基于C语言的复合形法的优化设计

2016-07-05 17:51邰园园
科技风 2016年18期
关键词:C语言优化设计

摘 要:优化设计是在计算机广泛应用的基础上发展起来的一项设计技术,目的是在给定的技术条件下获得最优设计方案、保证产品具有优良的性能。基于C语言可以很好实现优化设计的算法过程,使解决实际的优化问题变的简易。

关键词:C语言,复合形法,优化设计

中图分类号:TH122 文献标识码:A

优化设计是在计算机广泛应用的基础上发展起来的一项设计技术,目的是在给定的技术条件下获得最优设计方案、保证产品具有优良的性能[ 4 ]。它首先将设计问题按照规定的格式建立数学模型,并选择合适的优化算法,选择或编制计算机程序,然后通过计算机自动获得最优设计方案。

机械优化设计问题和一般工程实际优化问题绝大多数属于约束非线性规划问题,目前对约束最优化问题的解法很多,如复合形法、可行方向法、消元法、惩罚函数法等[ 2 ]。本文根据约束最优化方法中的复合形法提出一种利用C语言程序求解最优解的方法。

一、复合形法基本原理[ 2 ]

复合形法的基本思路是在n维空间的可行域中选取K个设计点(通常取n+1<=K<=2n)作为初始复合形(多面体)的顶点。然后比较复合形各顶点目标函数值的大小,其中目标函数值最大的点为坏点,以坏点之外其余各点的中心为映射中心,寻找坏点的映射点。以映射点替换坏点与原复合形除坏点之外其余各点构成K个顶点的新的复合形。如此反复迭代计算,在可行域中不断以目标函数值低的代替目标函数值最大的坏点从而构成新的复合形,使复合形不断向最优点移动和收缩,直到收缩到复合形的各顶点与其形心非常接近、满足迭代精度ε要求时为止。最后输出复合形各顶点中的目标函数值最小的顶点作为近似最优点。

现以二维不等式约束优化问题来作进一步说明。其数学模型为:min f(X),X∈D R(2) ,D:g1(X)>=0,g2(X)>=0,a1<=x1<=b1 ,a2<=x2<=b1

在可行域内先选定X(1),X(2),X(3),X(4) 四个点(这里取K=2n=2*2=4)作为初始复合形的顶点,计算这四个点的目标函数值,并作比较,得出坏点X(H)和好点X(L):

X(H):f(X(H))=max{f(X(j)) (j=1,2,……,K)} (1-1)

X(L):f(X(L)))=min{f(X(j)))(j=1,2,……,K)} (1-2)

如果X(4)为好点,点X(1)为坏点,即X(4) →X(L),X(1) →X(H)。以X(2),X(3),X(4)三点的中心,寻找坏点X(H)的映射点X(R):

X(R)= X(C)+α(X(C) -X(H)) (1-3)

式中,α为映射系数,一般α>=1,通常去α=1.3。然后计算映射点X(R)处目标函数f(X(R))与目标函数值f(X(R))相比是否下降,并同时检查X(R)是否在可行域内。如果下降性、可行性这两方面都得到满足,则以X(R)点替换X(H)点,由X(R)与X(2),X(3),X(4)共四个点构成一个新复合形。这个复合形肯定优于原复合形;如果上述两个条件不能同时满足,则可将映射系数缩半,即0.5α→α,仍按式(1-3)迭代,重新取得新的影映射点X(R),使其同时满足下降性、可行性条件。有时甚至要经过多次缩减映射系数才能使回缩的映射点X(R)最后满足这两个条件。这时以回缩成功的映射点X(R)和X(2),X(3),X(4)构成新复合形。构成新复合形就完成了一轮迭代。以后再按上述方法进行迭代搜索,不断地使复合形向着目标函数减小的方向移动和收缩,直到逼近最优解。

二、C语言的概述和作用

C语言是国际上广泛流行的计算机高级语言。它既有高级语言的特点,又有汇编语言的特点。它适合作为系统描述语言,既可以用来编写系统软件,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序[ 3 ]。

下面应用C语言程序利用复合形法求解二元函数minF(X)=x12+x22-x1x2-10x1-4x2+60的最优解,已知D:g1(X)=x1>=0,g2(X)=x2>=0, g3(X)=6-x1>=0,g4(X)=8-x2>=0,取:x1∈[0,6],x2∈[0,8],k=4,迭代精度ε=0.001。

三、C语言程序及功能说明如下

#include/*调用头文件*/

#include

{printf("This munber is not fit,please input again\n");

i--;

}

}

F[1]=M(x[1][1],x[1][2]);

F[2]=M(x[2][1],x[2][2]);

F[3]=M(x[3][1],x[3][2]);

F[4]=M(x[4][1],x[4][2]);

FH=max(F[4],max(F[3],max(F[1],F[2])));/*寻找坏点*/

FL=min(F[4],min(F[3],min(F[1],F[2])));/*寻找好点*/

loop:for(l=1;l<=4;l++)

if(F[l]==FH)/*判断第几个点是坏点*/

{m=l;

switch(m)

{ case 1:{ XX[1]=x[1][1];XX[2]=x[1][2];

x[1][1]=x[2][1];

x[2][1]=x[3][1];

x[3][1]=x[4][1];

x[1][2]=x[2][2];

x[2][2]=x[3][2];

x[3][2]=x[4][2];break;}

case 2:{ XX[1]=x[2][1];XX[2]=x[2][2];

x[1][1]=x[1][1];

x[2][1]=x[3][1];

x[3][1]=x[4][1];

x[1][2]=x[1][2];

x[2][2]=x[3][2];

x[3][2]=x[4][2];break;}

case 3:{ XX[1]=x[3][1];XX[2]=x[3][2];

x[1][1]=x[1][1];

x[2][1]=x[2][1];

x[3][1]=x[4][1];

x[1][2]=x[1][2];

x[2][2]=x[2][2];

x[3][2]=x[4][2];break;}

case 4:{ XX[1]=x[4][1];XX[2]=x[4][2];

x[1][1]=x[1][1];

x[2][1]=x[2][1];

x[3][1]=x[3][1];

x[1][2]=x[1][2];

x[2][2]=x[2][2];

x[3][2]=x[3][2];break;}

}

}

xC1=ZH1(x[1][1],x[2][1],x[3][1]);/*計算映射中心*/

xC2=ZH1(x[1][2],x[2][2],x[3][2]);

a=1.3;/*映射中心系数*/

xR1=xC1+a*(xC1-XX[1]);/*计算映射点*/

xR2=xC2+a*(xC2-XX[2]);

loop2:if(xR1>6||xR1<0||xR2>8||xR2<0)/*判断映射点是否在可行域内*/

{ loop3:

a=a/2.0;

xR1=xC1+a*(xC1-XX[1]);

xR2=xC2+a*(xC2-XX[2]);

goto loop2;

}

if(M(xR1,xR2){x[4][1]=xR1;

x[4][2]=xR2;}

else goto loop3;

F[1]=M(x[1][1],x[1][2]);

F[2]=M(x[2][1],x[2][2]);

F[3]=M(x[3][1],x[3][2]);

F[4]=M(x[4][1],x[4][2]);

FH=max(F[4],max(F[3],max(F[1],F[2])));

FL=min(F[4],min(F[3],min(F[1],F[2])));

Ff=((1.0/K)*((F[1]-FL)*(F[1]-FL)+(F[2]-FL)*(F[2]-FL)+(F[3]-FL)*(F[3]-FL)+(F[4]-FL)*(F[4]-FL)));

FF=sqrt(Ff);

if(FF>e) goto loop;/*判断迭代精度是否达到终止条件*/

else

{ for(i=1;i<=4;i++)

if(FL==F[i])

n=i;

printf("The last four point is\n");/*输出最后一次迭代的4个顶点 及目标函数值*/

printf("x1=%f,%f\nx2=%f,%f\nx3=%f,%f\nx4=%f,%f\n",x[1][1],x[1][2],x[2][1],x[2][2],x[3][1],x[3][2],x[4][1],x[4][2]);

printf("F1=%f\nF2=%f\nF3=%f\nF4=%f\nFH=%f\nFL=%f\nFF=%f\n",F[1],F[2],F[3],F[4],FH,FL,FF);

printf("The perfect answer is\n");

printf("X=%f,%f\n",x[n][1],x[n][2]);/*输出最优解*/

printf("Fx=%f\n",FL);

}

}

float M(float a,float b)/*定义目标函数*/

{

float F;

F=a*a+b*b-a*b-10*a-4*b+60;

return(F);

}

float max(float x,float y)/*定義取最大函数*/

{

return(x>y? x:y);

}

float min(float j,float k)/*定义取最小函数*/

{

return(j>k? k:j);

}

float ZH1(float x11,float x21,float x31)/*定义取中心点函数*/

{

float Xr1=(x11+x21+x31)/3;

return(Xr1);

}

float ZH2(float x12,float x22,float x32)

{

float Xr2=(x12+x22+x32)/3;

return(Xr2);

}

输入四个点(0,0)、(1,3)、(4,0)、(6,4),输出最优解如图所示。

四、结论

通过以上实例可以看出,基于C语言可以很好实现优化设计的算法过程,其效率高,可靠性好,现在有很多成熟的计算机程序可以选用,使解决实际的优化问题变的简易。

参考文献:

[1] 杨义勇.现代机械设计理论与方法[M].北京:清华大学出版社,2014.

[2] 陈秀宁.机械优化设计[M].浙江:浙江大学出版社,2008.

[3] 谭浩强.C程序设计[M].北京:清华大学出版社,2007.

作者简介:邰园园(1987-),男,江苏句容人,本科,助理工程师,主要从事机械设计工作。

猜你喜欢
C语言优化设计
基于Visual Studio Code的C语言程序设计实践教学探索
基于C语言的计算机软件编程
C语言程序设计课程教学与学科专业相结合的探索
高职高专院校C语言程序设计教学改革探索
对无线传感器网络MAC层协议优化的研究与设计
基于simulation的医用升降椅参数化设计
简述建筑结构设计中的优化策略
论子函数在C语言数据格式输出中的应用
非计算机专业C语言教学探讨