| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 798 人关注过本帖
标题:求大虾帮改一个小程序
只看楼主 加入收藏
roseknife
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-12-25
结帖率:0
收藏
 问题点数:0 回复次数:10 
求大虾帮改一个小程序
        求大虾帮帮小弟的忙把程序中的goto 改成标准的C语句。先谢谢了。
#include<math.h>
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 2
#define K 4
int n;
/*目标函数*/
double  Obj_Func_fx    (double x[])
{
    double fun_f;
    fun_f = (x[0]-5)*(x[0]-5)+4*(x[1]-6)*(x[1]-6);
    return fun_f;
}
/*限制条件*/
int constraint (double x[],double g[])/*判断产生的点是否满足约束条件若满足返回1否则返回0*/
{  
    g[0] = 64-(x[0] * x[0])-(x[1] * x[1]);  
    g[1]=x[1] - x[0] - 10;
    g[2]=x[0] - 10;
    if(g[0] <= 0 && g[1] <= 0 && g[2] <= 0)
        return 1;
    else
        return 0;
   
}

void xcent (int n,int k,int ll,int lh,double x0[],double xcom[][100])
  {
       int i,l;
       double xs;
       for(i = 0;i < n;i++)
       {
         xs = 0;
         for( l = 0;l < ll;l++)
          {
            if(l != lh)
            xs = xs + xcom[i][l];
          }
         if(lh > -1)
            x0[i] = xs / (ll-1);
         else
         x0[i] =xs / ll;   
       }
  }
 
     

void fxse (int n,int k,double x[],double xcom[][100],double fxk[])
{
       int l,lp,lp1,i;
       double temp;
       for(l = 0;l < k-1;l++)
            for(lp = 0;lp < k-l;lp++)
            {
                lp1 = lp+1;
                if(fxk[lp] <= fxk[lp1])
                {
                    temp = fxk[lp];
                    fxk[lp] = fxk[lp1];  
                    fxk[lp1] = temp;
                    for(i = 0;i < n;i++)
                    {
                        x[i] = xcom[i][lp];  
                        xcom[i][lp] = xcom[i][lp1];  
                        xcom[i][lp1] = x[i];
                    }
                }
            }
}

   

int comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f)   
{
    int i,j,i_s,ll,lh,it;
    double fx,fx0,sdx,fxh,fxr,alp;
    double *x0 = (double*)calloc(n,sizeof(double));/*开辟一个double字节的空间赋给x0所指向的单位*/
    double *xh = (double*)calloc(n,sizeof(double));
    double *xr = (double*)calloc(n,sizeof(double));
    double *fxk = (double*)calloc(k,sizeof(double));
    double *g = (double*)calloc(kg,sizeof(double));
s5: for(i = 0;i < n;i++)
       x[i] = bl[i] + rand() / 32767.0 * (bu[i] - bl[i]);/*产生一组随机数*/
    i_s = constraint(x,g);               
    if(i_s==0)
           goto s5;
        for(i = 0;i < n;i++)
           xcom[i][0] = x[i]; /*将第一个点存入数组*/
        for(j = 1;j < k;j++)
            for(i = 0;i < n;i++)
                xcom[i][j] = bl[i] + rand() / 50000.0 * (bu[i]-bl[i]);/*产生其余的两个点*/
        lh = -1;
    for(ll = 1;ll < k;ll++)
    {
        xcent(n,k,ll,lh,x0,xcom);
        i_s = constraint (x0,g);
        if(i_s==0)   
        goto s5;  
        for(i = 0;i < n;i++)
            x[i] = xcom[i][ll+1];
s24:    i_s = constraint (x,g);    /*判断x1,x2是否满足约束条件*/
        if(i_s==0)/*如果不满足则重新产生点直到满足为止*/
        {
            for(i = 0;i < n;i++)
                x[i] = x0[i] + 0.5 * (x[i]-x0[i]);
            goto s24;
        }
         else
        {
            for(i = 0;i < n;i++)
                xcom[i][ll+1] = x[i];
        }
    }
    for(j = 0;j < k;j++)
    {
        for(i = 0;i < n;i++)
            x[i] = xcom[i][j];
        fx = Obj_Func_fx(x);
        fxk[j] = fx;
    }
    it = 0;
s14: it = it+1;/*输出年代次数(每满10次输出一次),x1,x2及相应的目标函数值*/
    if(it%10==0)
        printf("\n\n迭代次数= %2d\n",it);
     lh = -1;
    xcent(n,k,k,lh,x0,xcom);
    fx0 = Obj_Func_fx(x0);
    i_s = constraint (x0,g);
    for(i = 0;i < n;i++)
        if(it % 10==0)
            printf("X(%d) = %.5f  ",i+1,x0[i]);
    if(it%10==0)   
        printf( " 目标函数值 f(x) =%.5f",fx0);
    sdx = 0;
    for(j = 0;j < k;j++)
        sdx = sdx + (fx0-fxk[j])*(fx0-fxk[j]);
    sdx = sqrt(sdx/(double)(k-1));
    if(sdx < ep)  /*判断是否满足精度*/
        goto s38;
    fxse(n,k,x,xcom,fxk);
    lh = 0;
s22: fxh = fxk[lh];
     for(i = 0;i < n;i++)
        xh[i] = xcom[i][lh];
     xcent(n,k,k,lh,x0,xcom);
     i_s = constraint(x0,g);
     if(i_s==0)
        goto s36;
     alp = 1.3;
s12: for(i = 0;i < n;i++)
        xr[i] = x0[i] + alp * (x0[i] - xh[i]);
        i_s = constraint(xr,g);
      
        if(i_s==0)
        {
            alp = alp * 0.5;
            goto s12;
        }
        fxr = Obj_Func_fx(xr);
        if(fxr >= fxh)
        {
            if(alp>1.0e-4)
            {
                alp=alp*0.5;
                goto s12;
            }
            lh = lh+1;
            if(lh < 3)
                goto s22;
       }
       for(i = 0;i < n;i++)
            xcom[i][lh] = xr[i];
       fxk[lh] = fxr;
       goto s14;
s36: for(i = 0;i < n;i++)
     {
         bl[i] = xcom[i][k];
         bu[i] = x0[i];
     }
       goto s5;
s38: for(i = 0;i < n;i++)/*计算目标函数值*/
       x[i] = x0[i];
       *f = Obj_Func_fx(x);
       return it;
       free(x0);/*释放内存*/
       free(xh);
       free(xr);
       free(g);
       free(fxk);

}
/*  n-优化模型维数 k-复合形顶点数 kg-约束函数个数  ep-收敛精度 bl-初始点下限 bu-初始点上限 *f进程中的优化结果  */
void main    ()  
{   
    int comple(int n,int k,int kg,double ep,double x[],double bl[],double bu[], double xcom[][100],double *f) ;   
    double a[]={0,0},b[]={10,20};/*初始点上限和下限*/
    double f;
    double x[2],xcom[2][100];
    int n;/*总迭代次数*/
    n = comple(N,K,3,0.00001,x,a,b,xcom,&f);
    printf("\n\n\n    总迭代次数    输出最优解          目标函数值:\n");
    printf("\n       %d        x*=[%.5f   %.5f]    f(x*)=%.5f\n\n ",n,x[0],x[1],f);
}

  


[ 本帖最后由 roseknife 于 2011-5-11 22:20 编辑 ]
搜索更多相关主题的帖子: return 
2011-05-11 22:19
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:0 
goto也属于标准C
或者,可以改while(1)代替

********多贴代码,少说空话*******
2011-05-11 22:49
roseknife
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-12-25
收藏
得分:0 
能改成结构化的吗?不怎么会~~ 求高手帮个忙,急用!
2011-05-11 23:00
adan51
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2009-6-3
收藏
得分:0 
这个程序好长啊,我也是新手,顶一顶吧
2011-05-12 20:05
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
不要用goto  如果非要让我用  我会把它用来杀死我的程序

也就是程序出现致命错误的时候 跳到结束程序语句

别的我已经忽略它很久很久了

                                         
===========深入<----------------->浅出============
2011-05-12 20:27
其实、不想说
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:122
专家分:156
注 册:2011-3-3
收藏
得分:0 
顶,过来拿分的、、、goto语句我从来都没用过,老师也没讲叫我们别用!!!
2011-05-13 09:58
以中
Rank: 3Rank: 3
来 自:长沙
等 级:论坛游侠
帖 子:108
专家分:129
注 册:2010-4-13
收藏
得分:0 
s5: for(i = 0;i < n;i++)
       x[i] = bl[i] + rand() / 32767.0 * (bu[i] - bl[i]);/*产生一组随机数*/
    i_s = constraint(x,g);               
    if(i_s==0)
           goto s5;
改为:
while(i_s!=0)
{
 for(i = 0;i < n;i++)
       x[i] = bl[i] + rand() / 32767.0 * (bu[i] - bl[i]);/*产生一组随机数*/
    i_s = constraint(x,g);               
}         

道之所存,师之所存。
2011-05-13 13:43
水木天
Rank: 1
等 级:新手上路
帖 子:11
专家分:8
注 册:2011-5-12
收藏
得分:0 
能把goto用好的绝对是高手
2011-05-13 20:23
jasonrenest
Rank: 2
等 级:论坛游民
帖 子:6
专家分:10
注 册:2010-8-24
收藏
得分:0 
回复 7楼 以中
这样执行的结果好像是直到i_s等于0的时候跳出循环吧?请教ing
2011-05-13 20:41
tudou2xigua
Rank: 2
等 级:论坛游民
帖 子:87
专家分:54
注 册:2011-3-20
收藏
得分:0 
好长啊,路过
2011-05-13 22:04
快速回复:求大虾帮改一个小程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026020 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved