我正在用C ++编写一些代码,需要检查是否满足两个未知变量中的不等式列表。
例如,一个可能的列表可以是P = Q,Q< S,P = S不应该满足
另一个例子,P = Q,Q< S,R = P,S> R应该得到满足
我一直在思考如何做到这一点,但我似乎找不到任何方法,除了一个冗长乏味的方法,其中包括检查所添加的每个新不等式是否满足所有以前的不等式。
答案 0 :(得分:0)
这是布尔逻辑中比C ++更多的练习。如果你知道Python使用它。
更快的方法是一次构造一个“排序”(在数学意义上)一个语句。这就是你有序列的地方,b c假设和a
假设现在序列中的每个东西都是一个彼此相等的向量。在上面的例子中:
P = Q
我们的订购如下:
[P,Q]
下一个Q.
现在我们有了一个订单:
[P,Q],[S]
我们知道[P,Q]< [S]
所以P = S是一个明显的矛盾。
答案 1 :(得分:-1)
首先,通过将所有P = Q
替换为Q
来删除所有等级P
。
这会将P = Q, Q < S, R = P, S > R
缩减为R < S, S > R
。
其次,如果您的列表包含P
或Q
,则构建一个有向变量作为顶点和从P < Q
到Q > P
的边的有向图。
第三,检查图表是否包含周期。如果图形不包含循环,则不等式是可以满足的。
你可能想要谷歌2-SAT,这与这个问题有关。