运筹学综合性上机实验报告
管理学院
PB12001035 孙璐
一、实验题目:某企业最优生产方案选择
二、实验目的:
1.学会建立数学模型,理解并区分运筹学中不同问题的特点,握运筹学中解决问题的基本方法。运筹学主要是研究如何将生产、管理等事件中出现的运筹问题加以提炼,然后利用数学方法进行解决的学科。利用像是统计学、数学模型和算法等方法,去寻找复杂问题中的最佳或近似最佳的解答。运筹学经常用于解决现实生活中的复杂问题,特别是改善或优化现有系统的效率。
2.掌握运筹学综合实践应用。相关问题的原理、方法和求解过程,加深对运筹学的有关理论、方法的理解,培养分析能力、动手能力和创新意识以及解决问题的能力。为管理科学工程类和金融学专业的学生学习相关专业课程提供有关系决策和最优化的基础知识。
三、实验方法分析:
应用运筹学处理问题时分为5个阶段。
①规定目标和明确问题:包括把整个问题分解成若干子问题,确定问题的尺度、有效性度量、可控变量和不可控变量,以及用来表示变量界限和变量间关系的常数和参数。 ②收集数据和建立模型:包括定义关系、经验关系和规范关系。
③求解模型和优化方案:包括确定求解模型的数学方法,程序设计和调试,仿真运行和方案选优。
④检验模型和评价解答:包括检验模型的一致性、灵敏度、似然性和工作能力,并用试验数据来评价模型的解。一致性是指主要参数变动时(尤其是变到极值时)模型得出的结果是否合理;灵敏度是指输入发生微小变化时输出变化的相对大小是否合适;似然性是指对于真实数据的案例,模型是否适应;工作能力则是指模型是否容易解出,即在规定时间内算出所需的结果。
⑤方案实施和不断优化:包括应用所得的解解决实际问题,并在方案实施过程中发现新的问题和不断进行优化。上述5个阶段往往需要交叉进行,不断反复。
四、实验题目分析: 实验的数学模型:
设:计划生产3051木箱,B513木笼,3151木箱,122木箱,762步枪箱,B122卡板,B713卡板,102烟箱,活动房子,讲台,双人学生桌椅,地板块,M90K,设备资料柜,期刊架,阅览桌,板架,资料柜,写字台,偏几桌,文件柜,单人床板,诊断床,地板木料,耳窗门套,耳窗门扇分别为x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26个。 依题意可得:
Maxz=x1*42.62+x2*300.07+x3*42.62+x4*30.25+x5*93.25+x6*6.72+x7*19.01+x8*16.17+x9*3200+x10*92.74+x11*100.66+x12*1008.60+x13*117.72+x14*782.35+x15*302.89+x16*48.11+x17*269.28+x18*262.41+x19*88.0+x20*60.0+x21*88.0+x22*55.0+x23*100+x24*1008.6+x25*72.04+x26*76.84
约束条件依次为:
x1*0.12+x2*1+x3*0.12+x4*0.13+x5*0.02+x6*0.02+x7*0.05+x8*0.11+x9*12+x10*0.2+x11*0.4+x12*15+x13*0.8+x14*1+x15*0.5+x16*0.2+x17*0.36+x18*0.5+x19*0.5+x20*0.4+x21*0.3+x22*0.5+x23*1+x24*15+x25*0.3+x26*0.6
x1*0.095+x2*0.5+x3*0.095+x4*0.1+x5*0.12+x6*0+x7*0+x8*0.1+x9*3+x10*0.7+x11*1.2+x12*0+x13*0.53+x14*10+x15*4+x16*0.6+x17*3.5+x18*4+x19*4+x20*1.5+x21*1.5+x22*2.5+x23*2.6+ x24*0+x25*0.3+x26*0.42
x1*0.02+x2*0.2+x3*0.02+x4*0.25+x5*0.05+x6*0+x7*0+x8*0.22+x9*6+x10*0.3+x11*0.6+x12*0.3+x13*0+x14*4.2+x15*3.5+x16*0.6+x17*2.3+x18*2.1+x19*2+x20*1+x21*0.5+x22*1.5+x23*1.3+x24*0+x25*0+x26*0
x8*0.04542+x9*2.21332+x14*0.2802+x19*0.074+x20*0.005+x21*0.004
x1*0.03826+x3*0.04099+ x4*0.05542+x6*0.00102+x7*0.00373
x2*1.364+x5*0.13471+x25*0.14370+x26*0.0928
x10*0.04381+x11*0.0714+x13*0.01085+x14*0.0231+x15*0.0495+x17*0.0412+x18*0.05525+x22*0.07624+x23*0.0436
x17*0.00268+x19*0.0439+x20*0.025+x21*0.01696
x10*0.02589+x12*2+x13*0.05285+x14*0.00173+15*0.00617+x21*0.10663
x5*0.1760+x9*284.3375+x10*0.14196+x14*0.0086+x17*0.03888+x18*0.1321+x19*0.10475+x20*0.085+x21*0.05974=0 x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26均为整数
将实验的数学模型化为标准型:加入松
弛变量x27,x28,x29,x30,x31,x32,x33,x34,x35,x36, x37,x38,x39, x40,x41,x42,x43,使不等式变为等式。 有标准型:
Max=x1*42.62+x2*300.07+x3*42.62+x4*30.25+x5*93.25+x6*6.72+x7*19.01+x8*16.17+x9*3200+x10*92.74+x11*100.66+x12*1008.60+x13*117.72+x14*782.35+x15*302.89+x16*48.11+x17*269.28+x18*262.41+x19*88.0+x20*60.0+x21*88.0+x22*55.0+x23*100+x24*1008.6+x25*72.04+x26*76.84+x27*0+x28*0+x29*0+x30*0+x31*0+x32*0+x33*0+x34*0+x35*0+x36*0+x37*0+x38*0+x39*0+x40*0+x41*0+x42*0+x43*0
约束条件分别如下:
x1*0.12+x2*1+x3*0.12+x4*0.13+x5*0.02+x6*0.02+x7*0.05+x8*0.11+x9*12+x10*0.2+x11*0.4+x12*15+x13*0.8+x14*1+x15*0.5+x16*0.2+x17*0.36+x18*0.5+x19*0.5+x20*0.4+x21*0.3+x22*0.5+x23*1+x24*15+x25*0.3+x26*0.6+x27=69000
x1*0.095+x2*0.5+x3*0.095+x4*0.1+x5*0.12+x6*0+x7*0+x8*0.1+x9*3+x10*0.7+x11*1.2+x12*0+x13*0.53+x14*10+x15*4+x16*0.6+x17*3.5+x18*4+x19*4+x20*1.5+x21*1.5+x22*2.5+x23*2.6+ x24*0+x25*0.3+x26*0.42+x28=54000
x1*0.02+x2*0.2+x3*0.02+x4*0.25+x5*0.05+x6*0+x7*0+x8*0.22+x9*6+x10*0.3+x11*0.6+x12*0.3+x13*0+x14*4.2+x15*3.5+x16*0.6+x17*2.3+x18*2.1+x19*2+x20*1+x21*0.5+x22*1.5+x23*1.3+x24*0+x25*0+x26*0+x29=24000
x8*0.04542+x9*2.21332+x14*0.2802+x19*0.074+x20*0.005+x21*0.004+x30=38000 x1*0.03826+x3*0.04099+ x4*0.05542+x6*0.00102+x7*0.00373+x31=15000
x2*1.364+x5*0.13471+x25*0.14370+x26*0.0928+x32=9850
x10*0.04381+x11*0.0714+x13*0.01085+x14*0.0231+x15*0.0495+x17*0.0412+x18*0.05525+x22*0.07624+x23*0.0436+x33=800
x17*0.00268+x19*0.0439+x20*0.025+x21*0.01696+x34=4000
x10*0.02589+x12*2+x13*0.05285+x14*0.00173+15*0.00617+x21*0.10663+x35=4500 x19*0.01933+x20*0.1+x21*0.10663+x36=15000
x5*0.1760+x9*284.3375+x10*0.14196+x14*0.0086+x17*0.03888+x18*0.1321+x19*0.10475+x20*0.085+x21*0.05974+x37=18000 x5+x38=500 x10+x39=150 x16+x40=15 x17+x41=10 x25+x42=1000 x26+x43=1000 x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32,x33,x34,x35,x36, x37,x38,x39, x40,x41,x42,x43>=0且均为整数
五、在计算机上实现该问题: 实验的源程序如下: #include #include #include #include #define N 100 #define M 5000000000 static float A[N-1][N],b[N],c[N]; static float C[N],σmax; static float θ[N-1],X[N],x[N],y[N],X0[N],xm; static float s,t, θ’; static int i,j,k,I,p,d[N],num[N-1]; static int P,times=0; static int n,m; void error1() { system(\"cls\"); system(\"COLOR fc\"); printf(\"\\n错误! n应该大于m !!\\n\\n\"); } /出现第一类错误,即n(n-m);i--)
P*=i; for(i=m;i>0;i--)
P/=i; return P; } /P表示n,m的组合数,即基的最大数/ void output() { system(\"cls\");
if(θ’>=M||xm
{ if(θ’>=M)
{ printf(\"\\n\\n 没有最优解!\\n\\n\\n\");
printf(\"\\n 以下情况发生:\\n\");
printf(\"\\n 最大检验数为%5.2f\\n\\n\",σmax);
printf(\" 当基变量系数为:\\n\\n\");
for(i=0;i
printf(\" %5.2f\\n\",A[i][k]);
printf(\"\\n 此时\"); printf(\" 目标函数值无解! \\n\\n\");
}/出现检验系数大于零而该列系数小于零的情况/
else if(xm
{printf(\"\\n\\n没有最优解!\\n\\n\\n\");
printf(\"\\n以下情况发生:\\n\\n\");
printf(\"
X=(\");
for(j=0;j
printf(\" %5.2f \",x[j]);
printf(\")\\n\\n\");
printf(\"\\nX%d= %5.2f
printf(\"\\n此时\");
printf(\" 目标函数值无最解! \\n\\n\");
}
/出现结果中有至少一个变量小于零的情况/ return;
/出现这两种情况目标函数均没有最优解/
}
printf(\"\\n\\n最优化终止! \\n\\n\\n\");
printf(\"C=(\");
for(j=0;j
printf(\" %5.2f \",X0[j]);
printf(\")\\n\\n\");
printf(\"
X=(\");
for(j=0;j
printf(\" %5.2f \",x[j]);
printf(\")\\n\\n\");
printf(\"
Z=C*X\' \");
printf(\"\\n\\n\");
printf(\"
Max Z=%.2fx%.2f \",X0[0],x[0]);
for(j=1;j
printf(\"+ %.2fx%.2f \",X0[j],x[j]);
for(i=1;i
{ printf(\"\\n\");
printf(\"
\");
if(i
{for(j=0;j
printf(\"+ %.2fx%.2f \",X0[j+i+4],x[j+i+4]);
printf(\"\\n\");
}
if(i==(n/5))
for(j=0;j
printf(\"+ %.2fx%.2f \",X0[j+i+4],x[j+i+4]);
printf(\"\\n\");
}
printf(\"\\n =%.3f\\n\\n\",s);
return; }
void input1() { system(\"cls\");
system(\"COLOR 07\");
printf(\"请输入行的数目: m=\");
scanf(\"%d\",&m); /输入行数/
printf(\"输入列数: n=\");
scanf(\"%d\",&n); /输入列数/} void input2() { P=Cn(n,m);
for(i=0;i
{printf(\"row %d:\\n\",i+1);
for(j=0;j
{scanf(\"%f\",&A[i][j]);
}
printf(\"b%d=\",i+1);
scanf(\"%f\",&b[i]);
printf(\"\\n\");
} /输入每一行的系数/
printf(\"\\n输入初始可行基的位置:\\n\");
for(i=0;i
scanf(\"%d\",&num[i]); /输入初始基可行解的位置/ printf(\"\\n输入目标函数的系数\\n\");
for(j=0;j
{scanf(\"%f\",&c[j]);
} } /输入目标函数的系数/
void danchunxing(float (*A)[N],float *b,float *c,int *num) /开始单纯形迭代/ {for(j=0;j
{X0[j]=c[j];
X[j]=c[j];
}for(j=0;j
d[j]=j;
for(j=0;j
{
for(i=0;i
{t=A[i][j];
}
p=d[j];
d[j]=d[num[j]-1];
d[num[j]-1]=p;
t=X[j];s=c[j];
X[j]=X[num[j]-1];c[j]=c[num[j]-1];
X[num[j]-1]=t;c[num[j]-1]=s;
}/把初始基解的位置调整到前m列,同时系数也变换位置/
for(j=m;j
{C[j]=0;
for(i=0;i
C[j]+=c[i]*A[i][j];
C[j]=c[j]-C[j];
}
σmax=C[m];k=m; A[i][j]=A[i][num[j]-1]; A[i][num[j]-1]=t;
for(j=m+1;j
{if(C[j]>σmax)
{σmax=C[j];k=j;}
} /计算检验系数找到最大值的位置在第k列/
while(σmax>0&×
/执行单纯形法/{
/计算θ值并寻找最小值确定对换位置/
for(i=0;i
{if(A[i][k]>0)
}
θ’=θ[0];I=0;
for(i=1;i
{if(θ[i]>0&&θ[i]
}
if(θ’>=M)
break;/利用线性变换将第k列变为基向量/
for(i=0;i
{θ’=θ[i];I=i;} θ[i]=b[i]/A[i][k];
else θ[i]=M;
{t=-A[i][k]/A[I][k];
}
for(i=I+1;i
{t=-A[i][k]/A[I][k];
}
s=A[I][k];
b[I]/=s;
for(j=0;j
A[I][j]/=s;
p=d[I]; for(j=0;j
A[i][j]+=t*A[I][j]; b[i]+=t*b[I]; for(j=0;j
A[i][j]+=t*A[I][j]; b[i]+=t*b[I];
d[I]=d[k];
d[k]=p;
/对换变量位置总使得前m列为基可行解/
s=X[I];
X[I]=X[k]; X[k]=s;
for(i=0;i
{s=A[i][k];
}
/计算新的检验系数,进入下一次循环/
for(j=m;j
{C[j]=0;
for(i=0;i
C[j]+=X[i]*A[i][j];
C[j]=X[j]-C[j];
}
σmax=C[m];k=m;
for(j=m+1;j
{if(C[j]>σmax)
{σmax=C[j];k=j;}
}
times++; /直至最大的检验系数小于零或迭代次数例遍所有的可行解,迭代停止/
}
for(i=0;i
y[i]=b[i];
for(i=m;i
y[i]=0;
for(j=0;j
{p=d[j];
x[p]=y[j];
}
xm=x[0];I=0;
for(i=1;i
if(xm>x[i])
{xm=x[i];I=i;}
s=0;
for(i=0;i
s+=X[i]*b[i]; }/单纯形法结束/
int main() {
loop: input1();
/列数总是大于行数的/
if(n
{error1();
printf(\"\\n
pre any key to be continued .\\n\\n \");
getch();
goto loop;
}
/N是变量数,输入变量数必须小于N/
else if(n>N)
{error2();
printf(\"\\n
pre any key to be continued .\\n\\n
\");
getch();
return;
}
input2();
danchunxing(A,b,c,num); /执行单纯形法/
output();
printf(\"\\n
pre any key to be end .\\n\\n
\");
getch();
return; }
六、实验结果:
x1=0
x2=0
x3=0
x4=0
x5=500
x6=0
x7=1271920 x8=0
x9=0
x10=0
x11=0
x12=0
x13=0
x14=5394 x15=0
x16=0
x17=0
x18=0
x19=0
x20=0
x21=0
x22=0
x23=0
x24=0
x25=0
x26=0
Max z = 28445820.1
七、实验结果分析:
由实验结果可知为获取最大利润,应生产500单位的762步枪箱,12719120单位的B713卡板,5394单位的设备资料柜,其他的产品均不宜生产。此时获得的最大利润为28445820.1元。这是综合各种资源之间的限制而得出的最佳方案。
八、实验心得:
通过此次运筹学实验,不仅对运筹学的有关知识有了进一步的掌握,而且学会了通过建立模型解决实际生活中的相关问题。对问题的分析、建模、求解锻炼了我们的思考能力,同时提高了分析、解决问题的能力,也提高了我们的计算机应用水平。
同时,在此次试验中也存在一些不可避免的问题和不足。例如,在分析问题时,设置变量没有清晰的思路等。
此次实验为以后的学习和工作打下了坚实的基础,在此感谢老师的细心指导和帮助。