问题描述
我想使用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