(1)问题分析:
运输费=运输单价*运输量。这里要求是总运输费最低,也就是说规划的目标函数是使得运输费最小。
约束条件有:
a.ABC三个工厂生产能力存在上限,当然也存在下限(产量为0)
b.至少应甲乙丙丁四个市场的需求量。
(2)符号说明:
xij代表i工厂给j市场的箱数,当然这里i=1,2,3分别代表ABC;j=1,2,3,4分别代表甲乙丙丁
costij代表i工厂运到j市场每箱的运输费。由题意得cost=[2,1,3,21,3,2,13,4,1,1]
proi代表i工厂生产的总箱数,很明显proi=sum(xij,j,1,4)-----注意这里引入的东西是说对j从1到4求和。即xi1+xi2+xi3+xi4
needj代表j市场的实际进货,很明显needj=sum(xij,i,1,3)----同上
根据"模弯竖问题分析"我们可以得到规划
目标:min f=sum(sum(costij.*xij,i,1,3),j,1,4)
约束条件:
xij>=0 其中i=1,2,3j=1,2,3,4
pro1=sum(x1j,j,1,4)<=60
pro2=sum(x2j,j,1,4)<=40
pro3=sum(x3j,j,1,4)<=50
need1=sum(xi1,i,1,3)>=20
need2=sum(x21,i,1,3)>=35
need3=sum(x31,i,1,3)>=33
need4=sum(x41,i,1,3)>=34
(3)程序编写(基于Matlab,注意这里要将Aij转成列向量)
clear
cost=[2,1,3,21,3,2,13,4,1,1]
f=cost(:)%目标
A=[
1,0,0,1,0,0,1,0,0,1,0,0
0,1,0,0,1,0,0,1,0,0,1,0
0,0,1,0,0,1,0,0,1,0,0,1
-1,-1,-1,0,0,0,0,0,0,0,0,0
0,0,0,-1,-1,-1,0,0,0,0,0,0
0,0,0,0,0,0,-1,-1,-1,0,0,0
0,0,0,0,0,0,0,0,0,-1,-1,-1
]%约束,注意大于号约束时,我们两边乘以-1,变成小于号约束
b=[604050-20-35-33-34]
Aeq=[]
beq=[]
xmin=zeros(12,1)
xmax=inf*ones(12,1)
x0=xmin
[x,fmin]=linprog(f,A,b,Aeq,beq,xmin,xmax,x0)
reshape(x,3,4),fmin
totalbox=sum(x)
(4)结果分析
上述程序的结果是:
ans =
0.0000 35.0000 0.0000 0.0000
20.0000 0.0000 0.0000 17.3777
0.0000 0.0000 33.0000 16.6223
fmin =
122.0000
totalbox =
122.0000
其中ans就是Aij,得到的总费用是122元,运输的总箱数也为122箱。也就是说平均每箱的费用也旦大是1元。
(5)启示
我们注意观察
cost与ans的关系
cost =
2 1 3 2
1 3 2 1
3 4 1 1
ans =
0.0000 35.0000 0.0000 0.0000
20.0000 0.0000 0.0000 17.3777
0.0000 0.0000 33.0000 16.6223
我们可以发现,ans中非元素与cost中的1元素是对应的。
也就是说对于j市场,它可以从ABC三个厂进货。但是要使得费用最近,当然是希望从运费最低的那个厂进闹圆货。
先观察甲乙丙和ABC,对于甲乙丙来说,他们分别从BAC三个厂进贷是最合算的,当然BAC的产量都大于甲乙丙三个市场的需求量。这三个市场都从BAC那里进货。
对于丁市场来说,它的最低运费的有BC两个工厂,而BC工厂分别给甲丁两个市场20,33个箱。它们离最大的产量还剩20,17。只要丁市场从这里取34箱就可以了。对于这两个就没有什么优先性,因为它的运输费是一致的。
所以本例存在多解情况,先让BAC三个工厂分别满足甲乙丙三个市场,丁市场从BC两个工厂进货34箱即可(而这34箱从B厂的20箱和C厂的17箱里面运出即可),考虑到箱数一般为整数。BC厂给丁市场的箱数可有以下几种组合
B厂 C厂
20 14
19 15
18 16
17 17
该运输模型,可用Matlab的linprog()函数来求解。求得x11=150.0000
x12=0.0000
x13=50.0000
x21=0.0000
x22=150.0000
x23=150.0000
总费用为
2.6500e+003
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交雹好贺互袜伍式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和源派仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)