求解罚函数的c语言程序 罚函数法求解约束问题最优解

C语言问题急解简单排序问题而已啦~~~
#includestdio.h
#includestdlib.h
typedef struct {
int id;
int score;
int penalty;
}TM;
TM team[50000];
int cmp(const void *a, const void *b) //qsort的比较函数
{
TM* aa=(TM*)a;
TM* bb=(TM*)b;
if (aa-score!=bb-score) return bb-score-aa-score; //分数不同,分数高的排在前
else return aa-penalty-bb-penalty; //分数相同,罚时少的排在前
}
int main()
{
int C,N;
int i,j;
scanf("%d",C);
for (i=0; iC; i++)
{
scanf("%d",N);
for (j=0; jN; j++)
scanf("%d%d%d",team[j].id,team[j].score,team[j].penalty);
qsort(team,N,sizeof(team[0]),cmp);
printf("%d",team[0].id);
for (j=1; jN; j++) printf(" %d",team[j].id);
printf("\n");
}
return 0;
}
===============================================
汗 。。。我是写C++ , 你用C编译……
算了,我帮你改成C的好了,晕……
其实就是struct定义那里有点不同而已 , 帮你改好了
快给我分啦! *^__^*
罚函数法和拉格朗日乘子法的区别一、作用不同:
惩罚函数法在M越来越大的情况下,函数F趋近于病态,乘子法克服这个缺点根据拉格朗日分解加了一个uih(x)M变为了c/2 。
主要思想是引入一个新的参数λ(即拉格朗日乘子) , 将约束条件函数与原函数联系到一起,使能配成与变量数量相等的等式方程 。
二、定义不同:
基本的拉格朗日乘子法(又称为拉格朗日乘数法),就是求函数f(x1,x2,)在g(x1,x2,)=0的约束条件下的极值的方法 。
罚函数法是从非可行解出发逐渐移动到可行区域的方法 。罚函数法在理论上是可行的,在实际计算中的缺点是罚因子M的取值难于把握,太小起不到惩罚作用;太大则由于误差的影响会导致错误 。
三、使用方法不同:
在进化计算中,研究者选择外部罚函数法的原因主要是该方法不需要提供初始可行解 。需要提供初始可行解则是内部罚函数法的主要缺点 。由于进化算法应用到实际问题中可能存在搜索可行解就是NP难问题,因此这个缺点是非常致命的 。
基本的拉格朗日乘子法就bai是求函数f(x1,x2,...)在约束条件g(x1,x2,...)=0下的极值的方法 。其主要思想是将约束条件函数与原函数联立,从而求出使原函数取得极值的各个变量的解 。
扩展资料:
如果这个实际问题的最大或最小值存在,一般说来驻点只有一个,于是最值可求 。
条件极值问题也可以化为无条件极值求解,但有些条件关系比较复杂,代换和运算很繁,而相对来说“拉格朗日乘数法”不需代换,运算简单一点,这就是优势 。
条件φ(x,y,z)一定是个等式,不妨设为φ(x,y,z)=m
则再建一个函数g(x,y,z)=φ(x,y,z)-m
g(x,y,z)=0以g(x,y,z)代替φ(x,y,z)
在许多极值问题中 , 函数的自变量往往要受到一些条件的限制 , 比如,要设计一个容积为 V的长方体形开口水箱 , 确定长、宽和高 , 使水箱的表面积最小. 。设水箱的长、宽、高分别为 x,y,z ,  则水箱容积V=xyz 。
参考资料来源:百度百科-拉格朗日乘数法
请教高手帮忙编程序~~用matlab编写数值优化方法(最速下降法 , 惩罚函数法),具体题目如下:例1求f = 2 在0x8中的最小值与最大值
主程序为wliti1.m:
f='2*exp(-x).*sin(x)';
fplot(f,[0,8]);%作图语句
[xmin,ymin]=fminbnd (f, 0,8)
f1='-2*exp(-x).*sin(x)';
[xmax,ymax]=fminbnd (f1, 0,8)
运行结果:
xmin = 3.9270ymin = -0.0279
xmax =0.7854ymax =0.6448

推荐阅读