【问题标题】:minimizing boolean function heuristic for A* algorithm最小化 A* 算法的布尔函数启发式
【发布时间】:2011-12-28 11:03:16
【问题描述】:

我必须用 python 编写一个程序来最小化布尔函数,但问题是我必须使用搜索算法,例如 A* 或更简单的算法 BFS 或类似的东西。我用迭代加深写了一个程序,它解决了所有问题,但是速度太慢(每个问题限制为20s)。

所以我使用 A* 算法编写了另一个程序,(我们被告知如果我们想要更好的成绩,我们必须使用这个),但我设法使它比使用迭代加深的程序慢 10 倍,这是因为我无法找出算法的正确启发式。我无法弄清楚有效最小化的标准是什么(良好的启发式)。

问题:

给你一个列表列表 ([[0,1,0,1],[...],[...],[....],...]) 代表真值表 (内部列表中的最后一个元素表示函数的值)。编写一个程序,仅使用搜索算法(例如 A*、BFS、IDA*、DFS ......)找到布尔函数的最小析取形式。每个问题你都有 20 多岁的时间来解决。

【问题讨论】:

  • 请添加原始问题描述。

标签: algorithm search a-star minimization


【解决方案1】:

我将假设您的状态是有效的合取集合。这是一个简单的可接受的启发式方法。令 U 为映射到 1 的一组函数输入,这些输入与当前状态下的任何合取都不匹配。当 U 不为空时,在 U 中选择一个输入 x。从 U 中删除所有输入 y,使得存在匹配 x 和 y 的有效合取。返回从 U 中选择的元素数。

其实这个问题可以看成set cover的一个实例,这个启发式就是贪婪地构造一个LP松弛对偶的解。如果您可以使用 LP 求解器,则可以通过将对偶 LP 求解到最优来获得更高质量(但可能更慢)的启发式算法。

【讨论】:

  • 我正在使用 Lists [[1,2],[3,4]] => (x1 & x2)|(x3 & x4) 还有一件事是最好从完整形式开始并开始最小化,或者最好从零输入开始,然后添加它们直到我得到正确的函数。
  • @Aljaž Prijatelj 使用列表要注意的一件事是,您不应该对待 [[1,2],[3,4]] 和 [[3,4],[1,2 ]] 作为单独的状态,您不应将 [[1,2],[3,4]] 和 [[2,1],[3,4]] 视为单独的状态。我从来没有在这个问题上应用过 A*,所以我不知道哪种状态/转换效果最好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2017-01-18
  • 1970-01-01
  • 2014-05-24
相关资源
最近更新 更多