python - 如何根据纸浆python中先前变量的值分配后续变量?
问题描述
我正在使用纸浆库解决 python 中的优化问题。我有一个 5X5 矩阵作为优化问题的决策变量 (x(i,j))。这些决策变量可以取 1 到 10 之间的整数值。我需要帮助来编写我无法在纸浆中定义的 2 个约束的代码:
如果 x(i,j) 的值为 1,则 k >j 的 x(i,k)=1(此约束意味着在任何行中,如果决策变量的值为 1,则所有后续元素的值在那一行也是1)
如果 x(i,j) 的值不是 1,并且 x(i,k) 的值不是 1,那么 x(i,j) 不应该等于 x(i,k)(这个约束意味着在任何没有 2 个元素的行(值不等于 1)可以相等
我还附上了满足这两个约束的示例 x 矩阵的屏幕截图。任何帮助表示赞赏。提前致谢。 在此处输入图像描述
解决方案
基于@Erwin Kalvelagen 的评论,如果选择决策变量作为二元变量:
y(i,j,k) == 1
,当且仅当元素(i, j)
具有值k
然后您的第二个约束非常简单(假设set_I
并且已被声明为适当的列表):set_J
set_K
for i in set_I:
for k in set_K:
if k==1:
continue
model += lpSum([y[i, j, k] for j in set_J]) <= 1
换句话说,对于每一行i
,所有可能的数字k
(除了1
)它们最多可以出现在每一行的一列中。
第一个约束更有趣一些,我相信它可以通过很多不同的方式来完成。这是一种方法——我们要禁止所有左边1
至少有一个的数字(除了 ) 。1
所以我们可以设置约束如下:
for i in set_I:
for j in set_J:
if j == 1:
continue # no constraint for 1st column
for k in set_K:
if k==1:
continue # no constraint on 1s
prev_cols = [item for item in set_J if item < j]
model += y[i, j, k] <= 1 - 0.25*lpSum([y[i, item, 1] for item in prev_cols])
您可能需要将一些1
' 更改为0
',具体取决于您设置索引/集的方式。要理解最后一个约束,请考虑两种情况:
i) 前面的列都没有1
s。这种约束将使它们变得y[i,j,k] <= 1
无效(y
无论如何都是二进制变量)。
ii) 任何先前的列中都有1
s - 约束将变为y[i,j,k] <= 0.75
(或0.5
, 0.25
, 或者0
如果有 2、3 或 4 个先前的)。与二进制变量一样,唯一可行的值y
小于。因此,对于左侧有 a 的列,所有非值都将被禁止。1
0
1
1
推荐阅读
- jersey - 百里香内联原始 i18n 消息到 javascript
- reactjs - React Onclick - 没有重载匹配这个调用
- c# - 我应该如何在命令栏项目中设置搜索框?
- javascript - React 钩子上的无限调用 API 的问题
- java - 为什么 Liveness / Readiness 探测失败?
- sqlalchemy - sqlalchemy.exc.InternalError: (psycopg2.errors.InternalError_) 找不到从未知到描述枚举的转换函数
- ios - 我想在 Xcode 上使用 Swift 让我的暗模式同时在所有视图控制器上工作。我该怎么做?
- sql - 在 Quill SQL 中连接多个中缀
- python-3.x - 嘿,我需要在列表中输入单词,然后计算它们并打印该列表中有多少项目而不计算重复项
- firebase - Firestore 安全规则:更新文档安全规则