关于运筹学的问题

ALIZ 2002-10-18 07:21:59
如何用C语言解决线性规划问题(用单纯形法解)
...全文
114 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ALIZ 2002-10-23
  • 打赏
  • 举报
回复
WA~~~~
是C++啊,看不懂耶,看来得学学C++了~~~~
morning7spring 2002-10-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>
#include<iostream.h>

#define BORDER -0.00001
#define M 100

int main()
{
int k; //初始变量的个数
int m; //约束条件的个数;
cout<<"输入初始变量的个数 "<<endl;
cin>>k;
cout <<"输入约束条件的个数"<<endl;
cin>>m;
cout<<"输入约束条件的种类"<<endl;
cout<<"0 means <="<<endl;
cout<<"1 means >="<<endl;
cout<<"2 means ="<<endl;
int NGET=0;
int NLET=0;
int NET =0;
int I =0;//人工变量;
int *code=new int[m]; //the array of the >= <= =;
for(int i=0;i<m;i++)
{
cin>>code[i];
if(code[i]==0)
NGET++;
if(code[i]==1)
NLET++;
I++ ;
if(code[i]==2)
NET++;
I++ ;
}
int n; //变量总和;
n=k+2*NLET+NGET+NET;

float *Index=new float[n+1]; //目标函数的系数;
float *c=new float[n+1];
int NTYPE;
for(i=0;i<n+1;i++)
Index[i]=0.0;//为语法要求定初值;
cout<<"输入目标函数的系数"<<endl;
for(i=0;i<k;i++)
cin>>Index[i];
for(i=k+NGET+NLET;i<n;i++)//人工变量所在的列;
Index[i]=-M; //the initionalization of indexes of manul variable;
cout<<"输入所求函数的类型是求最大还是最小"<<endl;
cout<<"0 means min"<<endl;
cout<<"1 means max"<<endl;
cin>>NTYPE;

if(NTYPE) //the initionalization of the c[i];
{
for(i=0;i<n+1;i++)
c[i]=-Index[i];//一般情况下只要将目标函数系数的相反数输入;
}
if(!NTYPE)
{
for(i=0;i<n+1;i++)
if(i<k+NGET+NLET)
c[i]=Index[i];
else c[i]=-Index[i];
}

delete []Index;

float **a=new float*[m+1]; //the array of all the variable to compute;
for(i=0;i<m+1;i++)
a[i]=new float[n+1];
int INDEXG=k;
int INDEXL=k+NGET;
int INDEXE=k+NGET+NLET;
int *ARTV=new int[I]; //保存人工变量;
for(i=0;i<m;i++) //the analization of the code[](<= >= =);
{
if(code[i]==0)
{
a[i][INDEXL]=1.0;
INDEXL++;
}
if(code[i]==1)
{
a[i][INDEXE]=1.0;
INDEXE++;
a[i][INDEXG]=-1.0;
INDEXG++;
ARTV[I]=i;
I++;
}
if(code[i]==2)
{
a[i][INDEXE]=1.0;
INDEXE++;
ARTV[I]=i;
I++;
}
}


if( (INDEXG!=k+NLET) || (INDEXL!=k+NGET+NLET) || (INDEXE!=n) )//excption
{
return -1;
}
cout<<"输入约束表达式左边的系数"<<endl;
for(i=0;i<m;i++)
for(int j=0;j<k;j++)
cin>>a[i][j];

float *b=new float[m];
cout<<"输入约束表达式右边的值" <<endl;
for(i=0;i<m;i++)
cin>>b[i];
for(i=0;i<m;i++)
a[i][n]=b[i];
float *temp=new float[n+1];

if(I)
{
for(i=0;i<I;i++)
for(int j=0;j<n+1;j++)
{
temp[j]=-a[ARTV[i]][j];
c[j]+=M*temp[j];
}
}
for(i=0;i<n+1;i++)
a[m][i]=c[i];


for(i=0;i<m+1;i++)
{
for(int j=0;j<n+1;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}

int flag=0;
float temp1;
float temp2;
int K,J;
int index;
for(i=0;i<n;i++)
if(a[m][i]<0)flag=1; //检验系数;
while(flag) //Using a[][] to compute the result;
{
temp1=0;
for(i=0;i<n;i++)
{
if(temp1>a[m][i])
{
temp1=a[m][i];
K=i;

}
}

temp2=M;
for(i=0;i<m;i++)
{
if(a[i][K]>0&&(a[i][n]/a[i][K])<temp2)
{
temp2=a[i][n]/a[i][K];
J=i;
}
}
if(temp2==M)
{
cout<<"无解!"<<endl;return -1;
}
float temp3=a[J][K];
for(i=0;i<n+1;i++)
{
a[J][i]=a[J][i]/temp3;
}

for(i=0;i<m+1;i++)
{
if(i!=J)
{
float temp4=a[i][K];
for(int j=0;j<n+1;j++)
{
a[i][j]=a[i][j]- a[J][j]*temp4;

}
}
cout<<endl;
}
flag=0;
for(i=0;i<n+1;i++)
{
if(a[m][i]<BORDER)flag=1;
}

cout<<"**************************************"<<endl;
for(i=0;i<m+1;i++)
{
for(int j=0;j<n+1;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"***************************************"<<endl;
getchar();

}

if(NTYPE)
cout<<"The answer is :"<<a[m][n];
if(!NTYPE)
cout<<"The answer is :"<<-a[m][n];
getchar();
return 0;
}







haode 2002-10-22
  • 打赏
  • 举报
回复
去数据结构吧
morning7spring 2002-10-22
  • 打赏
  • 举报
回复
我操,前几天刚写了一个交给了老师。可惜删了,我去邮箱找找看有没有附件
ALIZ 2002-10-22
  • 打赏
  • 举报
回复
本人只是想对比一下看看是不是有更优的写法
jingxin98 2002-10-19
  • 打赏
  • 举报
回复
老大,单纯形法是运筹学里最简单的问题,您能不能好好的看一下tsinghua大学出版的运筹学呀,算法很简单的。再参照一下,西交大的那个软件,你就能明白了
间谍 2002-10-18
  • 打赏
  • 举报
回复
把这个贴子结了,去数据结构与算法里问吧,那里有牛人.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧