Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Mixed Integer Programming - Fatal编程技术网

Optimization 混合整数线性规划;当且仅当;包含非二进制变量的约束

Optimization 混合整数线性规划;当且仅当;包含非二进制变量的约束,optimization,linear-programming,mixed-integer-programming,Optimization,Linear Programming,Mixed Integer Programming,有一个限制 c[i]=j iff b[i][j]=1 其中i,j是大于0的整数,b[i][j]是二进制数 你知道如何在线性规划中表达这个约束吗?谢谢大家! 这个问题没有人们想象的那么清楚。最好的答案是:“视情况而定” 看着 c[i]=j iff b[i][j]=1 (1) 单独而言,我们需要实施以下影响: b[i][j]=1 => c[i]=j (2) b[i][j]=0 => c[i]<>j

有一个限制

c[i]=j iff b[i][j]=1
其中i,j是大于0的整数,b[i][j]是二进制数


你知道如何在线性规划中表达这个约束吗?谢谢大家!

这个问题没有人们想象的那么清楚。最好的答案是:“视情况而定”

看着

  c[i]=j iff b[i][j]=1            (1)
单独而言,我们需要实施以下影响:

  b[i][j]=1  =>  c[i]=j           (2)
  b[i][j]=0  =>  c[i]<>j          (3)
b[i][j]=1=>c[i]=j(2)
b[i][j]=0=>c[i]j(3)
(2) 可以使用指标约束实现。第二个(3)更为复杂,因为我们需要执行以下操作:

  b[i][j]=0  =>  c[i]<j or c[i]>j    (4)
b[i][j]=0=>c[i]j(4)
这将需要至少一个额外的二进制变量来处理“or”。一种方法是:

  b[i][j]=0  =>  c[i]<=j-1+M⋅δ        (5)
  b[i][j]=0  =>  c[i]>=j+1-M⋅(1-δ)    (6)
  δ ∈ {0,1}                           (7)
  M = card(j)                         (8)
b[i][j]=0=>c[i]c[i]>=j+1-M⋅(1-δ)    (6)
δ ∈ {0,1}                           (7)
M=卡(j)(8)
M=card(j)
只是一个常数,表示集合j的大小。当然,这不是实现这一目标的唯一途径。注意,我混合使用了指标约束和大M约束。这也可以完全用指标约束(需要额外的二进制变量)或仅用大M约束来表示


虽然我们可以(通过一些努力)实现(3),但很可能我们不需要它。很可能,我们唯一需要的就是暗示(2)。与大多数问题一样,如果不看模型的其余部分,就很难给出好的答案。

问题并不像人们想象的那么清楚。最好的答案是:“视情况而定”

看着

  c[i]=j iff b[i][j]=1            (1)
单独而言,我们需要实施以下影响:

  b[i][j]=1  =>  c[i]=j           (2)
  b[i][j]=0  =>  c[i]<>j          (3)
b[i][j]=1=>c[i]=j(2)
b[i][j]=0=>c[i]j(3)
(2) 可以使用指标约束实现。第二个(3)更为复杂,因为我们需要执行以下操作:

  b[i][j]=0  =>  c[i]<j or c[i]>j    (4)
b[i][j]=0=>c[i]j(4)
这将需要至少一个额外的二进制变量来处理“or”。一种方法是:

  b[i][j]=0  =>  c[i]<=j-1+M⋅δ        (5)
  b[i][j]=0  =>  c[i]>=j+1-M⋅(1-δ)    (6)
  δ ∈ {0,1}                           (7)
  M = card(j)                         (8)
b[i][j]=0=>c[i]c[i]>=j+1-M⋅(1-δ)    (6)
δ ∈ {0,1}                           (7)
M=卡(j)(8)
M=card(j)
只是一个常数,表示集合j的大小。当然,这不是实现这一目标的唯一途径。注意,我混合使用了指标约束和大M约束。这也可以完全用指标约束(需要额外的二进制变量)或仅用大M约束来表示


虽然我们可以(通过一些努力)实现(3),但很可能我们不需要它。很可能,我们唯一需要的就是暗示(2)。与大多数问题一样,如果不考虑模型的其余部分,就很难给出好的答案。

i>0和j>0以及c[i]=j和b[i][j]=1
i>0和j>0以及c[i]=j和b[i][j]=1