Я просто работаю над этим проектом, в котором хочу динамически генерировать многомерное дерево решений из JSON. JSON имеет вложенные правила принятия решений, и каждое правило как узел должно быть преобразовано. Дочерние узлы представляют собой точки принятия решений. Я приведу пример ниже:
{
"rule": "A > 5",
"true": {
"rule": "B < 3",
"true": {"rule": "C==1", "true": "Leaf 1", "false": "Leaf 2"},
"false": {"rule": "D!= 4", "true": "Leaf 3", "false": "Leaf 4"}
},
"false": {
"rule": "E>= 2",
"true": {"rule": "F <6", "true": "Leaf 5", "false": "Leaf 6"},
"false": {"rule": "G==0", "true": "Leaf 7", "false": "Leaf 8"}
}
}
Цель — создать дерево решений с помощью Python. Каждый узел как экземпляр класса TreeNode. Я хочу, чтобы конкретные условия решили эту проблему.
class TreeNode:
def __init__(self, rule, truebranch, falsebranch):
self.rule = rule
self.truebranch= truebranch
self.falsebranch =falsebranch
def evaluate(self, conditions):
pass
Я ожидаю, что функция build_tree_from_json выполнит эту функцию. Я попробовал немного разобрать строки правил и управлять различными типами данных для конечных узлов дерева.
Мне нужно руководство по:
Правильный анализ операторов и значений.
Метод Evaluate должен справиться со всем этим правильно.
Обрабатывайте крайние случаи точно и без ошибок.
Пока у вас есть «фактическое» условие (или любой другой код) в вашей строке, вам не нужно использовать какое-либо форматирование. функция eval(expression, globals, locals)
может взять любую строку, представляющую код Python, и выполнить ее. например:
eval("print(3)") # output: 3
print(eval("5 >= 12")) # output: False
print(eval("A > 5", {"A": 6})) # output: True
единственное, на что вам нужно обратить внимание, это точку остановки листьев. Есть несколько способов сделать это, но я предпочитаю этот:
class TreeNode:
rule: str
truebranch: 'TreeNode'
falsebranch: 'TreeNode'
def __init__(self, data_json):
self.rule = data_json['rule']
self.truebranch = None
self.falsebranch = None
if type(data_json["true"]) is dict:
self.truebranch = TreeNode(data_json["true"])
if type(data_json["false"]) is dict:
self.falsebranch = TreeNode(data_json["false"])
def evaluate(self, conditions):
cond_result = eval(self.rule, conditions)
if cond_result:
if self.truebranch is not None:
return self.truebranch.evaluate(conditions)
else:
if self.falsebranch is not None:
return self.falsebranch.evaluate(conditions)
return cond_result
это решение предполагает, что dict имеет правильный формат и что «Leaf x» не имеет особого значения.