如果得到最优解-运输分箱问题。

ACMAIN_CHM 2009-02-13 08:46:38
近来全球经济下滑,老板不断要求降低成本;在安排运输,不知有何办法解决如下货运安排,节省开支。

发货需求

A产品100板,每板700公斤
B产品 80板,每板600公斤
C产品 20板,每板650公斤

运输要求 : 可用20'或40'货柜, 重量及板数不能超过如下规定,运输成本最低
运费:
20',最多装20板,重量不能超过 18000公斤,运费 USD 2000
40',最多装40板,重量不能超过 20000公斤,运费 USD 3500
...全文
314 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwantnon 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 PROLOVE_2 的回复:]
看到楼上的,我倒下了~
[/Quote]
一贴代码就显得长了,其实内容很少,思路很简单呀,要不怎么说lingo是十足的傻瓜型软件呢。就是因为太傻瓜了,所以学计算机或数学的人都无法接受,这题倒底是lingo解的还是你自己解的?:)
13楼只不过是想提前看一下结果而已,下面就是需要考虑怎么用C++来写算法了。
PROLOVE_2 2009-03-10
  • 打赏
  • 举报
回复
看到楼上的,我倒下了~
iwantnon 2009-03-10
  • 打赏
  • 举报
回复
楼上方法不行,刚才看了一下lingo教程,应该这么做:
问题:
小箱可装20件,重量不超过18000斤,运费2000元。
大箱可装40件,重量不超过20000斤,运费3500元。
现需运输:
A产品100件,每件700斤,
B产品 80件,每件600斤,
C产品 20件,每件650斤。
要求运费最低。
解:
首先估算大小箱个数:
如果全用小箱装,10个小箱足够。如果全用大箱装,8个大箱足够。
设10个小箱为sBox(1)~sBox(10),8个大箱为bBox(1)~bBox(8)。
用sSel(i)表示sBox(i)是否被采用,用bSel(j)表示bBox(j)是否被采用。sSel(i),bSel(j)均为0\1变量。
sBox(i) 装A产品sA(i)件,B产品sB(i)件,C产品sC(i)件,则有
sA(i)+sB(i)+sC(i) <=20,i=1~10 (容积限制)
700*sA(i)+600*sB(i)+650*sC(i) <=18000,i=1~10 (重量限制)
bBox(j)装A产品bA(j)件,B产品bB(j)件,C产品bC(j)件,则有
bA(j)+bB(j)+bC(j) <=40,j=1~8 (容积限制)
700*bA(j)+600*bB(j)+650*bC(j) <=20000,j=1~8 (重量限制)
另外据发货需求有:
A产品数量:∑sSel(i)*sA(i)+∑bSel(j)*bA(j)=100
B产品数量:∑sSel(i)*sB(i)+∑bSel(j)*bB(j)=80
C产品数量:∑sSel(i)*sC(i)+∑bSel(j)*bC(j)=20
目标函数:
min=2000*∑sSel(i)+3500*∑bSel(j)
lingo程序:
model:
sets:
sBoxes/sBox1..sBox10/:sA,sB,sC,sSel;
bBoxes/bBox1..bBox8/:bA,bB,bC,bSel;
endsets
min=2000*@sum(sBoxes:sSel)+3500*@sum(bBoxes:bSel);
!变量界定;
@for(sBoxes:
@bin(sSel);
@gin(sA);
@gin(sB);
@gin(sC);
);
@for(bBoxes:
@bin(bSel);
@gin(bA);
@gin(bB);
@gin(bC);
);
!每个小箱子的容积和重量限制;
@for(sBoxes:
sA+sB+sC<=20;
700*sA+600*sB+650*sC<=18000;
);
!每个大箱子的容积和重量限制;
@for(bBoxes:
bA+bB+bC<=40;
700*bA+600*bB+650*bC<=20000;
);
!A,B,C的数量限制;
@sum(sBoxes:sSel*sA)+@sum(bBoxes:bSel*bA)=100;
@sum(sBoxes:sSel*sB)+@sum(bBoxes:bSel*bB)=80;
@sum(sBoxes:sSel*sC)+@sum(bBoxes:bSel*bC)=20;
最终结果为:
用6个小箱,其装有A,B,C的数量分别为:
(1,18,1),(0,20,0),(14,4,0),(16,2,0),(17,3,0),(13,0,0)。
用3个大箱,其装有A,B,C的数量分别为:
(9,21,1),(10,2,8),(20,10,0)。
上述装箱方案下运费取最小值2000*6+3500*3=22500
iwantnon 2009-02-19
  • 打赏
  • 举报
回复
用n个小箱,第i个小箱装A产品ai板,B产品bi板,C产品ci板,则
ai+bi+ci<=20,i=1~n (板数限制)
700ai+600bi+650ci<=18000,i=1~n (重量限制)
用m个大箱,第j个大箱装A产品Aj板,B产品Bj板,C产品Cj板,则
Aj+Bj+Cj<=40,j=1~m (板数限制)
700Aj+600Bj+650Cj<=20000,j=1~m (重量限制)
另外发货需求:
∑ai+∑Aj=100
∑bi+∑Bj=80
∑ci+∑Cj=20
目标是:
min=2000n+3500m

jlj84237485 2009-02-16
  • 打赏
  • 举报
回复
帮顶一下
sageking2 2009-02-14
  • 打赏
  • 举报
回复
700*X+600*Y+650*Z<18000
X+Y+Z <=20
..............用一些数学方程动态规划就行了.
绿色夹克衫 2009-02-14
  • 打赏
  • 举报
回复
就这道题来说,10个小箱子应当是最便宜的了!

若要降低成本,每添加1个大箱子,必须要去掉2个小箱子,才能达到降低成本的目的(便宜500元),

由于10小箱子都已经装满了,因此不管2个小箱子里装的是哪种板,去掉之后1个大箱子都不可能装下的。

就本题给出的数据来算,可以用贪心来解,所有板在小箱子中的运输成本都要比在大箱子中低,因此用小箱子运就可以。

小箱子,重量成本为 2000 / 18000 = 0.1111,空间成本为2000 / 20 = 100

=>

A产品的成本 = Max(0.1111 * 700,100) = 100
B产品的成本 = Max(0.1111 * 600,100) = 100
C产品的成本 = Max(0.1111 * 650,100) = 100

大箱子,重量成本 3500 / 20000 = 0.175,空间成本为3500 / 40 = 87.5

=>

A产品的成本 = Max(0.175 * 700,87.5) = 131.25
B产品的成本 = Max(0.175 * 600,87.5) = 105
C产品的成本 = Max(0.175 * 650,87.5) = 113.75

本题用贪心可以得到最优解,如果数换一下就不一定了,也许只能得到近似解,不过这道题换作其他方法,
求最优解恐怕也不容易,除非存在完美装箱,即空间和重量同时达到上限。
yagebu1983 2009-02-14
  • 打赏
  • 举报
回复
算法啊。。。
橙子撸代码 2009-02-14
  • 打赏
  • 举报
回复
数据结构里好像有类似的东西,可以去看看
MOTA 2009-02-13
  • 打赏
  • 举报
回复
穷举- -~无聊 看看
止戈而立 2009-02-13
  • 打赏
  • 举报
回复
想了一下,没什么头绪。。坐在5楼等高手。
xhueducls 2009-02-13
  • 打赏
  • 举报
回复
有点难
blue_apple2006 2009-02-13
  • 打赏
  • 举报
回复
数学问题啦,不是程序问题 。
用函数图像就能解决啊 。
hangang7403 2009-02-13
  • 打赏
  • 举报
回复
UP
wuyi8808 2009-02-13
  • 打赏
  • 举报
回复
建议到 数据结构与算法 去问问看,那里有不少高手。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧