示例#1
0
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
示例#2
0
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)
示例#3
0
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)