예제 #1
0
def fitness_xor(net: neat.Network):
    total, p = 0, 2
    total += np.power(0 - net.predict([0, 0]), p)
    total += np.power(1 - net.predict([0, 1]), p)
    total += np.power(1 - net.predict([1, 0]), p)
    total += np.power(0 - net.predict([1, 1]), p)
    total = total[0]
    return 4 - total
예제 #2
0
def fitness_car_race(net: neat.Network, render: bool=False, steps=1000): 
    score = 0

    for _ in range(3): 
        # env._max_episode_steps = steps
        obs = env.reset() 

        net.clear() 

        s = 0

        while True: 
            close = False

            if render: 
                close = not env.render()
                # print(obs) 

            obs = obs / 255.0 
            obs_in = obs[::8,::8]

            # if render: 
            #     plt.cla() 
            #     plt.imshow(obs_in[:,:,1]) 
            #     plt.pause(0.00001) 

            res = net.predict(obs_in.flatten())
            res = res * 2 - 1 
            action = res #np.argmax(res) 

            obs, reward, done, _ = env.step(action)

            s += reward

            if done or close: 
                break

        score += s 

        if render: 
            print(s) 
        
        env.close() 

        if close: 
            break 

    return score / 3
예제 #3
0
    def create_network(self, cppn: neat.Network):
        # print(cppn)

        m = None
        try:
            m = nn.Model.from_config(self.model_cfg)
        except Exception as e:
            print("Error time: {}".format(e))
            print(m)
            print(nn)
            print(nn.Model)
            print(self.model_cfg)
            import sys
            sys.exit()

        for i in range(len(m.layers)):
            layer = m.layers[i]
            # print(i, layer.output_shape)
            if isinstance(layer, nn.Dense):
                for j in range(layer.W.shape[1]):
                    # print(j, layer.W.shape[1])
                    layer.b[j] = cppn.predict([0.0, 0.0, 0.0, 0.0
                                               ])[2 * i + 0] * 20
                    for k in range(layer.W.shape[0]):
                        layer.W[k, j] = cppn.predict([
                            (k + 0.5) / layer.W.shape[0] * 2 - 1,
                            (j + 0.5) / layer.W.shape[1] * 2 - 1,
                            0.0,
                            0.0,
                        ])[2 * i + 1] * 20
                # print(layer.get_weights())
            elif isinstance(layer, nn.Conv2D):
                for i0 in range(layer.W.shape[0]):
                    for i1 in range(layer.W.shape[1]):
                        for i2 in range(layer.W.shape[2]):
                            for i3 in range(layer.W.shape[3]):
                                layer.W[i0, i1, i2, i3] = cppn.predict([
                                    (i0 + 0.5) / layer.W.shape[0] * 2 - 1,
                                    (i1 + 0.5) / layer.W.shape[1] * 2 - 1,
                                    (i2 + 0.5) / layer.W.shape[2] * 2 - 1,
                                    (i3 + 0.5) / layer.W.shape[3] * 2 - 1,
                                ])[2 * i + 1] * 20
            else:
                # raise Exception("Unknown layer type: {}".format(type(layer)))
                pass

        return m
예제 #4
0
def fitness_lander(net: neat.Network, render: bool = False, steps=1000):
    score = 0

    n = 10
    if render:
        n = 3

    for _ in range(n):
        env._max_episode_steps = steps
        obs = env.reset()

        net.clear()

        # total reward (fitness score)
        s = 0

        while True:
            close = False

            if render:
                close = not env.render()
                # print(obs)

            # determine action to take
            res = net.predict(obs)
            res = res * 2 - 1
            action = res  #np.argmax(res)

            obs, reward, done, _ = env.step(action)

            s += reward

            if done or close:
                break

        score += s

        if render:
            print(s)
            env.close()

        if close:
            break

    env.close()

    return score / n
예제 #5
0
def fitness_pong(net: neat.Network, render: bool = False, steps=1000):
    score = 0

    for _ in range(1):
        # env._max_episode_steps = steps
        obs = env.reset()

        net.clear()

        # fitness
        s = 0

        while True:
            close = False

            if render:
                close = not env.render()
                # print(obs)

            obs = obs / 256

            # determine action
            res = net.predict(obs)
            action = np.argmax(res)

            obs, reward, done, _ = env.step(action)

            s += reward

            if done or close:
                break

        score += s

        if render:
            print(s)

        env.close()

        if close:
            break

    return score
예제 #6
0
def main():
    net = Network()
    net.addLayer(LayerFactory.newInputLayer(2))
    net.addLayer(LayerFactory.newHiddenLayer(1, net.layers[0]))
    net.addLayer(LayerFactory.newOutputLayer(1, net.layers[1]))
    trainer = Trainer(net, 200)
    populationstuff = trainer.train(150, 0.005, 3)

    #from here on its just demonstrating what the best network can do after training
    #species should already be sorted by fitness, so the best one is just the first element
    trainer.network.loadDNA(populationstuff.population[0])
    inputs = []
    inputs.append(uniform(-5, 10))
    inputs.append(uniform(-10, 20))
    trainer.network.setInputs(inputs)

    result = trainer.network.run()[0]
    expectation = inputs[0] - inputs[1]

    print("Input 0: " + str(inputs[0]) + " Input 1: " + str(inputs[1]))
    print("Expected output: " + str(expectation))
    print("Actual output: " + str(result))
    print("Difference: " + str(abs(result - expectation)))
예제 #7
0
    def setup(genome, node_inno, con_inno):
        seed(1337)

        print('========== Test 1 ==========')
        genome = Genome()
        genome.add_node(Node(0, 0, NodeType.INPUT))
        genome.add_node(Node(1, 1, NodeType.OUTPUT))

        genome.add_connection(Connection(0, 0, 1, 0.5, True))

        net = Network(genome)
        input = [1.0]
        for _ in range(3):
            output = net.calculate(input)
            print(f'Output len={len(output)}, output[0]={output[0]}=0.9192')
        print()

        print('========== Test 2 ==========')
        genome = Genome()
        genome.add_node(Node(0, 0, NodeType.INPUT))
        genome.add_node(Node(1, 1, NodeType.OUTPUT))

        genome.add_connection(Connection(0, 0, 1, 0.1, True))

        net = Network(genome)
        input = [-0.5]
        for _ in range(3):
            output = net.calculate(input)
            print(f'Output len={len(output)}, output[0]={output[0]}=0.50973')
        print()

        print('========== Test 3 ==========')
        genome = Genome()
        genome.add_node(Node(0, 0, NodeType.INPUT))
        genome.add_node(Node(1, 2, NodeType.OUTPUT))
        genome.add_node(Node(2, 1, NodeType.HIDDEN))

        genome.add_connection(Connection(0, 0, 2, 0.4, True))
        genome.add_connection(Connection(1, 2, 1, 0.7, True))

        net = Network(genome)
        input = [0.9]
        for _ in range(3):
            output = net.calculate(input)
            print(f'Output len={len(output)}, output[0]={output[0]}=0.9524')
        print()

        print('========== Test 4 ==========')
        genome = Genome()
        genome.add_node(Node(0, 0, NodeType.INPUT))
        genome.add_node(Node(1, 0, NodeType.INPUT))
        genome.add_node(Node(2, 0, NodeType.INPUT))
        genome.add_node(Node(3, 2, NodeType.OUTPUT))
        genome.add_node(Node(4, 1, NodeType.HIDDEN))

        genome.add_connection(Connection(0, 0, 4, 0.4, True))
        genome.add_connection(Connection(1, 1, 4, 0.7, True))
        genome.add_connection(Connection(2, 2, 4, 0.1, True))
        genome.add_connection(Connection(3, 4, 3, 1.0, True))

        net = Network(genome)
        input = [0.5, 0.75, 0.9]
        for _ in range(3):
            output = net.calculate(input)
            print(f'Output len={len(output)}, output[0]={output[0]}=0.9924')
        print()

        print('========== Test 5 ==========')
        genome = Genome()
        genome.add_node(Node(0, 0, NodeType.INPUT))
        genome.add_node(Node(1, 0, NodeType.INPUT))
        genome.add_node(Node(2, 0, NodeType.INPUT))
        genome.add_node(Node(3, 2, NodeType.OUTPUT))
        genome.add_node(Node(4, 1, NodeType.HIDDEN))
        genome.add_node(Node(5, 1, NodeType.HIDDEN))

        genome.add_connection(Connection(0, 0, 4, 0.4, True))
        genome.add_connection(Connection(1, 1, 4, 0.7, True))
        genome.add_connection(Connection(2, 2, 4, 0.1, True))
        genome.add_connection(Connection(3, 4, 3, 1.0, True))
        genome.add_connection(Connection(4, 2, 5, 0.2, True))
        genome.add_connection(Connection(5, 5, 4, 0.75, True))
        genome.add_connection(Connection(6, 5, 3, 0.55, True))

        net = Network(genome)
        input = [1., 2., 3.]
        for _ in range(3):
            output = net.calculate(input)
            print(f'Output len={len(output)}, output[0]={output[0]}=0.99895')
        print()
예제 #8
0
# print(nets[0].dna)
# print(nets[1].dna)



max_fit = 0
curr_i = 0
for i in range(len(nets)):
	if nets[i].fitness > max_fit:
		max_fit = nets[i].fitness
		curr_i = i

data_handler.save(nets, "save")

genome = data_handler.load("save")[1]
n = Network(3, 1, False, 1, genome, False, False)

answer = n.feed_forward([0, 0, 1])[0]
print(answer)

n.fitness += abs(0 - answer)
answer = n.feed_forward([1, 0, 1])[0]

print(answer)
n.fitness += abs(1 - answer)
answer = n.feed_forward([0, 1, 1])[0]

print(answer)
n.fitness += abs(1 - answer)
answer = n.feed_forward([1, 1, 1])[0]