Fox-Goat-Cabbage运输

时间:2011-11-15 15:29:13

标签: optimization mathematical-optimization discrete-mathematics linear-programming river-crossing-puzzle

我的问题是关于一个旧的交通问题 - 在河上携带三件物品,一艘船只能够一次转移一件物品。约束是某些物品不能放在一起,例如与山羊的白菜,与山羊的狼等。这个问题应该可以使用整数编程或其他优化方法来解决。成本函数是河流另一边的所有项目,到达那里所需的行程可能是Simplex(?)的输出,它会尝试不同的可行解决方案。我想知道是否有人有这个问题的整数规划(或线性规划)公式,和/或Matlab,Octave,基于Python的代码,可以编程提供解决方案,包括一系列Simplex尝试所有路径 - 我们乘船。

这里有一些有趣的东西

http://www.zib.de/Publications/Reports/SC-95-27.pdf

谢谢,

2 个答案:

答案 0 :(得分:3)

我建议使用二元变量x_i,t来模拟物品的位置,即如果物品在行程t之后位于左岸,则为零,否则为零。在旅行期间,这些变量中的至多一个可以改变。这可以通过

建模

x_wolf,1 + x_cabbage,1 + x_goat,1< = 1 + x_wolf,0 + x_cabbage,0 + x_goat,0和

x_wolf,1> = x_wolf,0

x_cabbage,1> = x_cabbage,0

x_goat,1> = x_goat,0

在另一个方向的旅行需要类似的限制。

此外,在奇数次旅行之后,您需要限制检查左岸的物品,并且类似地,您必须检查右岸。例如:

x_wolf,1 + x_goat,1> = 0和

x_wolf,2 + x_goat,2< = 1 ...

使用t的上限,这样就可以找到解决方案。

最后,介绍二进制变量z_t并让

z_t< = 1/3(x_wolf,t + x_cabbage,t + x_goat,t)

并最大化sum_t(z_t)。

(最有可能的是sum_t(x_wolf,t + x_cabbage,t + x_goat,t)也是如此。)

答案 1 :(得分:1)

你是对的,这个公式需要整数变量。解决这类问题的传统方法是制定二元变量模型并将公式传递给求解器。除非您可以访问优化工具箱,否则在这种情况下MATLAB将无法工作。

http://www.mathworks.com/products/optimization/index.html

在您的表述中,您需要解决以下问题:

决策变量

在你的情况下,这看起来像是:

x_it(选择[yes = 1 no = 0]在乘船旅行编号t期间运输项目i)

目标函数

我不太清楚你的描述是什么,但每次乘船旅行应该有一个成本,c_t。如果你想最大限度地缩短总时间,每次旅行的成本都是1,所以你的目标应该是:

最小化SUM((i,t),c_t * x_it)(因此您可以最大限度地减少所有行程的总成本)

约束

这是您的问题的棘手部分。复杂的约束是您确定的排他性。请记住,x_it是二进制。

对于彼此冲突的每对项目(i1,i2),您有一个看起来像这样的约束

x_(i1 t)+ x_(i2 t)< = 1

例如:

x _(“卷心菜”“1”)+ x _(“山羊”“1”)< = 1

x _(“狼”“1”)+ x _(“山羊”“1”)< = 1

x _(“卷心菜”“2”)+ x _(“山羊”“2”)< = 1

x _(“狼”“2”)+ x _(“山羊”“2”)< = 1

等。

你知道这是如何防止冲突的。将“白菜”和“山羊”分配到同一行程的船时间表将违反此二进制排他性约束,因为“1 + 1> 1”

像GAMS,AMPL和GLPK这样的工具将允许您非常简洁地表达这组约束。

希望有所帮助。