【问题标题】:(Python) code to count weighted perfect matchings?(Python)代码来计算加权完美匹配?
【发布时间】:2014-03-13 13:33:02
【问题描述】:

如果这个问题更适合 mathoverflow 或其他姐妹网站,请原谅我。

我有兴趣计算(不一定是二分的)平面图中完美匹配的加权和。这是一个标准问题;它经常使用FKT algorithm 解决。我想找一些 Python 代码来解决这个问题(也不想自己写,因为算法有点复杂)。

如果做不到这一点,是否有其他(相对主流)语言的代码可用?

下面的用户 sabbahillel 建议我应该列出一些我发现不起作用的软件,以避免重复工作。为此:

  • fkt 似乎只适用于未加权图,并且在 Gforth 中。
  • OBDD by Knuth (!) 仅适用于未加权二分图,位于 CWEB 中。
  • vaxmaple 需要 Maple 并且 vaxmacs 是 Emacs 模式 (?!?!);既不支持加权图也不支持非二分图。

【问题讨论】:

  • 第四个包似乎明确支持加权图。阅读代码。

标签: python math graph-theory


【解决方案1】:

谷歌是你的朋友。我在 FORTH 中找到了一个实现这个的 sourceforge 项目

FKT Alpha Count perfect matchings in planar graphs.

描述:该项目提供了 FKT 的实现 计算平面图中完美匹配数的算法。 源代码是用 Forth 语言编写的,需要 Gforth 跑。计算可以通过命令行工具以及 通过可与 Gforth 一起使用的库。

Source Code

【讨论】:

  • 谢谢,我也发现了,但是 (1) 它适用于 未加权 图,并且 (2) 它在 Gforth 中。
  • @Bill Bradley 好的,我想我会提到它以防万一。您可能想提及您发现的其他不适用于节省时间的内容。
【解决方案2】:

我是 sourceforge 上FKT 项目的作者。 FKT 确实支持加权图。 FKT 安装了一个命令行程序,该程序将图形的 ASCII 描述作为输入,并在标准输出上输出计算出的匹配数。该接口允许与其他编程语言(例如 Python)轻松集成。当然,您需要在系统上安装 Gforth,但这应该不是问题,所有主流 Linux 发行版的存储库中都有 Gforth 包。

FKT 在有限域上进行整数算术的所有计算(以选定的整数 N 为模)。该整数 N 的宽度限制为 31 位或 63 位,具体取决于您的操作系统。如果需要更长的结果,您可以使用不同的(共)质数 N_1..N_k 多次调用 FKT,然后使用 Chinese Remainder Theorem 确定图模 N_1*...*N_k 的实际加权匹配计数。

请注意,FKT 算法不能确定匹配总和的实际符号。它只保证所有匹配都用相同的符号求和。因此 FKT 输出 -m 或 m (mod N),在应用中国剩余定理后,输出为 -m 或 m (mod N_1*...*N_k)。通常你对你的图表有足够的了解,知道会出现什么迹象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多