gurobiという数理最適化ソルバーでxorを表現できなくて困ったのでメモ。
https://www.gurobi.com/documentation/9.1/refman/py_python_api_details.html
のAPIを眺めると、現状、abs_,and_,or_,max_,min_の五種類しか論理記号がない。
このmax_とmin_を使うことでxorを表現できる。
from gurobipy import *
for i in range(2):
for j in range(2):
m=Model()
m.setParam("outputflag",0)
a=m.addVar(vtype="b")
b=m.addVar(vtype="b")
xor=m.addVar(vtype="b")
c=m.addVar(vtype="b")
d=m.addVar(vtype="b")
m.addConstr(c==max_(a,b))
m.addConstr(d==min_(a,b))
m.addConstr((xor==1)>>(c-d==1))
m.addConstr((xor==0)>>(c-d==0))
m.addConstr(a==i)
m.addConstr(b==j)
m.optimize()
print("(a:",i,"b:",j ,") xor:",round(xor.X))
#out
(a: 0 b: 0 ) xor: 0
(a: 0 b: 1 ) xor: 1
(a: 1 b: 0 ) xor: 1
(a: 1 b: 1 ) xor: 0
以上のように、xorを表現することが出来た。