发酵人社区,发酵技术论坛,发酵产品,发酵工艺,发酵服务

 找回密码
 立即注册

微信扫一扫,快捷登录!

搜索
热搜: 活动 交友 discuz
查看: 2605|回复: 2

用C语言实现单纯形优化算法<l转贴>

[复制链接]

2676

主题

5878

回帖

1万

积分

超级版主

将我的知识与大家分享

Rank: 8Rank: 8

积分
12363

社区居民忠实会员社区劳模终身成就奖优秀斑竹奖宣传大使奖

QQ
发表于 2006-9-10 10:53:56 | 显示全部楼层 |阅读模式
//在Visual C++控制台程序中编译执行
#include&lt;iostream.h&gt;
#include&lt;math.h&gt;
#define M 10000
//全局变量
float kernel[11][31];//核心矩阵表
int m=0,n=0,t=0;//m:结构向量的个数
                 //n:约束不等式个数
                 //t:目标函数类型:-1代表求求最小值,1代表求最大值
//输入接口函数
void input()
{
     //读入所求问题的基本条件
  cout&lt;&lt;&quot;----------参 数 输 入-----------&quot;&lt;&lt;endl;
  cout&lt;&lt;&quot;请按提示输入下列参数:&quot;&lt;&lt;endl&lt;&lt;endl;
    cout&lt;&lt;&quot;  结构向量数m:  &quot;&lt;&lt;&quot;   m=  &quot;;
    cin&gt;&gt;m;
    cout&lt;&lt;endl&lt;&lt;&quot;  约束不等式数n:&quot;&lt;&lt;&quot;   n=  &quot;;
    cin&gt;&gt;n;
   int i,j;
   //初始化核心向量
   for (i=0;i&lt;=n+1;i++)
    for (j=0;j&lt;=m+n+n;j++)
         kernel [j]=0;
   //读入约束条件
   cout&lt;&lt;endl&lt;&lt;&quot;  约束方程矩阵的系数及不等式方向(1代表&lt;=,-1代表&gt;=):&quot;&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot;          &quot;;
   for (i=1;i&lt;=m;i++)
       cout&lt;&lt;&quot;   x&quot;&lt;&lt;i;
       cout&lt;&lt;&quot;  不等式方向 &quot;&lt;&lt;&quot; 常数项&quot;&lt;&lt;endl;
   for (i=1;i&lt;=n;i++)
    {
      cout&lt;&lt;&quot;    不等式&quot;&lt;&lt;i&lt;&lt;&quot;  &quot;;
      for (j=1;j&lt;=m+2;j++)     
          cin&gt;&gt;kernel [j];
    }

  for (i=1;i&lt;=n;i++)
     {
       kernel [0]=kernel [m+2];
       kernel [m+2]=0;
     }
  //读入目标条件
  cout&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot; 目标函数的系数及类型(求最小值:1;求最大值:-1):&quot;&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot;                &quot;;
   for(i=1;i&lt;=m;i++)
        cout&lt;&lt;&quot;x&quot;&lt;&lt;i&lt;&lt;&quot;   &quot;;
  cout&lt;&lt;&quot;类型&quot;&lt;&lt;endl&lt;&lt;&quot;  &quot;;
  cout&lt;&lt;&quot;  目标函数:   &quot;;
   for (i=1;i&lt;=m;i++)
     cin&gt;&gt;kernel [0];
     cin&gt;&gt;t;
  //矩阵调整
  if(t==-1)
      for(i=1;i&lt;=m;i++)
          kernel [0]=(-1)*kernel [0];
  for(i=1;i&lt;=n;i++)
  {
      kernel [m+i]=kernel [m+1];
         if(i!=1)
             kernel [m+1]=0;
  }
}

//算法函数
void comput()
{
    int i,j,flag,temp1,temp2,h,k=0,temp3[10];
    float a,b[11],temp,temp4[11],temp5[11],f=0,aa,d,c;
    //初始化
  for(i=1;i&lt;=n;i++)
     temp3=0;
   for(i=0;i&lt;11;i++)
   {    temp4=0;
       temp5=0;
   }
    for(i=1;i&lt;=n;i++)
  {
     if(kernel [m+i]==-1)
      {
        kernel [m+n+i]=1;
        kernel [0][m+n+i]=M;
        temp3=m+n+i;
      }
     else
         temp3=m+i;
  }
     for(i=1;i&lt;=n;i++)
           temp4=kernel [0][temp3];

     //循环求解
do{   
    for(i=1;i&lt;=m+n+n;i++)
      {  
        a=0;
        for(j=1;j&lt;=n;j++)
           a+=kernel [j]*temp4[j];
           kernel [n+1]=kernel [0]-a;
        }
    for(i=1;i&lt;=m+n+n;i++)
         {
            if(kernel [n+1]&gt;=0) flag=1;
             else
             {  
                 flag=-1;
                 break;
             }
          }
    if(flag==1)
    {     for(i=1;i&lt;=n;i++)
             {
                  if(temp3&lt;=m+n) temp1=1;
                            else
                              {
                                  temp1=-1;
                                  break;
                               }
              }
    //输出结果
    cout&lt;&lt;endl&lt;&lt;endl;
    cout&lt;&lt;&quot;----------结 果 输 出-----------&quot;&lt;&lt;endl&lt;&lt;endl;
        if(temp1==1)
           {
              cout&lt;&lt;&quot; 此线性规划的最优解存在!&quot;&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot;  最优解为:&quot;&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot;     &quot;;
              for(i=1;i&lt;=n;i++)
                 temp5[temp3]=kernel [0];
              for(i=1;i&lt;=m;i++)
                 f+=t*kernel [0]*temp5;
            
              for(i=1;i&lt;=m;i++)
              {
                 cout&lt;&lt;&quot;x&quot;&lt;&lt;i&lt;&lt;&quot; = &quot;&lt;&lt;temp5;
                 if(i!=m)
                     cout&lt;&lt;&quot;, &quot;;
              }
              cout&lt;&lt;&quot; ;&quot;&lt;&lt;endl&lt;&lt;endl&lt;&lt;&quot;     最优目标函数值f= &quot;&lt;&lt;f&lt;&lt;endl&lt;&lt;endl;
              return ;
            }
            else
            {   
                cout&lt;&lt;&quot; 此线性规划无解&quot;&lt;&lt;endl&lt;&lt;endl;
                return ;
            }
      }
   if(flag==-1)
   {   
       temp=100000;
       for(i=1;i&lt;=m+n+n;i++)
          if(kernel [n+1]&lt;temp)   
            {
              temp=kernel [n+1];
              h=i;                    
            }
            
        for(i=1;i&lt;=n;i++)
          {   
            if(kernel [h]&lt;=0) temp2=1;
                else {
                              temp2=-1;
                              break;
                    }                       
          }
   }
    if(temp2==1)  
     {
        cout&lt;&lt;&quot;此线性规划无约束&quot;;
         return  ;
     }
   if(temp2==-1)
   {   
      c=100000;
      for(i=1;i&lt;=n;i++)
        {
           if(kernel [h]!=0)  b=kernel [0]/kernel [h];
           if(kernel [h]==0)  b=100000;
           if(b&lt;0)     b=100000;
           if(b&lt;c)
           {
               c=b;
               k=i;
           }
      }
         temp3[k]=h;
         temp4[k]=kernel [0][h];
         d=kernel [k][h];
      for(i=0;i&lt;=m+n+n;i++)
        kernel [k]=kernel [k]/d;
      for(i=1;i&lt;=n;i++)
      {     if(i==k)
         continue;
         aa=kernel [h];
         for(j=0;j&lt;=m+n+n;j++)
            kernel [j]=kernel [j]-aa*kernel [k][j];
      }
   }
   
}
while(1);
     return ;
}

//主函数
void main()
{ cout&lt;&lt;&quot;-------------------单纯形算法程序----------------------&quot;&lt;&lt;endl&lt;&lt;endl;
  input();
  comput();
}
欢迎关注发酵人自己的微信号: comefajiaoren
回复

使用道具 举报

538

主题

51

回帖

1521

积分

★★★★

积分
1521

终身成就奖

发表于 2006-12-22 08:44:07 | 显示全部楼层
lz比较的强,lx不懂C语言,想学,啥时候请教下,呵呵!
回复 支持 反对

使用道具 举报

2676

主题

5878

回帖

1万

积分

超级版主

将我的知识与大家分享

Rank: 8Rank: 8

积分
12363

社区居民忠实会员社区劳模终身成就奖优秀斑竹奖宣传大使奖

QQ
 楼主| 发表于 2006-12-22 17:36:30 | 显示全部楼层
谈不上请教,我也只学了一点,用到什么就到书上或网上找,然后修改.这样程序就出来了.
欢迎关注发酵人自己的微信号: comefajiaoren
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|发酵人社区发酵技术论坛,发酵产品,发酵工艺,发酵服务 ( 沪ICP备16030267号

GMT+8, 2024-5-14 11:32 , Processed in 0.135103 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表