在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
抱歉,格式搞砸了,希望你理解我的帖子。
答案 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
现在由您的上下文来确定您用于无穷大的值等等。
只是一种不同的方法,不一定更好,并且肯定有其缺点。它的确有一个优点,如果你想要一个节点有多条路径,树就不会砍掉它。