|
7#
楼主 |
发表于 2003-3-11 07:52:00
|
只看该作者
优化函数
使用常用优化算法程序的用户必须提供两个C子程序,函数子程序和梯度子程序,一个数据文件。这里给出子程序的编写规范。
函数计算子程序
函数子程序是用户应提供的优化问题中,优化目标、约束与各优化设计变量的数量关系信息,包括目标函数和约束函数和评价函数。其书写规范为
void fnt(double *x,double *f,double *g)
{
f[0] = ;
f[1] = ;
… …
f[nob-1] = ;
g[0] = ;
g[1] = ;
… …
g[nc-1] = ;
}
变量说明:
*x: (输入变量) n个元素的一维数组,存放设计变量的当前值;
*f: (输出变量) nob个元素的一维数组,存放目标函数的当前值;
*g:(输出变量)nc个元素的一维数组,存放等式和不等式约束函数的当前值。
如果多目标问题评价函数为已知,则用户应提供评价函数子程序,其书写规范为
void ufnt(double *f,double *u)
{
u[0] =U(f[0],f[1],...,f[nob]);
}
变量说明:
*f: (输入变量) nob个元素的一维数组,存放目标函数的当前值;
*u: (输出变量)1个元素,存放评价函数的当前值。
梯度计算子程序
梯度计算子程序是用户选择解析法计算梯度时,必需提供的梯度函数信息,包括目标函数,约束函数对设计变量的一阶导数。其书写规范为
void dgrad(double *x,double **df)
{
df[0][0]= ;
.........
df[0][n-1]= ;
df[1][0]= ;
.........
df[1][n-1]= ;
.........
df[nob-1][0]= ;
.........
df[nob-1][n-1]= ;
df[nob][0]= ;
.........
df[nob][n-1]= ;
.........
df[nob+nc-1][0]= ;
.........
df[nob+nc-1][n-1]= ;
}
变量说明:
*x: (输入变量) n个元素的一维数组,存放设计变量的当前值;
*f: (输入变量) nob个元素的一维数组,存放目标函数的当前值;
**df:(输出变量)(nob+nc)×n个元素的二维数组,前nob个元素存放目标函数梯度值,后nc个元素存放约束函数梯度值.
多目标规划时,如果用户已知评价函数的梯度表达式,则可以提供评价函数对各目标的梯度计算子程序,其书写规范为
void udgrad(double *f,double *du)
{
du[0]= ;
du[1]= ;
.........
du[nob-1]= ;
}
变量说明:
*f: (输入变量) nob个元素的一维数组,存放目标函数的当前值;
**df: (输出变量) nob 个元素的一维数组,存放评价函数梯度值的当前值.
注意事项
⑴ 上述四个子程序有时可以省略,具体原则如下:
线性规划、二次规划只需提供数据文件,不必提供函数和梯度计算子程序。
非线性规划、混合离散规划和多目标规划都必需提供子程序fnt(),其它子程序 可省略。
只要用户选择解析法计算梯度,就必须提供dgrad()。
非多目标问题,子程序ufnt()和udgrad()可以省略。
多目标问题且用户选择解析法计算梯度,必需提供全部四个子程序。
四个子程序全部写在一个源程序文件中。
四个子程序可以分别写在不同的源程序文件中。
每个源程序文件必需包含头文件math.h和windows.h。
⑵ 各变量、函数的次序是:
目标函数按秩序排在最前。
等式约束函数次之。
不等式约束函数最后。
一个实例
假如有如下的多目标问题
min {x1-1,x2-2}
s.t. x1+x2>=8
x1+x2=20
x1>=2,x2>=3.
其中两个目标为f1(x1,x2)=x1-1,f2(x1,x2)=x2-2。此时子程序fnt()和dgrad()为:
#include
#include
void fnt(double *x,double *f,double *g)
{
f[0] = x[0]-1.0;
f[1] = x[1]-2.0;
g[0] = 8.0-(x[0]+x[1]);
g[1] = x[0]+x[1]-20.0;
}
void dgrad(double *x,double **df)
{
df[0][0]=1.0;
df[0][1]=0.0;
df[1][0]=0.0;
df[1][1]=1.0;
df[2][0]=-1.0;
df[2][1]=-1.0;
df[3][0]=1.0;
df[3][1]=1.0;
}
如果用户指定评价函数为U(f1,f2)=-f1*f1-f2*f2,那么子程序ufnt()和udgrad()为:
void ufnt(double *f,double *uf)
{
uf[0]=-f[0]*f[0]-f[1]*f[1];
}
void ugrad(double *f,double *du)
{
du[0]=-f[0]-f[0];
du[1]=-f[1]-f[1];
return;
}
|
|