单纯形及对偶单纯形程序文档格式.docx
- 文档编号:20912051
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:18
- 大小:99.26KB
单纯形及对偶单纯形程序文档格式.docx
《单纯形及对偶单纯形程序文档格式.docx》由会员分享,可在线阅读,更多相关《单纯形及对偶单纯形程序文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
shuzuzhuanhuan();
shuchujibianliangjiazhixishu();
shuchujianyanshu();
shuchurujibianliang();
}
yunsuanjieguo();
voidchushihuaxishuhanglieshi()
{
printf("
请以增广矩阵形式输入系数:
\n"
);
for(i=0;
i<
m;
i++)
for(j=0;
j<
n;
j++)
scanf("
%f"
&
a[i][j]);
voidshuchuxishuhanglieshi()
{printf("
系数增广矩阵\n"
for(i=0;
{
for(j=0;
j++)printf("
%9.3f"
a[i][j]);
printf("
}
voidshuchujibianliangdelie()
for(j=1,h=1;
j++)
{
for(g=0,i=0;
i++)if(a[i][j]==0)g++;
if(g==(m-1))
{
lj[h]=j;
h++;
}
printf("
基变量的列下标"
for(i=1;
%5d"
lj[i]);
\n\n"
}
voiddanweikexingjijuzhen()
j++)b[i][j]=0.0;
for(i=1;
i++)b[i][i]=1.0;
voidshuchujibianliangjiazhixishu()
c[i]=a[0][lj[i]];
基变量价值系数:
"
c[i]);
voidshuchujianyanshu()
for(j=1;
y[j]=0.0;
i++)
y[j]+=c[i]*b[i][j];
for(r=1;
r<
r++)
if(lj[r]==j)
{
e[j]=0.0;
break;
}
e[j]=a[0][j];
for(i=1;
e[j]=e[j]-y[i]*a[i][j];
检验数:
e[i]);
voidchujibianliang()
bi[i]=0.0;
r++)
bi[i]+=b[i][r]*a[r][0];
bi[i]**"
bi[i]);
ai[i]=0.0;
ai[i]+=b[i][r]*a[r][k];
ai[i]**"
ai[i]);
seta=1650.0;
if(ai[j]>
0)
if(seta>
bi[j]/ai[j])
{
seta=bi[j]/ai[j];
minh=j;
}
出基变量:
x%d\n"
lj[minh]);
lj[minh]=k;
当前基变量下标\n"
voidshuzuzhuanhuan()
l=minh;
p=ai[l];
lj[l]=k;
d[i][j]=0.0;
i++)d[i][i]=1.0;
i++)d[i][l]=(-1)*ai[i]/p;
d[l][l]=(float)1.0/p;
for(j=1;
f[i][j]=0.0;
for(r=1;
r++)f[i][j]+=d[i][r]*b[r][j];
for(j=1;
b[i][j]=f[i][j];
voidshuchurujibianliang()
maxcj=e[1];
maxl=1;
for(j=2;
if(maxcj<
e[j])
maxcj=e[j];
maxl=j;
if(maxcj==0)gotoloop;
k=maxl;
入基变量:
k);
loop:
;
voidyunsuanjieguo()
r++)bi[i]+=b[i][r]*a[r][0];
z=0.0;
x%d=%9.3f\n"
lj[i],bi[i]);
z+=bi[i]*c[i];
Zmax=%9.3f\n"
z);
}
程序说明:
由于程序中要调用子程序,因此将所有的变量都定义为全局变量。
第二行和第三行为预编译命令。
由于C语言中不允许定义动态数组,因此该程序的通用性有一定的局限性:
对于不同的变量数目和约束方程个数,要修改对数组的预编译值。
但使用预编译能做到一改全改,在一定程度上缓解了这种局限性。
不过,如果将数组定义的足够大,那么便不存在这样的局限性,但是这将浪费很大的内存空间,也是不太可取的。
接下来几行是对程序中用到的变量进行定义。
紧接着的是对子程序的声明。
各子程序的意义如下:
该子程序为“初始化系数行列式”,有一点要注意,C语言中数组的下标是从零开始的,为了与我们的习惯相一致,对系数的初始化时可用如下方法:
C1
C2
C3
……
Cn
B1
A11
A12
A13
A1n
B2
A21
A22
A23
A2n
Bn
An1
An2
An3
Ann
其中,Ann是变量的系数,Bn是资源向量,Cn是价值系数。
该子程序将增广矩阵数组输出,不再做过多说明。
该子程序将在初始化后的矩阵中找出可行基的下标。
voiddanweikexingjijuzhenbianhuan();
该子程序将完成对b[i][j]的转换,为下一步求解检验数做准备。
该子程序将输出基变量的价值系数。
该子程序输出基变量的检验数。
该子程序输出入基变量。
该子程序给出基变量。
该子程序对a[i][j]数组进行变换。
该子程序将输出运算结果。
另外做一点说明,由于采用了预编译,编译系统偶尔可能提示‘警告’,‘警告’会出现在#definen6这一句,只需多点几次编译就行了。
例子可采用老师讲课时举的那个题目。
输入:
123000
812100
1640010
1204001
运行的结果可参见如下截图:
对偶单纯形法的程序如下:
#include<
stdio.h>
math.h>
#definem2
#definen5
#defineM1000000.0;
floata[m][n],c[n],b[m],seta[n],d[n];
intu[n];
inti,j,k,f,g,h;
intp,q;
floatz=0,min=0,p1,p2,p3;
intchujibianliang();
intrujibianliang(intp);
voiddanchunxingbiaodezhuanhuan(intp,intq);
voidprint1();
voidprint2();
voidinput();
input();
for(j=0,h=0;
u[h]=j+1;
基变量的列标\n"
u[i]);
if(a[i][u[i]-1]<
=0)
b[i]=-b[i];
for(j=0;
a[i][j]=-a[i][j];
i++)d[i]=-c[i];
print1();
print2();
while
(1)
p=chujibianliang();
if(p==-1)
printf("
\n所得解已经是最优解!
for(i=0;
z+=b[i]*c[u[i]-1];
printf("
X(%d)=%6.3f\t"
u[i],b[i]);
z=%6.3f\n"
break;
q=rujibianliang(p);
if(q==-1)break;
danchunxingbiaodezhuanhuan(p,q);
print2();
voidinput()
请输入系数矩阵a(%d行%d列):
m,n);
scanf("
\n请输入资源向量b:
for(i=0;
b[i]);
\n请输入目标函数系数矩阵c:
c[i]);
intchujibianliang()
if(b[i]>
f=1;
else
f=0;
if(f==1)
return-1;
if(b[i]<
0&
&
min>
b[i])
min=b[i];
k=i;
returnk;
intrujibianliang(intp)
for(j=0;
if(a[p][j]>
\n原线性规划问题无可行解!
if(a[p][j]<
seta[j]=d[j]/a[p][j];
seta[j]=M;
min=M;
if(min>
=seta[j])
min=seta[j];
i=j;
u[p]=i+1;
returni;
voiddanchunxingbiaodezhuanhuan(intp,intq)
p1=a[p][q];
if(i!
=p)
if(a[i][q]!
p2=a[i][q]/p1;
for(j=0;
a[i][j]-=a[p][j]*p2;
b[i]=b[i]-b[p]*p2;
p3=d[q]/p1;
d[i]-=a[p][i]*p3;
a[p][j]/=p1;
b[p]=b[p]/p1;
voidprint1()
\t"
=n;
X(%d)\t"
i);
最优解取值\n"
%6.3f\t"
-c[i]);
voidprint2()
%6.3f\n"
b[i]);
检验数"
%8.3f"
d[i]);
同第一个程序一样,由于C语言中不允许定义动态数组,因此该程序的通用性有一定的局限性:
完成对各个量的初始化,即变量的系数、资源向量、价值系数。
给出出基变量。
给出入基变量。
对系数行列式进行变换。
输出变量及对应的价值系数。
输出变量的系数、资源向量及检验数。
例1求解线性规划问题
min
;
添加松弛变量以后的标准型
将每个等式两边乘以-1,则上述问题转化为
可以输入:
-3-2-210
-5-1-201
-5-4
1551100
运行结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单纯 对偶 程序