Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 如何利用线性规划求解逻辑约束_Optimization_Linear Programming_Lpsolve_Gurobi - Fatal编程技术网

Optimization 如何利用线性规划求解逻辑约束

Optimization 如何利用线性规划求解逻辑约束,optimization,linear-programming,lpsolve,gurobi,Optimization,Linear Programming,Lpsolve,Gurobi,我希望使用线性规划来解决逻辑中描述的以下问题。在下面的示例中,n1、n2、n3、b1、b2、b3是布尔变量 目标是最小化c1 以下是限制条件: 约束1:((n1==n2或n3)和&c1==2和b1)| |((n1==n2或n3)和&c1==1和b2)| |((n1==n2和n3)1和&c1==3和b3) 约束2:n1&&n2==非n3 约束3:只有b1、b2、b3中的一个为真 我可以知道有没有可能将这些逻辑约束编码为线性规划工具(如Gurobi或lpsolve)所需的整数约束?或者是否有任何工具

我希望使用线性规划来解决逻辑中描述的以下问题。在下面的示例中,
n1、n2、n3、b1、b2、b3
是布尔变量

目标是最小化
c1

以下是限制条件:

约束1:
((n1==n2或n3)和&c1==2和b1)| |((n1==n2或n3)和&c1==1和b2)| |((n1==n2和n3)1和&c1==3和b3)

约束2:
n1&&n2==非n3

约束3:
只有b1、b2、b3中的一个为真

我可以知道有没有可能将这些逻辑约束编码为线性规划工具(如Gurobi或lpsolve)所需的整数约束?或者是否有任何工具可以利用布尔约束


谢谢。

混合整数规划(不是线性规划)是可能的,但很麻烦。让我们从简单的开始:

约束2

n1 + n2 = 1 - n3
b1 + b2 + b3 = 1  (if at most one of them is true then change = to <=)
约束3

n1 + n2 = 1 - n3
b1 + b2 + b3 = 1  (if at most one of them is true then change = to <=)

y2:=y1-xor-n3-->(y2&&c1==2&&b1)|(y1或n3)&&c1==1&&b2)|(y1和n3)1&&c1==3&&b3)


y6:=y2&&y5&&b1-->y6 | |((y1或n3)和&c1==1&&b2)|((y1和n3)1和&c1==3和b3)


y10:=c1==1-->y6||(y7&&y10&&b2)|(y1和n3)1&&c1==3&&b3)


假设
1&&
是一个打字错误,实际上是
&

y12:=(y1和n3)-->y6 | | y11 | |(y12和&c1==3和&b3)


y16:=y12&&y15&&b3-->y6||y11|y16

y16 <= y12
y16 <= y15
y16 <= b3
y16 >= y12 + y15 + b3 - 2
y6 + y11 + y16 >= 1
我希望这有帮助。为了方便起见,我在下面提供了完整的数学模型

数学模型

      min c1 
s.t.  n1 + n2 = 1 - n3
      b1 + b2 + b3 = 1
      y1 >= 1 - (n1 + n2)
      y1 >= (n1 + n2) - 1
      y1 <= 2 - 2n1 +  n2
      y1 <= 2 - 2n2 + n1
      y2 <= y1 + x3
      y2 >= y1 - x3
      y2 >= x3 - y1
      y2 <= 2 - y1 - x3
      z3 >= c1 - 2 + epsilon*y3;  z3 >= 0
      z4 >= 2 - c1 + epsilon*y4;  z4 >= 0
      z3 <= My3
      z4 <= My4
      y3 + y4 + y5 = 1
      y6 <= y2
      y6 <= y5
      y6 <= b1
      y6 >= y2 + y5 + b1 - 2
      y7 >= y1
      y7 >= n3
      y7 <= y1 + n3
      z8 >= c1 - 1 + epsilon*y8;  z8 >= 0
      z9 >= 1 - c1 + epsilon*y9;  z9 >= 0
      z8 <= My8
      z9 <= My9
      y8 + y9 + y10 = 1
      y11 <= y7
      y11 <= y10
      y11 <= b2
      y11 >= y7 + y10 + b2 - 2
      y12 <= y1
      y12 <= n3
      y12 >= y1 + n3 - 1
      z13 >= c1 - 3 + epsilon*y13;  z13 >= 0
      z14 >= 3 - c1 + epsilon*y14;  z14 >= 0
      z13 <= My13
      z14 <= My14
      y13 + y14 + y15 = 1
      y16 >= y12
      y16 >= y15
      y16 >= b3
      y16 >= y12 + y15 + b3 - 2
      y6 + y11 + y16 >= 1
      y1, ..., y16, b1, b2, b3, n1, n2, n3 binary
      z3, z4, z8, z9, z13, z14 >= 0

这是有意义的:
c1==1
c2==2
c3==3
,第3条为真,且案例
c1=1
为最小可能。插入其他变量的值,我们可以看到所有三个约束都得到了满足。

混合整数规划(不是线性规划)是可能的,但很混乱。让我们从简单的开始:

约束2

n1 + n2 = 1 - n3
b1 + b2 + b3 = 1  (if at most one of them is true then change = to <=)
约束3

n1 + n2 = 1 - n3
b1 + b2 + b3 = 1  (if at most one of them is true then change = to <=)

y2:=y1-xor-n3-->(y2&&c1==2&&b1)|(y1或n3)&&c1==1&&b2)|(y1和n3)1&&c1==3&&b3)


y6:=y2&&y5&&b1-->y6 | |((y1或n3)和&c1==1&&b2)|((y1和n3)1和&c1==3和b3)


y10:=c1==1-->y6||(y7&&y10&&b2)|(y1和n3)1&&c1==3&&b3)


假设
1&&
是一个打字错误,实际上是
&

y12:=(y1和n3)-->y6 | | y11 | |(y12和&c1==3和&b3)


y16:=y12&&y15&&b3-->y6||y11|y16

y16 <= y12
y16 <= y15
y16 <= b3
y16 >= y12 + y15 + b3 - 2
y6 + y11 + y16 >= 1
我希望这有帮助。为了方便起见,我在下面提供了完整的数学模型

数学模型

      min c1 
s.t.  n1 + n2 = 1 - n3
      b1 + b2 + b3 = 1
      y1 >= 1 - (n1 + n2)
      y1 >= (n1 + n2) - 1
      y1 <= 2 - 2n1 +  n2
      y1 <= 2 - 2n2 + n1
      y2 <= y1 + x3
      y2 >= y1 - x3
      y2 >= x3 - y1
      y2 <= 2 - y1 - x3
      z3 >= c1 - 2 + epsilon*y3;  z3 >= 0
      z4 >= 2 - c1 + epsilon*y4;  z4 >= 0
      z3 <= My3
      z4 <= My4
      y3 + y4 + y5 = 1
      y6 <= y2
      y6 <= y5
      y6 <= b1
      y6 >= y2 + y5 + b1 - 2
      y7 >= y1
      y7 >= n3
      y7 <= y1 + n3
      z8 >= c1 - 1 + epsilon*y8;  z8 >= 0
      z9 >= 1 - c1 + epsilon*y9;  z9 >= 0
      z8 <= My8
      z9 <= My9
      y8 + y9 + y10 = 1
      y11 <= y7
      y11 <= y10
      y11 <= b2
      y11 >= y7 + y10 + b2 - 2
      y12 <= y1
      y12 <= n3
      y12 >= y1 + n3 - 1
      z13 >= c1 - 3 + epsilon*y13;  z13 >= 0
      z14 >= 3 - c1 + epsilon*y14;  z14 >= 0
      z13 <= My13
      z14 <= My14
      y13 + y14 + y15 = 1
      y16 >= y12
      y16 >= y15
      y16 >= b3
      y16 >= y12 + y15 + b3 - 2
      y6 + y11 + y16 >= 1
      y1, ..., y16, b1, b2, b3, n1, n2, n3 binary
      z3, z4, z8, z9, z13, z14 >= 0

这是有意义的:
c1==1
c2==2
c3==3
,第3条为真,且案例
c1=1
为最小可能。插入其他变量的值,我们可以看到所有三个约束都得到了满足。

我认为您可以通过在约束编程系统(如or)中表达来解决它。查看它们-有许多示例可以帮助您入门。

我认为您可以通过在约束编程系统(如or)中表达来解决它。查看它们-有许多示例可以帮助您开始。

您的问题似乎结构非常有限,因此解决方案应该更简单。显然c1必须是1、2或3

  • 如果((n1==n2或n3)&&b2)有溶液,则c1=1
  • 否则,如果n1==n2(或n3)&&b1)有溶液,则c1=2
  • 否则,如果((n1==n2和n3)&&b3)有溶液,则c1=3。(原始问题中有一个拼写错误,带有一个虚假的1)
  • 否则,就没有解决办法 约束3很简单,因为b1、b2和b3中的每一个仅使用一次:

  • 如果(n1==n2或n3)有溶液,则c1=1,b2=1,b1=b3=0
  • 否则,如果(n1==n2 xor n3)有一个解,则c1=2,b1=1,b2=b3=0
  • 否则,如果(n1==n2和n3)有溶液,则c1=3,b3=1,b1=b2=0
  • 否则,就没有解决办法

  • 约束2意味着可以从n1和n2计算n3:n3=非(n1和n2),所以您只需尝试n1和n2的四种组合,计算每种组合的n3,并检查这些条件。不需要线性规划或整数规划。

    您的问题似乎结构非常有限,因此解决方案应该简单得多。显然c1必须是1、2或3

  • 如果((n1==n2或n3)&&b2)有溶液,则c1=1
  • 否则,如果n1==n2(或n3)&&b1)有溶液,则c1=2
  • 否则,如果((n1==n2和n3)&&b3)有溶液,则c1=3。(原始问题中有一个拼写错误,带有一个虚假的1)
  • 否则,就没有解决办法 约束3很简单,因为b1、b2和b3中的每一个仅使用一次:

  • 如果(n1==n2或n3)有溶液,则c1=1,b2=1,b1=b3=0
  • 否则,如果(n1==n2 xor n3)有一个解,则c1=2,b1=1,b2=b3=0
  • 否则,如果(n1==n2和n3)有溶液,则c1=3,b3=1,b1=b2=0
  • 否则,就没有解决办法
  • 约束2意味着可以从n1和n2计算n3:n3=not(n1和n2),所以您需要做的就是尝试n1和n2的四种组合,为每个组合计算n3,并检查这些条件。不需要线性规划或整数规划

    n1 = 1
    n2 = 1
    n3 = 1
    b1 = 0
    b2 = 1
    b3 = 0