class PhenoType: def __init__(self, dna): self.dna = dna self.network = Network(3, [10, 10, 10], 3) self.network.import_weights(dna.value) self.runner = Runner() self.is_running = False self.fitness = 0 def tick_neural_network(self): data = [ self.runner.player.pos.x(), self.runner.player.pos.y(), self.runner.distance_next_obstacle() ] self.network.respond(data) outputs = [n.output for n in self.network.output_layer] if not outputs: return i = outputs.index(max(outputs)) if i == 0: return elif i == 1: self.runner.player_up() elif i == 2: self.runner.player_down() # @property # def fitness(self): # return self.runner.total_ticks_alive def start(self): self.is_running = True self.runner.reset() def tick(self): self.runner.tick() self.tick_neural_network() self.is_running = not self.runner.stopped if not self.runner.stopped: self.fitness += math.floor( (1.0 - abs(self.runner.player.pos.y()))) * 20
class NeuralNetworkDemoWidget(QtWidgets.QWidget): """ NeuralNetwork """ def __init__(self): super(NeuralNetworkDemoWidget, self).__init__() self.setWindowTitle("NeuralNetwork") self.tick_timer = QtCore.QTimer() self.tick_timer.setInterval(100) self.tick_timer.timeout.connect(self.tick) self.network = Network(5, [4, 2, 5], 4) self.network.setup() self.network_painter = NetworkPainter(self.network) self.network_painter.rect = self.rect() self.exported_weights = [] self.setCursor(QtCore.Qt.BlankCursor) w = self.network.export_weights() self.network.import_weights(w) assert w == self.network.export_weights() def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_S: self.exported_weights = self.network.export_weights() res = QtWidgets.QFileDialog.getSaveFileName(self, "Save") print(res) if res[0]: n = self.network.json() with open(res[0], 'w') as fp: json.dump(n, fp) if event.key() == QtCore.Qt.Key_H: self.network_painter.draw_output_value = not self.network_painter.draw_output_value if event.key() == QtCore.Qt.Key_L: # self.network.import_weights(self.exported_weights) res = QFileDialog.getOpenFileName(self, "Load") if res[0]: with open(res[0], 'r') as fp: data = json.load(fp) self.set_network(Network.from_json(data)) if event.key() == QtCore.Qt.Key_Space: self.give_network_random_input() self.update() def set_network(self, network): self.network = network self.network_painter.network = network self.update() def mousePressEvent(self, event): pass def mouseMoveEvent(self, event): pass def give_network_random_input(self): data = [] for i in range(len(self.network.input_layer)): v = -1 + random.random() * 2 data.append(v) self.network.respond(data) def showEvent(self, event): self.tick_timer.start() self.network_painter.rect = self.rect() self.give_network_random_input() def closeEvent(self, event): self.tick_timer.stop() def resizeEvent(self, event): self.network_painter.rect = self.rect() def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setRenderHint(QtGui.QPainter.Antialiasing, True) self.network_painter.paint(painter) def tick(self): self.update() def sizeHint(self): return QtCore.QSize(300, 300)