DOcplexException:期望线性约束,得到:docplex.mp.LogicalOrExpr

问题描述

我想使用docplex编写条件约束。约束是:

if:
y[(i,j,k)]  == 1 or y[(j,i,k)]  == 1 

then:
g[i,k]==1

我以这种方式在docplex中实现了代码

mdl.add(mdl.if_then(mdl.logical_or(y[(i,k)]  == 1,y[(j,k)]  == 1 ),g[i,k]==1))

但是当我运行时,出现此错误

DOcplexException: Expecting linear constraint,got: docplex.mp.LogicalOrExpr(y_13_16_14 == 1,y_16_13_14 == 1)

如何解决错误

解决方法

代替if_then需要线性约束,您可以使用真值。

让我给你一个bus example中的小例子

    <TextInput
    placeholder="Age (Yr)"
    style={AuthScreenStyles.Input}
    autoCapitalize="none"
    autoCorrect={false}
    returnKeyType={'done'}
    keyboardType="numeric"
    ref={register({ name: 'age_year' },{ required: true })}
    onChangeText={(text) => setValue('age_year',text,true)}
    onSubmitEditing = {(event) => (Alert.alert(event.nativeEvent.text))}
    multiline={false}
/>
,

Model.logical_or返回一个 expression ,如果其中一个参数为true,则等于1;否则,返回1。 Model.if_then需要线性约束,因此您需要将表达式转换为约束,例如,编写(Model.logical_or(a,b) ==1)

在这个小例子中,我声明当a或b等于1时c等于1(请注意,逻辑运算符(例如logical_or或logical_and)接受二进制变量,因此无需在其中添加“ == 1”:

m = Model()
[a,b,c] = m.binary_var_list(keys=['a','b','c'],name=str)
# if a or b then c
m.add(m.if_then(m.logical_or(a,b) == 1,c==1))
m.maximize(a+b)
m.solve()
m.print_solution()

结果是:

objective: 2
  "a"=1
  "b"=1
  "c"=1