一、问题提出 某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系(a,b)表示,距离单位:km)及水泥日用量d(吨)由下表给出。目前有两个料场位于A(5,1),B(2,7),日储量各有20吨。 (1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少水泥,可使运输费用(总的吨千米数)最小,并求出吨千米数。 ( 注:先画图,在坐标上标出各工地位置(用蓝色*标示)和料场位置(用红色o标示)) (2)目前公司准备建立两个新的料场,日储量各为20吨,为使运输费用最省,问新的料场应建在何处,并算出两料场分别向工地运输多少吨水泥和费用。 (注:初始值取x0=[3 5 4 7 1 0 0 0 0 0 5 11 5 4 7 7]’) 二、问题分析 对于问题(1),确定用A,B两料场分别向各工地运送水泥,使运输费用(总的吨千米数)最小,即要知道两点间线段最小,料场到工地的路线是直的,而要满足六个工地的需求,又要考虑到A、B两个料场的供应量,即在各工地用量必须满足和各料场运送量不超过日储量的条件下,使总的吨千米数最小,这是线性问题。。 对于问题(2),需要重新改建六个新的料场,使得在在各工地用量必须满足和各料场运送量不超过日储量的条件下,使总的吨千米数最小,则需要确定新的料场的具体位置,这是非线性问题。 三、模型假设 1、假设料场和建筑工地之间都可以由直线到达; 2、运输费用由“吨千米数”来衡量; 3、两料场的日存储量够向各建筑工地供应; 4、运输途中不发生意外,从料场运出的水泥总量不会超过各个料场的日存储量。 四、模型建立 (显示模型函数的构造过程) 记工地的位置为(ai,bi),水泥日用量为di,i=1,…,6;料场位置为(xj,yj), 日储量为ej,j=1,2;料场j向工地i的运送量为Xij。 目标函数为: 约束条件为: 当用临时料场时决策变量为:Xij 当不用临时料场时决策变量为:Xij,xj,yj 使用临时料场的情形: 使用两个临时料场A(5,1),B(2,7).求从料场j向工地i的运送量Xij. 在各工地用量必须满足和各料场运送量不超过日储量的条件下,使总的吨千米数最小,这是线性规划问题。线性规划模型为: 其中 aa(i,j)(xjai)2(yjbi)2,i=1,2,…,6,j=1,2,为常数 设 X11=X1, X21= X 2,, X31= X 3, X41= X 4, X51= X 5,, X61= X 6 X12= X 7, X22= X 8,, X32= X 9, X42= X 10, X52= X 11,, X62= X 12 改建两个新料场的情形: 改建两个新料场,要同时确定料场的位置(xj,yj)和运送量Xij,在同样条件下使总吨千米数最小.这是非线性规划问题.非线性规划模型为: 设 X11=X1, X21= X 2, X31= X 3, X41= X 4, X51= X 5,, X61= X 6 X12= X 7, X22= X 8, X32= X 9, X42= X 10, X52= X 11, X62= X 12 x1=X13, y1=X14, x2=X15, y2=X16 五、模型求解 (显示模型的求解方法、步骤及运算程序、结果) 建立chengxu.m程序: x=[1.25 8.75 0.5 5.75 3 7.25]; y=[1.25 0.75 4.75 5 6.5 7.75]; x0=[5,2]; y0=[1,7]; plot(x,y,'*b'); hold on; plot(x0,y0,'or'); text(1.25,1.25,'¹¤µØ1'); text(8.75,0.75,'¹¤µØ2'); text(0.5,4.75,'¹¤µØ3') text(5.75,5,'¹¤µØ4'); text(3,6.5,'¹¤µØ5'); text(7.25,7.25,'¹¤µØ6') text(5,1,'Áϳ¡A'); text(2,7,'Áϳ¡B'); 使用临时料场的情形: 编写程序liaochang1.m如下: clear a=[1.25 8.75 0.5 5.75 3 7.25]; b=[1.25 0.75 4.75 5 6.5 7.75]; d=[3 5 4 7 6 11]; x=[5 2]; y=[1 7]; e=[20 20]; for i=1:6 for j=1:2 aa(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2); end end CC=[aa(:,1); aa(:,2)]' A=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1]; B=[20;20]; Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 ]; beq=[d(1);d(2);d(3);d(4);d(5);d(6)]; vlb=[0 0 0 0 0 0 0 0 0 0 0 0];vub=[]; x0=[1 2 3 0 1 0 0 1 0 1 0 1]; [xx,fval]=linprog(CC,A,B,Aeq,beq,vlb,vub,x0) 程序截图如下: 程序的运行结果为: xx = 3.0000 5.0000 0.0000 7.0000 0.0000 1.0000 0.0000 0.0000 4.0000 0.0000 6.0000 10.0000 fval = 136.2275 运行结果截图如下: 即由料场A、B向6个工地运料方案为: 料场1 料场2 1 3 0 2 5 0 3 0 4 4 7 0 5 0 6 6 1 10 总的吨千米数为136.2275. 改建两个新料场的情形: 先编写M文件liaochang.m: function f=liaoch(x) a=[1.25 8.75 0.5 5.75 3 7.25]; b=[1.25 0.75 4.75 5 6.5 7.75]; d=[3 5 4 7 6 11]; e=[20 20]; f1=0; for i=1:6 s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2); f1=s(i)*x(i)+f1; end f2=0; for i=7:12 s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2); f2=s(i)*x(i)+f2; end f=f1+f2; 再编写主程序liaochang2.m为: clear x0=[3 5 4 7 1 0 0 0 0 0 5 11 5 4 7 7]; A=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0]; B=[20;20]; Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0]; beq=[3 5 4 7 6 11]'; vlb=[zeros(12,1);-inf;-inf;-inf;-inf]; vub=[]; [x,fval,exitflag]=fmincon('liaoch',x0,A,B,Aeq,beq,vlb,vub) 程序截图如下: 程序运行结果如下: x = Columns 1 through 8 3.0000 5.0000 4.0000 7.0000 1.0000 0 0 0 Columns 9 through 16 0 0 5.0000 11.0000 5.6962 4.9289 7.2500 7.7500 fval = 89.8835 exitflag = 5 程序结果截图如下: 即两个新料场的坐标分别为(5.6962,4.9289),(7.2500,7.7500),由料场A、B向6个工地运料方案为: 料场1 料场2 1 3 0 2 5 0 3 4 0 4 7 0 5 1 5 6 0 11 总的吨千米数为89.8835,比用临时料场节省约46吨千米。