2.2.2 逻辑与
考虑两个命题P和Q,则二者的逻辑与关系可表示为P∧Q。当命题P、Q均为真时,P∧Q为真,其他情况下P∧Q为假。为将上述真值关系转换成数学模型,需仿照上文做法,引入3个0-1变量x1、x2和y,分别表示命题P、Q和P∧Q的真值,即0-1变量取值为1表示命题为真,取值为0表示命题为假。
若要使得数学模型和逻辑与运算等价,只需要使得x1、x2和y的取值与P、Q和P∧Q的真值一一对应相等即可,即:若x1=1,x2=1,则y=1,其他情况下均有y=0。上述一一对应关系可以通过下面的约束实现。
下面使用Python分别调用COPT和Gurobi来验证上述结论。由于COPT和Gurobi的实现方法基本一致,因此本章仅针对逻辑与的情形展示调用这两个求解器的完整代码,其余逻辑运算均仅展示COPT的完整代码,Gurobi的完整代码见本书配套电子资源。
Python调用COPT验证逻辑与运算建模的完整代码如下。
Python调用Gurobi验证逻辑与运算建模的完整代码如下。
在上述代码中,我们首先设置x1=1,x2=1,运行代码,结果显示y=1。更改x1和x2的值,y的取值会发生相应的变化,即当x1=1,x2=0或x1=0,x2=1或x1=0,x2=0时,y的值均为0。
为了方便用户建模,COPT和Gurobi都提供了内置的逻辑与约束的添加方法,这些方法为用户提供了极大的便利。COPT和Gurobi中对应的函数接口均为addGenConstrAnd(y,[x1,x2],name="")。若要使用该函数添加逻辑与约束y=(x1∧x2),相应的代码如下。
经过验证,直接使用函数addGenConstrAnd进行建模的结果与使用式(2.1)~式(2.4)建模的结果完全相同。
进一步地,考虑N个命题的逻辑与运算。引入N个0-1变量xi(∀i=1,…,N),表示对应命题的真值。引入0-1变量y,表示N个命题的逻辑与运算的真值,即y=(x1∧x2∧…∧xN)。y的真值取值情况可用以下约束等价描述。