| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 489 人关注过本帖
标题:有偿求助编写个主程序,算法已经给出
只看楼主 加入收藏
Reevon
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-3-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
有偿求助编写个主程序,算法已经给出
#include "math.h"
#include "iostream.h"
#include "stdlib.h"


#define E1 0.001//迭代收敛精度
#define ep 0.001//复合形法中映射系数
#define n  4        //设计变量的维数
#define k  5     //复合形法中的顶点数


float af=10;//初始映射系数
int i,j;
double X0[n],XX[n],X[k][n],FF[k];
void produce (double A[n],double B[n]);
int p=0;

double a[n],b[n];//
double F(double C[n]);//目标函数
int cons(double D[n]);//约束域
void bou();//

double *Complex();

double F(double C[n])//目标函数
{
    double F;

    F=1.56*7.6*pow(10,-2)*3*(C[0]*C[2]+0.5*(C[3]-C[2]-5)*(C[0]+C[1])+C[1]*5);
    return F;
}

int cons(double D[n])//约束域
{
    if(((D[0]-0.8>=0)&&(1.5-D[0]>=0))&&((D[1]-1.0>=0)&&(1.5-D[1]>=0))&&(D[1]-D[0]-0.1>=0)&&((D[2]-5>=0)&&(20-D[2]>=0))&&((D[3]-60>=0)&&(75-D[3]>=0))
        &&(3000-(6*492.5*D[3])/(7.6*3*D[0]*D[0])>=0))

        //D[0]是弹簧端部等厚部分的厚度h1;D[1]是弹簧中部厚度;D[2]是弹簧端部长度;D[3]弹簧主片最大伸直长度之半
    return 1;//若在约束域内则返回1
    else
        return 0;
}

void bou()//计算变量的边界条件
{
    a[0]=0.8;a[1]=0.8;a[2]=5;a[3]=60;
    b[0]=1.5;b[1]=1.5;b[2]=20;b[3]=75;
   
}

void produce(double A[n],double B[n])//产生复合的K个顶点
{
    double rr;int jj;
    do
    {
        rr=rand();  rr=rr/32767;//调用rand随机生成
        for(i=0;i<n;i++)
        {
            X[0][i]=A[i]+rr*(B[i]-A[i]);
            XX[i]=X[0][i];//产生起始点的维坐标
        }
    }
    while (cons(XX)==0);//若产生的起始点不在约束范围内,刚继续重新生成,直到在约束范围内为止
    for(j=1;j<k;j++)
    {    rr=rand();rr=rr/32767;
        for(i=0;i<n;i++)
        {
            X[j][i]=A[i]+rr*(B[i]-A[i]);//产生其余的K-1个点
        }
    }
   
    for(j=0;j<k;j++)//检查这其余的K-1个点
    {
        for(i=0;i<n;i++)
        {
            X0[i]=0;
            for(jj=0;jj<j+1;jj++)
            {
                X0[i]+=X[jj][i];//
            }
            X0[i]=(1/(j+1.0))*(X0[i]);//求出这K个点的形心
            XX[i]=X[j][i];//第J个点
        }
        while(cons(XX)==0)//若其余的K-1个点有某个点不在可行域内
        {
            for(i=0;i<n;i++)
            {
                X[j][i]=X0[i]+0.5*(X[j][i]-X0[i]);//产生新的点,直到这个点在可行域内
                XX[i]=X[j][i];//
            }
        }//至此所有的点均在可行域内
    }
}



double *Complex()
{
    double EE,Xc[n],Xh[n],Xg[n],Xl[n],Fh,Fg,Fl,Xr[n],*prXl;
    int h,g,l;

    bou();
    produce(a,b);
    EE=E1+1;
    while(EE>E1)//初始迭代条件大于终于迭代条件
    {
        for(i=0;i<n;i++)
        {
            Xc[i]=0;
            for(j=0;j<k;j++)
            {
                Xc[i]+=X[j][i];
            }
            Xc[i]=1/(k+0.0)*Xc[i];//生成形心
        }
        for(j=0;j<k;j++)
        {
            for(i=0;i<n;i++)
            { XX[i]=X[j][i];}
            FF[j]=F(XX);
        }
        Fh=FF[0];Fg=FF[0];Fl=FF[0];h=0;g=0;l=0;
        for(j=0;j<k;j++)
        {
            if(FF[j]>Fh)
            { Fh=FF[j];h=j;}//最坏点FH
            if(FF[j]<Fl)
            { Fl=FF[j];l=j;}//最好点
        }
        for(j=0;j<k;j++)
            if((FF[j]>Fg)&&(j!=h))//次坏点FG
            { Fg=FF[j];g=j; }
        for(i=0;i<n;i++)
        {
            Xh[i]=X[h][i];Xg[i]=X[g][i];Xl[i]=X[l][i];//分别在某维时的最坏,次坏,最好点
        }
        EE=0;
        for(j=0;j<k;j++)
        {  EE+=pow((FF[j]-F(Xc)),2);}//顶点与目标函数值之间之差的二次幂的和
        EE=pow((1/(k+0.0)*EE),0.5);//和的均方根
        
        
        p++;


        if(EE<=E1)//若满足终止迭代条件
        {
            cout<<"\n F(Xmin)="<<F(Xl);//目标函数
            prXl=&X[l][0];break;//最优解,跳出while循环
        }

        for(i=0;i<n;i++)
        {
            Xc[i]=0;
            for(j=0;j<k;j++)
            {
                if(j!=h)
                    Xc[i]+=X[j][i];//求其余各点的形心
            }
            Xc[i]=1/(k-1.0)*Xc[i];//求其余各点形心
        }
        if(cons(Xc)==1)//形心在约束范围内
        {
            while(cons(Xc)==1)
            {
                for(i=0;i<n;i++)
                {
                    Xr[i]=Xc[i]+af*(Xc[i]-Xh[i]);//求最坏(次)点的映射点
                }
                if(cons(Xr)==1)//映射点在约束范围内
                {
                    if(F(Xr)>=F(Xh))//若映射点比最坏点还要坏
                    {
                        if(af<=ep)//且此时已经小于了要求精度
                        {
                            for(i=0;i<n;i++)
                            { Xh[i]=Xg[i]; }//则用次坏代替最坏,同时返回    while(cons(Xc)==1)
                        }
                        else//若比要求精度大,则将步长缩小一半,返回    while(cons(Xc)==1),继续迭代
                            af=float(1/2.0*af);
                    }
                    else//若映射点比最坏点好
                    {
                            for(i=0;i<n;i++)
                            { X[h][i]=Xr[i];}//用映射点代替最坏点
                            break;//跳出循环    while(cons(Xc)==1),重新建立新的K个点,约束域
                    }
                }
                    else     //映射点不在约束范围内步长变为1/2
                        af=(float)(1/2.0*af);
            }
        }
   
        else//若形心在约束域外
        {
                for(i=0;i<n;i++)
                { a[i]=Xl[i];b[i]=Xc[i]; }//则心形心与最好点构成新的复合图形或复合体
                produce(a,b);
        }
    }
        return prXl;
}
   




    void main()
    {

        int i;double *pr;
   


        cout<<"F(x)=1.56*7.6*10^(-2)*3*(C[0]*C[2]+0.5*(C[3]-C[2]-5)*(C[0]+C[1])+C[1]*5)"<<endl;
        cout<<"x[0]是弹簧端部等厚部分的厚度h1"<<endl;
        cout<<"x[1]是弹簧中部厚度"<<endl;
        cout<<"x[2]是弹簧端部长度"<<endl;
        cout<<"x[3]弹簧主片最大伸直长度之半"<<endl;
        pr=Complex();
        cout<<"\n";
   
    for(i=0;i<n;i++)
        {
            cout<<"X["<<i<<"]="<<*(pr+i)<<"\n";

        }
    cout<<"迭代次数"<<endl;
    cout<<p<<endl;
    }

为什么运行没结果,有意者加我QQ 414738266
搜索更多相关主题的帖子: 主程序 
2011-04-19 13:39
njkido
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:224
专家分:1184
注 册:2011-3-8
收藏
得分:10 
这边死循环了 看看cons里面的if条件是否需要调整
程序代码:
    do
    {
        rr=rand();  rr=rr/32767;//调用rand随机生成
        for(i=0;i<n;i++)
        {
            X[0][i]=A[i]+rr*(B[i]-A[i]);
            XX[i]=X[0][i];//产生起始点的维坐标
        }
    }
    while (cons(XX)==0);//若产生的起始点不在约束范围内,刚继续重新生成,直到在约束范围内为止
2011-04-19 13:45
那又怎样
Rank: 2
等 级:论坛游民
帖 子:22
专家分:58
注 册:2011-4-11
收藏
得分:10 
代码轰炸呀!!!!!
2011-04-19 13:50
Reevon
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-3-27
收藏
得分:0 
以下是引用njkido在2011-4-19 13:45:15的发言:

这边死循环了 看看cons里面的if条件是否需要调整
 
    do
    {
        rr=rand();  rr=rr/32767;//调用rand随机生成
        for(i=0;i
还是不行哦,高手
2011-04-19 13:53
njkido
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:224
专家分:1184
注 册:2011-3-8
收藏
得分:0 
产生的顶点无法满足约束域的条件 造成死循环

程序的算法就有问题
2011-04-19 14:10
Reevon
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-3-27
收藏
得分:0 
以下是引用njkido在2011-4-19 14:10:36的发言:

产生的顶点无法满足约束域的条件 造成死循环
 
程序的算法就有问题
可是我在三个变量下是可以运行的  只是把它的程序拿过来修改了一下目标函数和约束函数以及变量上下界
2011-04-19 14:29
快速回复:有偿求助编写个主程序,算法已经给出
数据加载中...
 
   



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

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