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 RunnerDemoWidget(QtWidgets.QWidget): """ Runner """ def __init__(self): super(RunnerDemoWidget, self).__init__() self.setCursor(QtCore.Qt.BlankCursor) self.setWindowTitle("Runner") self.tick_timer = QtCore.QTimer() self.tick_timer.setInterval(10) self.tick_timer.timeout.connect(self.tick) self.runner = Runner() self.runner_painter = RunnerPainter(self.runner, self.rect()) self.network = Network(3, [10, 10, 10], 3) self.runner_ai = RunnerAI(self.network) self.runner_ai.on_training_finished = self.training_finished self.runner_ai.setup() self.network_painter = NetworkPainter(self.network) self.network_painter.rect = QRect(0, 0, self.width() / 2, self.height() / 2) self.network.setup() self.runner_trainer = RunnerTrainer(self.network, self.runner) self.genetic_algorithm = GeneticAlgorithm() self.genetic_algorithm.setup() def training_finished(self): self.network = self.runner_ai.best_neural_network def resizeEvent(self, event): r = QRect(self.width() / 2, self.height() / 2, self.width() / 2, self.height() / 2) self.runner_painter.rect = r self.network_painter.rect = QRect(0, 0, self.width() / 2, self.height() / 2) self.update() def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Enter: self.network = self.runner_ai.best_neural_network self.runner.reset() if event.key() == QtCore.Qt.Key_Space: fittest_dna = self.genetic_algorithm.get_fittest_dna() print(fittest_dna.fitness) self.network.import_weights(fittest_dna.value) # self.network.setup() self.runner.reset() # self.runner_ai.train() if event.key() == QtCore.Qt.Key_Up: self.runner.player_up() self.update() if event.key() == QtCore.Qt.Key_Down: self.runner.player_down() self.update() def showEvent(self, event): r = QRect(self.width() / 2, 0, self.width() / 2, self.height() / 2) self.runner_painter.rect = r self.tick_timer.start() def closeEvent(self, event): self.tick_timer.stop() def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setRenderHint(QtGui.QPainter.Antialiasing, True) painter.drawText(100, 100, "Fitness: {}".format(self.runner.total_ticks_alive)) self.runner_painter.paint(painter) self.network_painter.paint(painter) def tick(self): self.runner_ai.tick() self.runner_trainer.tick() self.update() self.genetic_algorithm.tick() def sizeHint(self): return QtCore.QSize(300, 300)
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)