4. 多重建模-不同视角
4.1 连通约束-煮酒问题
-
在以下情况下,函数f: DOM ➔ COD 是特殊的
|DOM| = |COD|
函数f 是双射的某一视角会从一个特定的角度看待问题的决策
一个双射函数有两个视角(通常的)函数
array[DOM] of var COD: f;
和它的逆函数
array[COD] of var DOM: finv; -
问题的有些约束可能用函数或者它的逆函数更容易表达
为什么不两个都用呢!?
我们可以把两个模型结合
通过使用连通约束,我们使两个函数一致
forall(w in WINE, f in FOOD) ( eat[w] = f <-> drink[f] = w );或者:
使用inverse来结合两个模型
此连通可以使用以下全局约束来描述
inverse(eat, drink)
或inverse(drink, eat)
注意到inverse已经使alldifferent约束变得冗余,我们可以将之去掉 -
总结:
- 问题的多重视角导致了 多重模型
- 不同的视角可以表达不同的约束更自然也更简洁对求解器更好(通常越简洁越好&#x