【问题标题】:Optimal decision tree for a heuristic algorithm启发式算法的最优决策树
【发布时间】:2013-07-01 17:13:55
【问题描述】:

我有以下格式的启发式:

if a == 1 and b == 1 and c == 1:
    do something
if a == 1 and b == 1 and c == 2:
    do something
if a == 3 and b == 2 and c == 1:
    do something
if a == 2 and b == 2 and c == 1:
    do something
if a == 3 and b == 1 and c == 3:
    do something
etc.

当然,这会产生许多不必要的比较,如果语句嵌套如下,则可以避免:

if a == 1:
    if b == 1:
        if c == 1:
            do something
        if c == 2:
            do something
etc.

假设我有一个案例的元组(a, b, c) 的集合是有限的,并且每个元组都具有相同的被算法接收的可能性,我如何生成一个最优的决策树,即它使一般情况下的比较次数最少,还是在所有输入都经过它时最小化比较总数?

我想像这样:

In: optimal_tree([(1, 1, 1), (1, 1, 2)])
Out: "if a == 1:
          if b == 1:
              if c == 1:
                  do something
              if c == 2:
                  do something"

In: optimal_tree([(1, 1), (2, 1), (2, 2)])
Out: "if a == 2:
          if b == 1:
              do something
          if b == 2:
              do something
      if a == 1:
          do something"

     OR

     "if b == 1:
          if a == 1:
              do something
          if a == 2:
              do something
      if b == 2:
          do something"

【问题讨论】:

  • 这是一个理论练习,还是您实际上需要尽快处理传入的元组流?
  • 后者,虽然我的问题很简单,只要将出现频率较高的值放在首位,我就可以让它接近最优。不过,我想知道如何解决这个问题。

标签: decision-tree heuristics


【解决方案1】:

规则引擎和数据库查询也会定期处理这个问题。您可能想了解这些背后的实现。

他们有几种方法来处理这个问题(尽管没有一个是完美的):

  • 按照规则/查询中定义的顺序进行比较。
  • 根据统计信息重新排序比较。例如,数据库将首先处理具有最大价值差异的索引列。

如果您想让您的算法更快,您可能想要研究散列和索引(如果您还没有这样做的话)。这带来了更大的规模优势。

【讨论】:

  • 谢谢。我只是认为会有一些算法可以优化这一点,因为有一个“正确答案”(在测试所有可能的输入时进行最少比较的答案)。
猜你喜欢
  • 2012-05-23
  • 2011-05-06
  • 2018-12-12
  • 2018-12-20
  • 2011-07-03
  • 2016-02-23
  • 2018-08-14
  • 1970-01-01
  • 2016-05-12
相关资源
最近更新 更多