【问题标题】:Pulp taking too much time to solve纸浆需要太多时间来解决
【发布时间】:2019-06-17 07:27:55
【问题描述】:

我正在尝试使用 Pulp Solver 将物品打包到卡车中,当物品数量很少(即

这是纸浆求解器的代码:

def allocator(item_mass, item_vol, truck_mass, truck_vol, truck_cost, id_series):
    n_items = len(item_vol)
    set_items = range(n_items)
    n_trucks = len(truck_cost)
    set_trucks = range(n_trucks)


    y = pulp.LpVariable.dicts('truckUsed', set_trucks,
        lowBound=0, upBound=1, cat=LpInteger)

    x = pulp.LpVariable.dicts('itemInTruck', (set_items, set_trucks), 
        lowBound=0, upBound=1, cat=LpInteger)

    # Model formulation
    prob = LpProblem("Truck allocation problem", LpMinimize)

    # Objective
    prob += lpSum([truck_cost[i] * y[i] for i in set_trucks])
    # Constraints
    for j in set_items:
        # Every item must be taken in one truck
        prob += lpSum([x[j][i] for i in set_trucks]) == 1

    for i in set_trucks:
        # Respect the mass constraint of trucks
        prob += lpSum([item_mass[j] * x[j][i] for j in set_items]) <= truck_mass[i]*y[i]

        # Respect the volume constraint of trucks
        prob += lpSum([item_vol[j] * x[j][i] for j in set_items]) <= truck_vol[i]*y[i]
    # Ensure y variables have to be set to make use of x variables:
    for j in set_items:
        for i in set_trucks:
            x[j][i] <= y[i]

    s = id_series  # id_series

    prob.solve()

是不是我做错了什么?

这是 jupyter 笔记本和测试文件的 link

【问题讨论】:

  • 你用的是什么求解器?我会尝试的第一件事是使用更好的求解器。
  • 我使用了 PulP 求解器
  • 你错了。 PuLP 不是求解器。它是一种可以使用不同求解器的建模工具。请参阅文档。
  • 请原谅我,但我对此很陌生。我已经附上了代码,你能看看并帮忙吗?
  • @ErwinKalvelagen 我检查了求解器,上面写着* Solver &lt;class 'pulp.solvers.PULP_CBC_CMD'&gt; passed. Solver &lt;class 'pulp.solvers.CPLEX_DLL'&gt; unavailable Solver &lt;class 'pulp.solvers.CPLEX_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.CPLEX_PY'&gt; unavailable Solver &lt;class 'pulp.solvers.COIN_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.COINMP_DLL'&gt; unavailable Solver &lt;class 'pulp.solvers.GLPK_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.XPRESS'&gt; unavailable Solver &lt;class 'pulp.solvers.GUROBI'&gt; unavailable Solver &lt;class 'pulp.solvers.GUROBI_CMD'&gt; unavailable

标签: python linear-algebra linear-programming pulp


【解决方案1】:

默认情况下,您使用的是开源 MIP 求解器 CBC。
2 种可能的方法:

  1. 使用更好的求解器,例如 CPLEX 或 GUROBI(商业用途,但对学生和学者免费)。 PuLP 为它们提供了一个 API。
  2. 您需要最佳解决方案吗?如果不是这种情况,请设置时间限制。

例子:

prob.solve(pulp.COIN(maxSeconds=your_time_limit))

【讨论】:

  • 我检查了pulp.pulpTestAll() 拥有的所有求解器,它返回* Solver &lt;class 'pulp.solvers.PULP_CBC_CMD'&gt; passed. Solver &lt;class 'pulp.solvers.CPLEX_DLL'&gt; unavailable Solver &lt;class 'pulp.solvers.CPLEX_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.CPLEX_PY'&gt; unavailable Solver &lt;class 'pulp.solvers.COIN_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.COINMP_DLL'&gt; unavailable Solver &lt;class 'pulp.solvers.GLPK_CMD'&gt; unavailable Solver &lt;class 'pulp.solvers.XPRESS'&gt; unavailable Solver &lt;class 'pulp.solvers.GUROBI'&gt; unavailable Solver &lt;class 'pulp.solvers.GUROBI_CMD'&gt; unavailable
  • 您需要下载您要安装的求解器并安装它。对于 GLPK,您可以使用apt-get install glpk-utils。对于 Cplex 和 Gurobi,您需要浏览他们的网站。
【解决方案2】:

我怀疑您的问题过于对称。即有多辆完全相同的卡车。

当这种情况发生时,CBC 会花时间寻找“最佳”解决方案。

你有两个选择:

  • 设置时间限制或绑定间隙,这将提前退出求解过程,但仍返回“好”解。

  • 设置次要成本函数以使事物不那么对称,即希望将编号最小的物品分配给编号最小的卡车。这种对称性在 gurobi 等商业求解器中自动发生。

【讨论】:

  • 我没有给出卡车的数量,而是将它们复制到 CSV 本身中,这样它就永远不会发现卡车短缺。
猜你喜欢
  • 1970-01-01
  • 2019-07-28
  • 2019-12-08
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多