'How to avoid negative values during the fitness calculation of a Genetic Algorithm?

The error I am getting is as follows

ValueError: probabilities are not non-negative.

when I am doing the fitness calculation, it should generate values between 0 and 1 but I am getting some negative numbers for example -0.0068109 which generates an error. How can I avoid negative numbers?

import matplotlib.pyplot as plt
import numpy as np
import math

ind_size = 10

genetic_pool = [[-1, 0, 1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

individuo = []
individuo += [np.random.choice(genetic_pool[0])]
individuo += list(np.random.choice(genetic_pool[1], ind_size - 1))


def listToDecimal(num):
    decimal = 0
    for i in range(len(num)):
        decimal += num[i] * 10 ** (-i)
    return decimal


poblacion = []
poblacion_aleatoria = []
for i in range(10):
    individuo = []
    individuo += [np.random.choice(genetic_pool[0])]
    individuo += list(np.random.choice(genetic_pool[1], ind_size - 1))
    poblacion.append(individuo)


def fx(x):
    return x * math.sin(10 * math.pi * x) + 1


y_axis = []
x_axis = np.arange(-1, 2, 0.05)

for num in x_axis:
    y_axis.append(fx(num))

for individuo in poblacion:
    x = listToDecimal(individuo)
    y = fx(x)
    print(x)

fitness = []


for individuo in poblacion:
    x = listToDecimal(individuo)
    y = fx(x)
    fitness += [y]


fitness = np.array(fitness).astype('float64')

# divido todos los valores de y para la suma total
# durante este paso se generan valores negativos
fitness = fitness / fitness.sum()

print(fitness)
print(type(fitness))

size_poblacion = len(poblacion)


offspring = []
for i in range(size_poblacion // 2):
    parents = np.random.choice(size_poblacion, 2, p=fitness)
    cross_point = np.random.randint(ind_size)
    offspring += [poblacion[parents[0]][:cross_point] + poblacion[parents[1]][cross_point:]]
    offspring += [poblacion[parents[1]][:cross_point] + poblacion[parents[0]][cross_point:]]

poblacion = offspring
for individuo in poblacion:
    x = listToDecimal(individuo)
    y = fx(x)
    plt.plot(x, y, 'x')
plt.plot(x_axis, y_axis)
plt.show()


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source