数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 4502|回复: 5

[注意]单纯型法的源程序

[复制链接]
发表于 2004-7-20 00:08:08 | 显示全部楼层 |阅读模式
<DIV class=postcolor>单纯型法的源程序
#include&lt;stdio.h&gt;
#include&lt;string.h&gt;
#define MAX 100
#define infinity 100000000
double c[MAX];
double g[MAX][MAX];
int B[MAX],mark[MAX];
// g[0] presents b;
// g[0] presents r;
int m,n;
int readdata()
{
int x,y;
memset(c,0,sizeof&copy;);
memset(g,0,sizeof(g));
memset(mark,0,sizeof(mark));
scanf("%d %d",&amp;n,&amp;m);
for(y=1;y&lt;=n;y++)scanf("%lf",&amp;c[y]);

for(x=1;x&lt;=m;x++)
{
scanf("%d",&amp;B[x]);
for(y=1;y&lt;=n;y++)
scanf("%lf",&amp;g[x][y]);
scanf("%lf",&amp;g[x][0]);
}
return 0;
}
int initial()
{
int x,y;
for(x=1;x&lt;=m;x++){mark[B[x]]=1;}
for(x=1;x&lt;=n;x++)
if(!mark[x])
{

g[0][x]=c[x];for(y=1;y&lt;=m;y++)g[0][x]-=c[B[y]]*g[y][x];//r=c-Cb*B^(
-1)*P
}
for(x=1;x&lt;=m;x++)g[0][0]+=c[B[x]]*g[x][0];
g[0][0]=-g[0][0];
return 0;
}
int guass(int a,int <!--emo&B)--><IMG><!--endemo-->
{
int x,y;
double mainelem,colelem;
mainelem=g[a];
for(x=0;x&lt;=n;x++)g[a][x]/=mainelem;
for(x=0;x&lt;=m;x++)
{
colelem=g[x];
if(x!=a)for(y=0;y&lt;=n;y++)
{
g[x][y]-=colelem*g[a][y];
}
}
return 0;
}
int print(int a,int <!--emo&B)--><IMG><!--endemo-->
{
int x,y;
printf("-----------\n");
for(x=1;x&lt;=m;x++)
{
printf("x%3d :",B[x]);
for(y=1;y&lt;=n;y++)
{
if(x==a&amp;&amp;y==<!--emo&B)--><IMG><!--endemo--> printf("[%6.3lf]",g[x][y]);
else printf("%7.3lf ",g[x][y]);
}
printf("| %5.1lf\n",g[x][0]);
}
printf("criti:");
for(x=1;x&lt;=n;x++)printf("%7.3lf ",g[0][x]);
printf("| %7.3lf\n",g[0][0]);
return 0;
}
int calc_max()
{
int x,y,i,j;
double max;int maxnum;
double min;int minnum;
int find;

while(1)
{
max=-infinity;
for(x=1;x&lt;=n;x++)if(g[0][x]&gt;max){max=g[0][x];maxnum=x;}//find
the max crit
erion
if(max&lt;=0)
{
print(0,0);
printf("the optimal solution is :%lf.\n",-g[0][0]);
return 0;
}else//col[mmnum]is the main col
{
find=0;min=infinity;
for(y=1;y&lt;=m;y++)
{
if(g[y][maxnum]&gt;0){
find=1;

if(g[y][0]/g[y][maxnum]&lt;min){min=g[y][0]/g[y][maxnum];minnum=y;}

}
}
if(!find){printf("no optimal solution!\n");return 0;}
mark[B[minnum]]=0;mark[maxnum]=1;
B[minnum]=maxnum;//the X[maxnum] enter the Base ,the
B[minnum] quit the B
ase;
print(minnum,maxnum);
guass(minnum,maxnum);
}
}
return 0;
}
int main()
{
freopen("sim.in","r",stdin);
freopen("sim.out","w",stdout);
readdata();
initial();
calc_max();
fclose(stdin);
fclose(stdout);
return 0;
}
数据文件格式:
6 3
-1 -1 4 0 0 0
4 1 1 2 1 0 0 9
5 1 1 -1 0 1 0 2
6 -1 1 1 0 0 1 4
第2行是价值系数
以后每行第一个是基变量,一定要有初始单位阵!
</DIV>
发表于 2004-7-20 19:27:40 | 显示全部楼层
看不懂,~~~~~~~~~~~~~~~
发表于 2004-7-22 19:19:33 | 显示全部楼层
<>                                </P><>                 你的程序是可以求解变量数100以内的线性规划(MAX型) ,大 M值是100000000</P><>                 线性规划问题有四种可能的结果,你的程序有几种结果 ?</P><P>                做现性规划程序最难的部分是初始化单纯形表,即构造单位矩阵。</P><P>                我也做了一个程序,不过没有你的境界高。没有引入大M法只能做约束条件是《=的情况 </P><P>                有意与小弟联系请回信 <a href="mailtyan-b-a-o@163.com" target="_blank" >yan-b-a-o@163.com</A></P><P>                </P>
[此贴子已经被作者于2004-7-23 22:39:41编辑过]

发表于 2004-8-4 21:19:25 | 显示全部楼层
你的程序是可以求解变量数100以内的线性规划(MAX型) ,大 M值是100000000<>   线性规划问题有四种可能的结果,你的程序有几种结果 ?</P><>  做现性规划程序最难的部分是初始化单纯形表,即构造单位矩阵。</P><>  我也做了一个程序,引入大M法能做所有约束条件&lt;= ,=, &gt;=的 情况 </P><P>  本人还有非常经典的商人过河程序。</P><P>  有谁有意与小弟联系请回信 <a href="http://www.shumo.com/bbs/mailtyan-b-a-o@163.com" target="_blank" ><FONT color=#000000>yan-b-a-o@163.com</FONT></A></P>
发表于 2004-8-4 21:19:26 | 显示全部楼层
你的程序是可以求解变量数100以内的线性规划(MAX型) ,大 M值是100000000<>   线性规划问题有四种可能的结果,你的程序有几种结果 ?</P><>  做现性规划程序最难的部分是初始化单纯形表,即构造单位矩阵。</P><>  我也做了一个程序,引入大M法能做所有约束条件&lt;= ,=, &gt;=的 情况 </P><P>  本人还有非常经典的商人过河程序。</P><P>  有谁有意与小弟联系请回信 <a href="http://www.shumo.com/bbs/mailtyan-b-a-o@163.com" target="_blank" ><FONT color=#000000>yan-b-a-o@163.com</FONT></A></P>
发表于 2005-8-22 00:37:55 | 显示全部楼层
<>太好了,我想要</P>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 12:40 , Processed in 0.092443 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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