【问题标题】:Creating n-ary tree with weights for each branch为每个分支创建具有权重的 n 叉树
【发布时间】:2011-12-28 20:13:04
【问题描述】:

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

> 谢谢机器向往。 谢谢你。看了你的例子后,我认为它迫使我重新思考这个问题。我不会分配权重,而是分配概率

每个子路径。如果每个子节点走这条路,它就会增加权重。 所以从形象上看,它看起来像这样,每个节点都有概率和权重。

一个 0 乙 100 C 250 D 150 乙 F 200 克 -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.adj = []

那我想这样做:

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

我不明白下面的代码,请您解释一下它将如何工作以适应我解释的场景。我是 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

对不起,格式搞砸了,希望你能理解我的帖子。

【问题讨论】:

  • 给每个节点一个权重怎么样?

标签: python tree


【解决方案1】:

这应该足以让您开始:

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 任意数量的孩子,并通过查看孩子列表来获取对孩子的引用。

【讨论】:

    【解决方案2】:

    我不知道你真正想要什么。而且你没有提供任何代码来评论。因此,由您来详细说明。同时,我可以举一个通用“节点”类的例子。但是网上肯定有更好的例子。

    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
    

    【讨论】:

      【解决方案3】:

      因为我猜你会想要对这些树使用算法,所以我建议你使用 networkx 包。

      【讨论】:

      • 我想创建一个带有树的网页,并且我希望能够为每个节点分配值和编辑。我可以使用 networkx pkg 执行此操作吗?
      • 当然!阅读networkx.lanl.gov/tutorial/tutorial.html的优秀教程
      • 如果你觉得我的回答有用,请投赞成票...我刚开始使用stackoverflow,我的声誉很差;)
      【解决方案4】:

      我知道您在问题中说过您正在处理树木;但是,由于您的问题与上下文无关,因此我并不完全相信您知道自己想要什么。

      在这个问题的上下文中,给节点一个权重是有意义的,除了在根节点;但是,当您尝试将模型泛化为使用无环有向图时,它会完全崩溃。您的节点中可能只有第二个列表,用于存储每个孩子的权重。

      您还可以将没有循环的非循环有向图建模为三角矩阵(权重的二维列表,满足外部列表中所有索引i 的属性,所有索引j &lt;= i 的权重都是无限的)。

      这是您的原始示例通过此模型产生的结果(我已将字母切换为与 A->0、B->1 等索引相对应的数字:

          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   
      

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

      class Adjacency:
          def __init__(self):
              self.adj = []
      
          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
      

      现在取决于您的上下文来确定您使用什么值来表示无穷等。

      只是一种不同的方法,不一定更好,而且肯定有其缺点。它确实有一个优点,如果您希望有多个路径到一个节点,一棵树不会切割它。

      【讨论】:

      • 谢谢。我正在改写我的问题,你可以吗?回应。
      • 我不明白 add_node 是如何工作的,你能请。解释?另外,鉴于您的回答,我重新表述了我的问题,您能提出建议吗?
      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多