Ich versuche, ein einfaches Programm für genetische Programmierung in Python zu programmieren. Aber jetzt bin ich bei der Crossover/Mate-Funktion für meine Bäume festgefahren. Die Bäume werden durch verschachtelte Listen erstellt und in etwa so aussehen:Wie man zwei verschachtelte Listen teilt und die Teile kombiniert, um zwei neue verschachtelte Listen zu erstellen
# f = internal node (a function), c = leaf node (a constant)
tree1 = [f, [f, [f, c, c], [f, c, c]], [f, [f, c, c], [f, c, c]]]
tree2 = [f, [f, [f, c, c], c], [f, [f, c, c], c]]
Ich möchte zufällig einen Punkt in jedem Baum wählen Sie aufzuspalten und dann möchte ich ein Teil von jedem Baum in einen neuen Baum zu kombinieren. Es gibt auch eine maximale Tiefe, die nicht überschritten werden sollte, so dass die Auswahl nicht wirklich irgendwo im Baum stattfinden kann, da dies einen zu großen Baum erzeugen könnte. Unten ist ein Beispiel dafür, wie es funktionieren soll:
# f:n, where n is the number of arguments the function take
# + split here
tree1 = [f:2, [f:3, a, a, a], a]
# + split here
tree2 = [f:2, [f:2, a, a], [f:1, a]
tree_child1 = [f:2, [f:1, a], a]
tree_child2 = [f:2, [f:2, a, a], [f:3, a, a, a]]
ich keine Ahnung (im Moment) auf, wie diese zu lösen. Irgendwelche Tipps oder Lösungen sind mehr als willkommen!
(meine Parse-Funktion hinzugefügt, wie es jemand die Struktur besser zu verstehen, könnte helfen.)
# My recursive code to parse the tree.
def parse(self, node=None):
if not node:
node = self.root
if isinstance(node, list):
function = node[0]
res = []
for child in node[1:function.arity+1]:
res.append(self.parse(child))
value = function.parse(*res) # function
else:
value = node.parse() # constant
return value
Ich würde vorschlagen, einfache Datenstruktur des Baumes mit Knoten-Objekten statt mit verschachtelten Liste, die es lesbarer wird und Sie in der Lage, mehr Buchführung Daten und Methoden in jedem Knoten zu setzen machen. –