Python 纸浆条件约束和(基于变量)
我试图优化一个问题,其中决策变量(X)是一个NxN二进制矩阵。我发现问题的一个制约因素难以发挥作用 第一个约束意味着每行X的和必须==1。(涵盖) 第二个约束(我无法使用的约束)要求对于对角线为==1的列,X的和必须>=2。我在PuLP中生成了以下约束:Python 纸浆条件约束和(基于变量),python,optimization,constraints,linear-programming,pulp,Python,Optimization,Constraints,Linear Programming,Pulp,我试图优化一个问题,其中决策变量(X)是一个NxN二进制矩阵。我发现问题的一个制约因素难以发挥作用 第一个约束意味着每行X的和必须==1。(涵盖) 第二个约束(我无法使用的约束)要求对于对角线为==1的列,X的和必须>=2。我在PuLP中生成了以下约束: for j in W: prob += sum(X[i][j] for i in W if X[j][j] >= 1) >= 2 纸浆表示溶液状态为“不可行”。我做错了什么??此约束不能在纸浆中实施 基本上,涵盖先前需求
for j in W:
prob += sum(X[i][j] for i in W if X[j][j] >= 1) >= 2
纸浆表示溶液状态为“不可行”。我做错了什么??此约束不能在纸浆中实施
基本上,涵盖先前需求的示例解决方案矩阵为:
[0,0,0,1,0]
[0,0,0,1,0]
[0,0,0,1,0]
[0,0,0,0,1]
[0,0,0,0,1]
这是一个线性规划框架,因此只能使用线性函数。任意python表达式,如:
if
abs
min
abs
和min
,同时与某些规则集兼容)
在这里,你需要自己做这件事
如果我正确理解了任务,它看起来像:
- 二元矩阵
- 每行总和为1
- 每个列和都是无约束的,除了一列,在对角线位置有一个1->那么这个列和的下限是2
D! D!
1 0 0 0 sum = 1
1 0 0 0 sum = 1
0 0 1 0 sum = 1
0 0 1 0 sum = 1
sums
2 0 2 0
我们可以将表达式线性化为:
for column in columns:
(1-diag_elem_of_column) * bigM + sum(column) >= 2
<->
(1-diag_elem_of_column) * 2 + sum(column) >= 2
# assumption: square-matrix
# assumption: X[row][col] storage-order
N = 5
for diag_element_index, col in enumerate(N):
prob += (1 - X[diag_element_index][col]) * 2 + sum([X[row][col] for row in range(N)]) >= 2