要将 max(a, b)
函数线性化,您可以引入一个新的变量来表示最大值,并添加一些约束来确保该变量的值等于 a
和 b
中的最大值。
下面是一个将 max(a, b)
函数线性化的示例:
# 假设您已经有了变量 a 和 b
a = model.addVar(vtype=GRB.CONTINUOUS, name='a')
b = model.addVar(vtype=GRB.CONTINUOUS, name='b')
# 引入一个新的变量来表示最大值
max_value = model.addVar(vtype=GRB.CONTINUOUS, name='max_value')
# 添加约束来确保 max_value 的值等于 a 和 b 的最大值
M = 10000 # 可以选择一个足够大的常数 M
model.addConstr(max_value >= a, 'max_constraint_1')
model.addConstr(max_value >= b, 'max_constraint_2')
model.addConstr(max_value <= a + M * (1 - model.addVar(vtype=GRB.BINARY, name='max_constraint_3')))
model.addConstr(max_value <= b + M * (model.addVar(vtype=GRB.BINARY, name='max_constraint_4')))
# 然后您可以在目标函数中使用 max_value
obj.add(max_value)
在上面的示例中,我们引入了一个新的变量 max_value
来表示变量 a
和 b
的最大值。然后,我们添加了两个约束来确保 max_value
大于等于 a
和 b
。注意,我们还引入了两个二进制变量来线性化 max
函数。其中,如果 a
大于等于 b
,则 max_constraint_3
为 1,否则为 0;而 max_constraint_4
则相反。这样,通过将 M
乘以相应的二进制变量,我们可以确保在 max
函数中只有一个参数起作用,从而实现了线性化。