Python 纸浆条件约束和(基于变量)

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 纸浆表示溶液状态为“不可行”。我做错了什么??此约束不能在纸浆中实施 基本上,涵盖先前需求

我试图优化一个问题,其中决策变量(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
纸浆表示溶液状态为“不可行”。我做错了什么??此约束不能在纸浆中实施

基本上,涵盖先前需求的示例解决方案矩阵为:

[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