【问题标题】:Checking if a list of arbitrary inequalities are satisfied检查是否满足任意不等式列表
【发布时间】:2013-12-14 15:54:00
【问题描述】:

我正在用 C++ 编写一些代码,需要检查是否满足两个未知变量中的不等式列表。

例如,一个可能的列表可能是 P = Q, Q

另一个例子,P = Q, Q R 应该满足

我已经思考了很长时间,但我似乎找不到任何方法,除了一个冗长乏味的方法,它涉及检查每个添加的新不等式是否满足所有以前的不等式。

【问题讨论】:

  • 您的意思是“可以满足”还是“满足于一组特定的值”? ...图表在哪里?
  • @Yakk 他实际上并没有那么远,排序离作为一种图形的格子不远。至于 C++ 标签.... :P
  • @alecteal 当然,但调用多项式等价意味着它应该出现在每个算法问题上。您也可以将一般的车削计算表示为图形。

标签: c++ constraints graph-theory inequality


【解决方案1】:

这更像是布尔逻辑的练习,而不是 C++。如果您知道 Python,请使用它。

一种更快的方法是一次构造一个“排序”(在数学意义上)一个语句。那就是你有一个序列的地方,a b c 假设和 a

假设现在序列中的每个事物都是彼此相等的事物的向量。在上面的例子中:

P=Q

我们的排序如下:

[P,Q]

下一个问题

所以现在我们有一个订单:

[P,Q],[S]

我们知道[P,Q]

所以 P=S 是一个明显的矛盾。

【讨论】:

  • 这样的列表怎么样 P = Q, Q
  • @user2454986 首先是 [P,Q] 然后是 [P,Q],[S] 然后用 [R],[S] 创建第二个列表。继续直到矛盾。
  • 假设我正在处理一个包含 20 个不等式的列表,其中包含大约 6 个不同的未知变量。拥有许多列表会变得非常混乱。也许如果总是存在矛盾,它可能不会那么糟糕,但所有的不平等也可能是正确的。当我试图找出一种方法时,我确实想到了与您提到的类似的想法,但出于这个原因我将其驳回。
  • 你正在重构一个排序,你可以在一定程度上合并排序......它被称为分区。 @user2454986 求神真分析书
【解决方案2】:

首先,通过将所有出现的Q 替换为P,删除所有相等的P = Q。 这会将P = Q, Q < S, R = P, S > R 减少到R < S, S > R

其次,如果您的列表包含P < QQ > P,则构建一个以变量为顶点和从PQ 的边的有向图。

第三,检查图形是否包含循环。如果图不包含环,则不等式是可满足的。

你可能想用谷歌搜索 2-SAT,这与这个问题有关。

【讨论】:

  • 需要最少元素。
  • @AlecTeal 需要详细说明吗?
  • 不等式是一种“等价关系” 唯一有意义的等式集是您开始排序的子集。您所做的是格子,如果格子没有环,格子就是偏序。幂集定义了一个格,但不是排序,它们是部分排序。数学ftw! :P
  • 此外,排序可以被认为是一个集合和(一个子集)自然数之间的双射,然后采用自然数的顺序。双射是一个映射记住。在图上创建双射要困难得多。循环意味着双射不存在......你明白了。
  • 不是单独的,而是一个排序是一个集合,如果 a>=b 和 a没有双射。但是幂集格也没有循环,但它也不是有序的。那里有矛盾。不等式具有传递性,a X b 和 b X c 表示 a X c,但你是对的,我用错了术语。
猜你喜欢
  • 2022-06-13
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2020-07-28
  • 2023-04-05
相关资源
最近更新 更多