【问题标题】:Solving nonlinear bin packing optimization problem in python解决python中的非线性装箱优化问题
【发布时间】:2021-01-04 13:34:47
【问题描述】:

是否有直接的方法(例如带有常用求解器的某些模块)来解决 Python 中众所周知的装箱问题(例如参见 https://en.wikipedia.org/wiki/Bin_packing_problem)衍生的问题?

详细来说,装箱问题,其中 s(i) 是物品的重量

minimize K = sum_j y_j                    # use as less bins as possible
s.t. sum_i s(i)x_i,j <= B*y_j for all j   # bin capacity B must not be exceeded
     sum_j x_i,j = 1 for all i            # all items have been fit in exactly one bin
     x_i,j, y_j being integer variables in {0,1}

应扩展到以下目标函数 K_nonlinear

minimize K_nonlinear = sum_j (y_j + Std({s(i)}) for all x_i,j =1)
s.t. # the same constraints as the bin packing problem (above)

因此,不仅要尽量减少使用的 bin 数量,还要尽量减少共享 bin 的选定项目的标准偏差(这通常会导致一些必要的妥协)。因此,我认为这个问题是非线性的。

感谢任何关于如何使用 python 解决这个问题的建议(python api 就足够了,算法本身也可以用任何其他语言实现)。

到目前为止,我已经尝试扩展现有的装箱求解器(基于 Coin-or 分支和切割求解器)关于目标函数中的附加部分,但失败了。这可能是由于诱导的非线性。

在此先感谢

【问题讨论】:

    标签: optimization constraints bin-packing non-linear discrete


    【解决方案1】:

    与其使用标准差,不如将范围最小化可能更容易:max-min。这可以以线性方式表示:

      Minimize xmax-xmin
      xmax >= x[i]  for all i
      xmin <= x[i]  for all i
    

    【讨论】:

    • 感谢您的意见。我不确定是否期望纯线性目标函数的求解器能够处理这个问题,因为 max 和 min 可以用绝对值表示(例如 max(a,b) = 0.5*(a+b + ( ab)) ) ,因此不能被认为是线性的。有什么想法可以从那里继续吗?
    • minimize max(a,b)-min(a,b) 可以很容易地线性化为:minimize xmax-xmin subject to xmax≥a, xmax≥b, xmin≤a, xmin≤b
    • 现在说得通了。如答案中所述,您引入了两个附加变量(“辅助变量”)xmax 和 xmin 以及两组附加约束。完美,谢谢!
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多