Получение ValueError при сортировке одного списка на основе другого списка - PullRequest
0 голосов
/ 03 апреля 2019

Эксперты, я пытаюсь написать код «Генетического алгоритма».Сначала я рассматриваю население в 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


Снимок экрана с ошибкой и предупреждением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...