def mutateAddNode(self): newNode = THGene.THNodeGene(0, "Hidden", False, False) connIndex = random.randint(0, self.numConns - 1) existingConn = self.connGenes[connIndex] self.connGenes[connIndex].disable() #disable existing conn # add new incoming nodes #newNode.incoming.append(self.connGenes[connIndex].input) #self.connGenes[connIndex].output.incoming.append(newNode) self.addNodeGene(newNode) #append the newNodeGene print("MUTATE LOCALID BELOW") print(newNode.localID) # create 2 new ConnGenes newInputConn = THGene.THConnGene(existingConn.input, newNode, existingConn.weight, True) newOutputConn = THGene.THConnGene(newNode, existingConn.output, 1, True) self.addConnGene(newInputConn) self.addConnGene(newOutputConn) self.fitness = 0
def mutateAddConn(self): validINodes = [] validONodes = [] for i in range(0, self.numNodes): if (self.nodeGenes[i].isInput == True or (self.nodeGenes[i].isInput == False and self.nodeGenes[i].isOutput == False)): validINodes.append(self.nodeGenes[i]) if (self.nodeGenes[i].isOutput == True or (self.nodeGenes[i].isInput == False and self.nodeGenes[i].isOutput == False)): validONodes.append(self.nodeGenes[i]) iIndex = random.randint(0, len(validINodes) - 1) oIndex = random.randint(0, len(validONodes) - 1) if (validONodes[oIndex].localID == validINodes[iIndex].localID and oIndex != len(validONodes) - 1): oIndex += 1 elif (validONodes[oIndex].localID == validINodes[iIndex].localID and oIndex != 0): oIndex -= 1 newConn = THGene.THConnGene(validINodes[iIndex], validONodes[oIndex], 1, True) #validONodes[oIndex].incoming.append(validINodes[iIndex]) if (self.containsConn(newConn) == False): self.addConnGene(newConn) self.fitness = 0
def generateNodes(width, length): #nodes = [] right = THGene.THNodeGene(0, "right", False, True) #nodes.append(right) NNDatabase.outputs.append(right) left = THGene.THNodeGene(1, "left", False, True) #nodes.append(left) NNDatabase.outputs.append(left) up = THGene.THNodeGene(2, "up", False, True) #nodes.append(up) NNDatabase.outputs.append(up) down = THGene.THNodeGene(3, "down", False, True) #nodes.append(down) NNDatabase.outputs.append(down) none = THGene.THNodeGene(4, "idle", False, True) NNDatabase.outputs.append(none) # from [0][0] to [83][97] for i in range(0, width): lNodes = [] for j in range(0, length): newGene = THGene.THNodeGene(i, "input", True, False) newGene.screenPosX = i newGene.screenPosY = j lNodes.append(newGene) #nodes.append(newGene) #print(len(lNodes)) NNDatabase.inputs.append(lNodes)
def generateConns(count): conns = [] #""" Create a global variable to store innovationID and nodes before any further progress can be made on this""" for i in range(0, count): node1 = random.randint(0, NNDatabase.numNodeGenes) node2 = random.randint(0, NNDatabase.numNodeGenes) if node1 > node2 or node1 == node2: i -= 1 continue newConn = THGene.THConnGene(NNDatabase.nodeGenes[node1], NNDatabase.nodeGenes[node2], 1, True) #NNDatabase.innovationID += 1 conns.append(newConn)
from Controller import Controller from NEATAlgorithm import GeneratePopulation from NEATAlgorithm import THNetwork from NEATAlgorithm import THGene from NNData import NNDatabase GeneratePopulation.generateNodes(84, 98) testNetwork = THNetwork.THNetwork(0, 0) #create nodes input1 = NNDatabase.inputs[10][35] input2 = NNDatabase.inputs[53][65] input3 = NNDatabase.inputs[61][45] hidden1 = THGene.THNodeGene(0, "hidden", False, False) output1 = NNDatabase.outputs[3] output2 = NNDatabase.outputs[0] #add nodes testNetwork.addNodeGene(input1) testNetwork.addNodeGene(input2) testNetwork.addNodeGene(input3) testNetwork.addNodeGene(output1) testNetwork.addNodeGene(hidden1) testNetwork.addNodeGene(output2) #create conns conn1 = THGene.THConnGene(testNetwork.nodeGenes[0], testNetwork.nodeGenes[3], 0.7, True)