【问题标题】:When using pulp cbc solver, can I set priorities for constraints?使用纸浆 cbc 求解器时,我可以设置约束的优先级吗?
【发布时间】:2019-01-19 04:00:00
【问题描述】:

我正在尝试计算一组具有很多约束的二元变量的最佳答案。 我想为约束设置优先级。 例如)约束 1、2、3 的优先级为 100(最高),约束 4、5、6 的优先级为 1(最低)

我目前正在使用纸浆线性规划和 cbc 求解器来解决生产调度问题。

我的一小部分数据看起来像这样。

   t0  t1  t2  t3  t4  t5  t6  t7  t8  t9
a  v1  v2  v3  v4  v5  v6  v7  v8  v9  v10
b  v11 v12 v13 v14 v15 v16 v17 v18 v19 v20
c  v21 v22 v23 v24 v25 v26 v27 v28 v29 v30

v_list = 
[[v1, v2, v3, v4, v5, v6, v7, v8, v9, v10], 
[v11, v12, v13, v14, v15, v16, v17, v18, v19, v20], 
[v21, v22, v23, v24, v25, v26, v27, v28, v29, v30]]

n_rows = v_list.shape[0]
n_columns = v_list.shape[1]

每个变量可能是 -1, 0, 1

我设置的约束如下所示。

m = LpProblem()

# constraint 1, 2 = find absolute value of each variables
m += vxx  <= t
m += -vxx <= t

# constraint 3 = sum of each row must be equal to or below 2
for r_index in range(n_rows):
    m += lpSum(v_list[r_index, :]) <= 2

# constraint 4 = sum of rows a and b must be equal to or below 2
m += lpSum(v_list[[0, 1], :]) <= 2

# constraint 5 = sum of all rows must be equal to or below 2
for c_index in n_columns:
    m += lpSum(v_list[:, c_index]) <= 2

# constraint 6 = sum of each consecutive value must be equal to or below 1
m += lpSum(v(t) + v(t+1)) <= 1

目标是最小化 2 * row(a) + 2 * row(b) + 4 * row(c)

m += lpSum(v_list)

求解时限较短且LpStatus为0(未求解)的模型时, 具有最高优先级的约束被完全满足,但其他的只是部分满足。

ex) 满足约束 1 2 3 4 但 5 6 是部分的。

【问题讨论】:

  • 一种设置约束优先级的方法是允许它们被违反,然后在目标函数中惩罚违反约束的程度。例如,在约束 1 中,您可能有 m += vxx &lt;= t + slack_1。其中slack_1 是一个线性变量,然后乘以目标函数中的适当权重。通过设置每个约束的权重,您可以定义它们的重要性 - 但是,这并不能保证在求解器运行期间满足约束的顺序。
  • @kabdulla 我认为您的评论应该是答案而不是评论

标签: python linear-programming pulp


【解决方案1】:

对约束设置优先级的一种方法是允许它们被违反一定程度,然后在目标函数中惩罚违反约束的程度。

例如,在约束 1 中,您可能有 m += vxx &lt;= t + slack_1。其中slack_1 是一个线性变量,然后乘以目标函数中的适当权重。通过设置每个约束违规的权重,您可以定义这些约束的重要性 - 但是,这并不能保证在求解器运行期间满足约束的顺序。

【讨论】:

  • 感谢您的回答!没想到允许违规。会试一试。再次感谢。
  • 一旦确认它符合您的要求,通常会投票(小箭头)或标记为已回答(打勾)。谢谢。
  • 我做到了,但以我的声誉,它似乎没有显示......不确定是否有任何其他方式......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多