我正在使用决策树做一些工作,我正在使用AND-OR树作为表示。我正在为这种树寻找合适的存储格式。
以" t"开头的节点是一个OR节点,节点以" c"是一个(有序!)AND节点。叶子始终以" p"。
开头
最初,每个节点都包含两部分:节点名称和节点描述。
显示同一决策树的两种不同表示的图片。基本上我需要两种表示,分别是一种简单快速的解决方案,可以将表示转换为彼此。
到目前为止我的想法
数据类型:
Dict:有必要使用有序的字典。此外,存储名称和描述会更容易。
列表很好,因为订单已定义,但我不知道如何以良好的方式保存节点名称和描述。
节点链接:
基本上,可以使用这两种数据类型。但是,我不知道如何将节点相互链接。我应该使用关键字(例如" AND"和" OR")还是应该嵌套节点?
非常感谢任何意见。
1 个答案:
答案 0 :(得分:0)
< p>如果您使用列表,则可以通过嵌套将它们链接在一起。
类似于:< / p>
< pre>< code> [' t1',[' c1',' p1',[' c2',' ; p2',' p3']],[' c3',[' c4',' p4',' p5'],[' t',[' c5',' p6',' p7'],' p8& #39;]]]
< /代码>< /预>
< p>基本结构将是:< / p>
< pre>< code> BASE:= [node_name,left,right]
< /代码>< /预>
< p为H.其中:其中/ p为H.
< UL>
<李><代码> NODE_NAME< /代码>是(在此示例中)字符串和< / li>
<李><代码>左< /代码>和< code>对< / code>是
或者< code> BASE< / code> (这隐含地意味着它们是< code> c< / code>或< code> t< / code>
节点类型)或< code>节点名称< / code> (这隐含地意味着它们是叶子
节点)LT /立GT;
< / UL>
< p>没有什么能阻止您使用< code> OrderedDict< / code> s但是创建会变得更加麻烦IMO:< / p>
< pre>< code>在[26]中:从集合导入OrderedDict作为OD
在[27]中:树= OD(('名称',' t1'),('左',' c1'), ('对',OD(('名称',' ...'),))))))
在[28]:树
出[28]:
OrderedDict([(' name',' t1'),
('离开',' c1'),
('右',OrderedDict([(' name',' ...')]))])
< /代码>< /预>
< p>最后,您可以创建自己的数据结构:< / p>
< pre>< code>类节点:
type =''
左=无
对=无
< /代码>< /预>