为每个分支创建具有权重的n元树

时间:2011-12-28 20:13:04

标签: python tree

在Python中,我想创建一个包含任意数量分支的n-ary树,其中每个分支都获得权重。这是一个例子:     节点A有三个孩子B,C,D,权重为100,-200,250;     B是叶节点;     C有两个孩子E,F,重量150,200;     E和F是叶节点;     D有两个孩子G和H,重量为-50,100;
    G和H是叶节点; 你能告诉我如何用例子构建这个。

  
    

>     谢谢机器的向往。     谢谢。看了你的例子,我认为这迫使我重新思考这个问题。我会为

分配概率,而不是分配权重   

每个子路径。如果采用该路径,则每个子节点将占用权重。 因此,如图所示,它看起来像这样,每个节点都有可能性和重量累积。

A 0 B 100 C 250 D 150 Ë F 200 G -50 H 100

A B C D E F G H

A 0 .25 .35 .4 0 0 0 0

B 0 0 0 0 0 0 0 0

C 0 0 0 0 .6 .4 0 0

D 0 0 0 0 0 0 .5 .5

E 0 0 0 0 0 0 0 0

F 0 0 0 0 0 0 0 0

我会从这样的事情开始。 类邻接:     def init (self,wt):     self.wt = wt         self.adj = []

然后我想这样做:

对于root来说,没有重量。 然后,当我递归地添加一个子项时,我想为它所采用的路径添加概率,基本上向后看向它的父项。然后将权重添加到已添加的子项。因此,当孩子成为下一个父母时,我不会增加体重,因为我在上一步中增加了体重。但对于叶子节点,我必须添加重量。 此外,我不确定多个路径是否会导致节点,但我想按照您的建议保留该选项。

我不明白下面的代码,请您解释它如何适应我解释的场景。我是Python的新手。

def add_node(self):
    for row in self.adj:
        row.append(inf)
    self.adj.append([inf] * (len(self.adj) + 1))

def set_weight(self, i, j, w):
    if i >= j:
        raise ValueError("Don't make a cycle")
    self.adj[i][j] = w

抱歉,格式搞砸了,希望你理解我的帖子。

4 个答案:

答案 0 :(得分:2)

这应该足以让你开始:

class TreeNode():
     def __init__(self,initWeight=<default>):
        self.children = List()
        self.weight = initWeight

    def addChild(self, weight):
        self.children.append(TreeNode(weight))

您只需要一份儿童名单和一个体重字段。你可以从那里得到更好的体验。在您的主程序中:

from treefile import TreeNode

if  __name__ == "__main__":
    root = TreeNode(5)
    root.addChild(100)

会制作

A(重量= 5)    | B(重量= 100)

您可以根据需要为A提供尽可能多的孩子,并通过查看子列表来获取对孩子的引用。

答案 1 :(得分:0)

我不知道你真正想要什么。而且你没有提供任何评论的代码。所以由你来详细说明。同时我可以给出一个通用“节点”类的例子。但网上确实有更好的例子。

class Node(object):
   def __init__(self):
      self.children = []
      self.weight = 0

   def add_branch(self, node):
      self.children.append(node)

   def is_branch(self):
       return len(self.children) > 0

答案 2 :(得分:0)

由于我猜你会想要使用这些树的算法,我建议你使用networkx包。

答案 3 :(得分:0)

我知道你在问题中说过你正在和树木一起工作;然而,由于你的问题相当无关紧要,我并不完全相信你知道自己想要什么。

给节点赋予权重在这个问题的上下文中是有意义的,除了在根处;但是当你试图推广模型以使用非循环有向图时,它会完全中断。您可能只在节点中有第二个列表,用于存储每个孩子的体重。

您还可以将没有循环的非循环有向图建模为三角矩阵(2-d权重列表,满足外部列表中所有索引i的属性,所有索引权重{{1无限的。)

以下是您的原始示例通过此模型得出的结果(我已将字母切换为对应于索引的数字,如A-> 0,B-> 1:

j <= i

在代码中,这就像创建邻接矩阵一样简单:

    A     B     C     D     E     F     G     H
A  inf   100  -200   250   inf   inf   inf   inf
B  inf   inf   inf   inf   inf   inf   inf   inf
C  inf   inf   inf   inf   150   200   inf   inf
D  inf   inf   inf   inf   inf   inf   -50   100
E  inf   inf   inf   inf   inf   inf   inf   inf   
F  inf   inf   inf   inf   inf   inf   inf   inf   

现在由您的上下文来确定您用于无穷大的值等等。

只是一种不同的方法,不一定更好,并且肯定有其缺点。它的确有一个优点,如果你想要一个节点有多条路径,树就不会砍掉它。