运筹学实验单纯形法上机报告Word格式文档下载.docx
《运筹学实验单纯形法上机报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《运筹学实验单纯形法上机报告Word格式文档下载.docx(31页珍藏版)》请在冰豆网上搜索。
2.大M法
(1)方法:
在约束条件中,加入人工变量后,要求目标函数不受影响,目标函数中人工变量的系数取–M(M为系统所能表示范围内的一个非常大的值本程序取1000000),其运算过程同单纯形法。
(2)理由:
目标函数实现最大化,就必须将人工变量从基变量中换出,否则目标函数就不可能取得最大化。
三、数据结构及模块设计
1.程序中用到的数据结构:
#defineM20//最大20个变量
#defineN40//40个约束方程
#defineMax1000000//大M
doubleD[M][N];
//系数矩阵
doubleC[M];
//目标函数系数
doubleCb[M];
//基向量系数
doubleB[M];
//约束常数
doubleValue[N];
//检验数
intXb[M];
//基向量
doubleX0[M];
//可行解
intop[M];
//约束方程符号0---"
<
"
、1---"
="
、2---"
>
intm,n;
//矩阵行数、列数
intbegin_n;
//初始变量数
intIn_BaseX=-1;
//进基变量
intin_n=-1;
//进基列标示
intout_m=-1;
//出基行标示
intOut_BaseX=-1;
//出基变量
intbest;
//最优函数返回值
charname[30];
//文件名
intManX_num=0;
//人工变量数目
intManX_list[M];
//人工变量存放数组
2.模块设计:
voidread();
//读取方程子函数
voidprint();
//显示单纯表子函数
voidinit_change();
//初始变换子函数
voidcompute_value();
//计算检验数子函数
intbest_Result();
//判断是否得到最优解子函数
voidin_base();
//进基选子函数
voidout_base();
//出基选择子函数
voidrow_change();
//行变换子函数
四、详细设计
1.文件格式定义
格式:
(行数/约束方程数:
列数/变量数:
)
mn
(约束矩阵:
符号:
0小于,1等于,2大于B值)
D11D12D13…Dn1op1b1
D21D22D23…Dn2op2b2
….
Dm1D2mDm3…Dnmopmbm
(最大值/最小值:
1最大,2最小)
max/min
目标函数的变量系数:
C1C2C3….Cn
例:
32
0.60.5012000
0.40.104000
00.406000
1
2510
2.voidread()读取约束矩阵、目标函数
voidread(){
FILE*fp;
//文件
inti=0,j=0,k;
fp=fopen(name,"
r"
);
if(fp!
=NULL){//读变量数目和约束方程个数m,n
fscanf(fp,"
%d"
&
m);
n);
}
begin_n=n;
//初始(未经过标准化)变量数置为n,
for(i=0;
i<
m;
i++){//按行读取约束矩阵,约束方程符号,常数值
for(j=0;
j<
n;
j++)//读取约束矩阵
if(fp!
=NULL)
fscanf(fp,"
%lf"
D[i][j]);
else
printf("
error"
if(fp!
=NULL)//读约束方程符号
fscanf(fp,"
op[i]);
else
printf("
=NULL)//读取常数值
B[i]);
=NULL)//读取目标函数类型
Type);
for(k=0;
k<
k++)//读取目标函数变量系数
C[k]);
fclose(fp);
}//voidread()
3.voidprint()单纯形表显示函数
voidprint(){
inti=0,j=0;
voidline_V(int);
//竖线子函数
voidline_R(int);
//横线子函数
voidln();
//换行子函数
voidspace();
//空格子函数
ln();
//第1条直线
line_R(15+n*5);
//显示第1行“C|C1C2C3...”
space(6);
printf("
C"
space(7);
line_V
(1);
i++)
if(C[i]==-Max)
-M"
%5.1lf"
C[i]);
//第2条直线
//显示第2行“CbXbB|X1X2X3...”
CbXbB"
printf("
X%-2d"
i+1);
//第3条直线
//显示第3部分“Cb1Xb1B1|D11D12D13...”
//“Cb2Xb2B2|D21D22D23...”
//“Cb3Xb3B3|D31D32D33...”
//“...”
i++){
if(Cb[i]==-Max)
-M"
%-5.0lf"
Cb[i]);
X%-2d"
Xb[i]+1);
%5.0lf"
B[i]);
line_V
(1);
j++)
D[i][j]);
ln();
//第4条直线
//显示第4行“Value|Value1Value2Value3...”
space(5);
Value"
space(4);
if(Value[i]>
Max/2){//当Value值达到M数量级时,用aM+b表示
intk=(int)(Value[i]/Max);
doublel=Value[i]-k*Max;
if(l>
Max/2){
k++;
l-=Max;
}
if(k==0)
"
elseif(k==1)
M"
%dM"
k);
if(l==0)
elseif(l>
0)
+%-1.0lf"
l);
%-2.0lf"
}
elseif(Value[i]<
-Max/2){//当Value值达到M数量级时,用aM+b表示
if(l<
-Max/2){
k--;
l+=Max;
elseif(k==-1)
elseif(l<
else//正常显示
%4.1lf"
Value[i]);
//第5条直线
//显示第5行“X(0)=(X1,X2,X3...)”
space
(1);
X(0)=("
n-1;
%.2lf,"
X0[i]);
%.1lf"
)"
//第6条直线
}
//**************横线***************
voidline_R(intn){
inti;
-"
//**************竖线***************
voidline_V(intn){
|"
//**************空格***************
voidspace(intn){
//**************换行***************
vo