大家能帮忙吗?本人极度感谢!
由于本人是新手,所以程序有不当地方请指出.谢谢!
(1)构成初试复合型.就是在一定区间随机产生一个值,并验证是否适合.
(2)计算各点函数的值.并把函数值最大点称为坏点H,最小点称为好点L.
(3)计算除坏点外的型心.
(4)计算映射点T.
(5)比较T和H,若T函数值少于H,则T代替H.若不能,修改计算映射点的数.
我的程序写得不好,望大家忍受一下.
文件 MHXF.C
------------------------------------------------------------------------------------------
#include "FHXF.c"
struct Point
{
double x;
double y;
}; /*构造结构*/
void main()
{
double a[]={0,0};
double b[]={8,9};
Point point[4];
complex(a,b,50,4,0.01,0.01,point[]);
}
---------------------------------------------------------------------------------------
文件 funt.c
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "MFHXF.c"
double objf(Point p) /*这是计算函数值*/
{
double f;
f=(pow((p.x-4),2)+pow((p.y-5),2));
return (f);
};
-----------------------------------------------------------------------------------------
文件strain.c
int strain (Point p) /*验证条件*/
{
int i;
double g[3];
g[0]=p.x-1;
g[1]=p.y-1;
g[2]=7-p.x-p.y;
for (i=0;i<3;i++)
{
if (g[i]<0)
{ return(0);}
}
return(1);
}
------------------------------------------------------------------------------------------
文件FHXF.C
#include "funct.c"
#include "strain.c"
#include "math.h"
double ran(double *r) /*产生随机数*/
{int m;
double y,s,u,v;
s=65536.0;u=2053.0;v=13849.0;
*r=u*(*r)+v;
m=(int)(*r/s);
*r=*r-m*s;
y=*r/s;
return(y);
};
void complex(double a[],double b[],int num,int k,double eps,double dlt,Point point[])
{ /*这里a为x,y下限,b为x,y上限,num为次数,k为点数,eps为判断结 束值,dlt为alfa的判断,Point为上面所定义的结构*/
Point temp,tt;
double q,alfa=1.3,tempcom;
double max,min,sumx=0,sumy=0;
double rr=1;
double r;
int t,count;
double kk;
double com[];
/*随机在区间产生各值并验证是否合适*/
for(i=0;i<k;i++)
{
do
{
r=ran(&rr);
point[i].x=*(a)+r*(*(b)-*(a));
point[i].y=*(a+1)+r*(*(b+1)-*(a+1));
iw=strain(point[i]);
kk=kk+1;
if (kk>num)
{
printf ("ÕÒ²»µ½³õÊÔ¿ÉÐе㣬¿ÉÄܳõÊÔÇø¼ä²»ºÏÊÊ");
return ;
}
}while (iw==0);
}
/*随机在区间产生各值并验证是否合适*/
/*计算各点函数的值*/
for(i=0;i<k;i++)
{
com[i]=objf(point[i]);
}
/*计算各值函数的值*/
loop1:
/*各点按函数值从大到小排列*/
count=0;
for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
if (com[i]<com[j])
{
t=com[j];
com[j]=com[i];
com[i]=t;
tt=point[i];
point[i]=point[j];
point[j]=tt;
}
}
}
/*各点按函数值从大到小排列*/
loop2:
/*计算除坏点和次坏点外各点函数值的均方根,评断结束*/
max=com[count];
min=com[count];
for (i=0;i<k;i++)
{
q+=(pow(com[i]-com[k]),2);
}
q=(q/k);
if (q<eps)
{
return;
}
/*计算除坏点和次坏点外各点函数值的均方根,评断结束*/
/*计算各点的型心*/
for(i=0;i<k;i++)
{
if (i<>count)
{
sumx+=point[i].x;
sumy+=point[i].y;
}
}
sumx=(sumx/(k-1));
sumy=(sumy/(k-1));
/*计算各点的型心*/
loop3:
/*有型心和坏点反方向得出新点*/
do
{
temp.x=sumx+alfa*(sumx-point[count].x);
temp.y=sumy+alfa*(sumy-point[count].y);
/*计算新点是否复合要求*/
iw=strain(temp);
alfa=0.5*alfa;
if (alfa<dlt) /*若新点在alfa一点少也不复合要求则,找次坏点(即函数值第二大的点)*/
{
count=count+1;
goto loop2
}
}while(iw==0);
/*计算各点的型心*/
tempcom=objf(temp);
/*若新点函数值少于坏点,则代替坏点.反之,则缩小alfa另求新点*/
if(tempcom<point[count])
{
point[max]=temp;
com[max]=tempcom;
alfa=1.3;
goto loop1;
}
else
{
goto loop3;
}
};
/*若新点函数值少于坏点,则代替坏点.反之,则缩小alfa另求新点*/
运行后得不到结果.............望大家帮帮忙!!!!!!!!!!!!