如何强奸一棵“是/否”的树?决定?

时间:2014-09-21 18:42:25

标签: python algorithm

我想解决一个难题。但我根本不知道它需要什么样的代码。问题是指数问题。

说明

玩家一次步行/跑步。有时会做出决定;这是一个是/否的问题。一旦问题得到解答,玩家继续行走直到达到下一个决定/问题。继续这样做直到覆盖总距离。

The problem is exactly like this.

问题是我希望通过这个看到所有可能的路线(许多python列表,例如[' y',' y',' n',& #39; Y'' N'])。这是我到目前为止编写的代码:(播放器位于Player()类中,我删除了它,因为它在这里不重要。)

class Solver(object):
    """ Solver object. """

def __init__(self, field):
    self.field = field
    self.dinc = 113
    self.distance = 128

def take_step(self, player):
    """ Takes a step and records players route. """
    # Adds 0 if there is no decision to be made on this step
    # Adds 1 if there is a decision to be made on this step

    player.run(self.dinc)
    if self._is_decision_time(player):
        player.route.append((player.step_id, 1))
    else:
        player.route.append((player.step_id, 0))

def next_decision(self, player):
    """ Accepts a player object. Walks until reaches next decision. """
    while not self._is_decision_time(player):
        self.take_step(player)
    self.display_stats(player)

def say_no(self, player):
    """ Simulates a no response. Resets danger. Updates route with decision. """
    player.route[-1] = (player.step_id, 'n')
    player.danger = 0
    print 'no!'

def say_yes(self, player):
    """ Simulates a yes response. Updates route with decision. """
    player.route[-1] = (player.step_id, 'y')
    print 'yes!'

我正在寻找的解决方案是这样的:

  • 一直走到问题
  • 制作路线的副本
  • 路线A说是
  • 在路线B(副本)上说否

路线A:
重复上面的内容(这会产生另外两条路线)

路线B:
重复上面的内容(这会产生另外两条路线)

使用我到目前为止的代码,它类似于:

route_a = Player()
solver = Solver()

# walk until a battle is reached
solver.next_decision(route_a)
# make a copy of the route (there are now two routes A + route B)
route_b = copy.deepcopy(route_a)

# on route A say 'yes'
solver.say_yes(route_a)
# on route B say 'no'
solver.say_no(route_b)
# walk until the next decision is reached
solver.next_battle(route_a)
solver.next_battle(route_b)
# Then?

这个问题是指数级的,因为在每次决策时,路线分成两条路线。我需要所有的可能性;我碰巧知道只有不到512种可能性,所以计算机可以立即解决它。

每条路线都会存储在一个Player.route实例中(作为一个列表,例如:[' y',' y'' n',& #39; Y'])

我只是不知道如何以编程方式解决这样的问题。我会很感激如何构建代码来解决这样的问题。

3 个答案:

答案 0 :(得分:1)

实际上,这样的数据结构 - 二叉树 - 用于避免您提到的指数问题。或者,换句话说,假定的'y''n'列表将以指数方式增长,但通常您不需要它,因为您拥有二叉树。你知道你可以通过“是或否”的问题获得各方面的支持。

但是,如果你想打印你要求的列表,就像在这个伪代码中一样(因为我输给了C ++,我仍然无法用Python编程;-))

def recurse(node, s=''):
    if node == end_node:
        print s
        return

    recurse(node.left,  s + 'n')
    recurse(node.right, s + 'y')

然后调用从根节点或头节点开始的函数,即recurse(root_node)

答案 1 :(得分:0)

这似乎是一个相当容易的递归工作,你已经有一个非常简单的树结构。也许您应该将决策过程迁移到显式树结构中并实现节点的递归遍历?考虑到你想要做的事情,这可能是最谨慎的解决方案。我猜你正在寻找“蛮力”......但是替代的迭代解决方案会更不优雅(并且更难写)。

答案 2 :(得分:0)

一种天真的,但可能适合生成这种排列的方法是运行数字0..512,将它们转换为二进制(使用右边填充)并将零视为“不”。和#39;是'。九位足以容纳512个值,因此生成如下字符串:

'{0:0>9b}'.format(123)