Эксперты, я пытаюсь написать код «Генетического алгоритма».Сначала я рассматриваю население в 100 человек и пытаюсь оптимизировать сферу.Размерность 10, и я пытаюсь обкатать 1000 поколений.Для того же самого я применил выбор турнира, равномерный кроссовер и случайную мутацию.Однако я получаю сообщение об ошибке, когда пытаюсь отсортировать совокупность на основе значений пригодности, а затем снова вычисляю соответствующие значения пригодности.Ошибка: «ValueError: Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()».
Кроме того, я получаю это предупреждение: «C: \ Users \ Saanika \ Anaconda3 \ lib \ site-packages \ ipykernel__main __. Py: 5: DeprecationWarning: Истинное значение пустого массива неоднозначно. Возвращает False, но в будущем это приведет к ошибке. Используйте array.size > 0
чтобы проверить, что массив не пустой. "
Я пытался найти различные другие методы для сортировки одного списка на основе другого, но везде я находил один и тот же метод.И для предупреждения я попытался обновить numpy, но это не помогло.
Случайная мутация
def random_mutation(population, population_size):
for x in range(0, population_size):
value = np.random.rand(0, 1)
if(value <= 0.001):
y = np.random.randint(0, 9)
population[x][y] = np.random.rand(-5.12, 5.12)
return population
# Uniform Crossover
def uniform_crossover(population, population_size):
population3 = []
threshold = 0.4
count = 0
for i in range(0, 99):
p1 = population[i]
j = i
while(i == j):
j = np.random.randint(0, 99)
p2 = population[j]
r = np.random.uniform(low = 0, high = 1, size = None)
if(r <= 0.8):
count = count + 1
c = []
for y in range (0, dimension):
r = np.random.uniform(low = 0, high = 1, size = None)
if(r > threshold):
c.append((p1[y] + p2[y]) / 2)
else:
c.append(p1[y])
population3.append(c)
population3.append(p1)
population3.append(p2)
return population3
# Performing tournament selection
def tournament_selection(population, population_size):
population2 = []
for i in range(population_size):
p1 = population[i]
j = i
while(i == j):
j = np.random.randint(0, 99)
p2 = population[j]
if(fitness[i] < fitness[j]):
p = p1
else:
p = p2
population2.append(p)
return population2
# Calculating fitness values and creating a fitness list
def fitness_cal(population, population_size):
fitness = []
for x in range(population_size):
value = 0
for y in range(dimension):
value = value + population[x][y] ** 2
fitness.append(value)
return fitness
import random
import numpy as np
population_size = 100
dimension = 10
population = []
for x in range(population_size):
new_population = np.random.uniform(low = -5.12, high = 5.12, size = 10)
population.append(new_population)
for generations in range(1000):
fitness = []
fitness = fitness_cal(population, population_size)
population2 = []
population2 = tournament_selection(population, population_size)
fitness2 = []
fitness2 = fitness_cal(population2, population_size)
population3 = []
population3 = uniform_crossover(population2, population_size)
population_size3 = len(population3)
fitness3 = []
fitness3 = fitness_cal(population3, population_size3)
zipped_pairs = zip(fitness3, population3)
population3 = [population3 for _, population3 in sorted(zipped_pairs)]
population3 = population3[0 : 100]
fitness3 = []
fitness3 = fitness_cal(population3, population_size)
population3 = random_mutation(population3, population_size)
population = []
population = population3
Снимок экрана с ошибкой и предупреждением.