python - 使用纸浆 cbc 求解器时,我可以设置约束的优先级吗?
问题描述
我正在尝试计算一组具有很多约束的二进制变量的最佳答案。我想为约束设置优先级。例如)约束 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(未求解)的模型时,完全满足具有最高优先级的约束,但仅部分满足其他约束。
例如)约束 1 2 3 4 得到满足,但 5 6 是部分的。
解决方案
对约束设置优先级的一种方法是允许它们被违反一定量,然后在目标函数中惩罚违反约束的程度。
例如,在约束 1 中,您可能有m += vxx <= t + slack_1
. 其中slack_1
是一个线性变量,然后乘以目标函数中的适当权重。通过设置每个约束违规的权重,您可以定义这些约束的重要性 - 但是,这并不能保证在求解器运行期间满足约束的顺序。
推荐阅读
- nginx - CORS 已配置但无响应
- android - 无法在我的手机中运行颤振的移动应用程序
- git - 如何在保留合并的同时使用 on 命令对分支进行 git rebase?
- python - 将几列中的列表组合成一个嵌套列表 pandas
- email - 为自由职业者成功发送真正寻求的个人电子邮件(不是垃圾邮件)
- r - 更改一组堆叠条形图中的轴标签
- c# - EF Core Database.EnsureCreated 获取创建表 SQL 并且不向数据库发送请求
- docker - Docker 绑定代理与 /etc/system/docker.service.d/proxy.conf 不起作用
- python - 循环遍历数据范围以从 API 下载数据
- unity3d - 如何摆脱统一绘制纹理或绘制细节的“刷子是只读的”?