两辆铁路平板车的装货问题
1988: The Railroad Flatcar Problem
有七种规格的包装箱要装到两辆平板车上去。包装箱的宽和高是一样的,但是厚度(ti,以厘米计)及其重量(wi以公斤计)是不同的。下表给出了每种包装箱的厚度、重量和数量。
| C1 | C2 | C3 | C4 | C5 | C6 | C7 | |
|---|---|---|---|---|---|---|---|
| ti 厘米 | 48.7 | 52.0 | 61.3 | 72.0 | 48.7 | 52.0 | 64.0 |
| wi 公斤 | 2000 | 3000 | 1000 | 500 | 4000 | 2000 | 1000 |
| ni 件数 | 8 | 7 | 9 | 6 | 6 | 4 | 8 |
每辆平板车有 10.2 米长的地方可用来装包装箱(像面包片一样),载重为 40 吨。
由于当地货运的限制,对 C5, C6, C7 类的包装箱的总数有一定的限制:这类箱子所占的空间(厚度)不能超过 302.7 厘米。试把包装箱装到平板车上去使得浪费的空间最小。
其解是\(x =[ 5,7,0,5,0,1,0,3,0,9,1,3,2,0]\),最优值是\(0.60000000000014\)。
local print = require('package.print').print
local mol = libminoptlab
local t = {48.7, 52.0, 61.3, 72.0, 48.7, 52.0, 64.0}
local w = {2000, 3000, 1000, 500, 4000, 2000, 1000}
local n = {8, 7, 9, 6, 6, 4, 8}
local len = #t
local f = {table.unpack(t)}
for i = 1, len do
table.insert(f, t[i])
end
local c = mol.matrix.new(f):prod(-1):tovector()
local Aeq = mol.matrix.new()
local beq = {}
local A = mol.matrix.new(len + 5, 2 * len)
for i = 1, len do
A:set(i, i, 1)
A:set(i, i + len, 1)
A:set(1 + len, i, w[i])
A:set(2 + len, i + len, w[i])
A:set(3 + len, i, t[i])
A:set(4 + len, i + len, t[i])
if i > 4 then
A:set(5 + len, i, t[i])
A:set(5 + len, i + len, t[i])
end
end
local bcon = {40000, 40000, 1020, 1020, 302.7}
local b = {table.unpack(n)}
for i = 1, #bcon do
table.insert(b, bcon[i])
end
local lb = {}
local ub = {}
local intindex = {}
for i = 1, 2 * len do
table.insert(lb, 0)
table.insert(ub, 9)
table.insert(intindex, i)
end
local best, fbest = mol.lpsolve(c, Aeq, beq, A, b, lb, ub, intindex)
fbest = 2040 + fbest
print({
best = best,
fbest = fbest,
ineqcon = A:mul(best):sub(b):tovector()
})