Выбор родителей в генетическом алгоритме - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сделать так, чтобы при запуске моего кода родители из массива родителей использовались только один раз. Я сократил цифры только для устранения неполадок. Я хочу, чтобы моя программа выбрала из моего массива одну возможную комбинацию. Как только этот элемент выбран, я хочу, чтобы он снова стал непригодным для использования.

Код, который я сейчас использую:

#Importing the needed functions

import pandas as pd
import math
import numpy as np
import matplotlib.pyplot as plt
import random
from itertools import permutations as permutation


#Defining my mating function where I want each parent in the parent array to be only once and not repeat. 
def mating (parents):
    parent1 = 0 
    parent2 = 0
    parent1 = permutation(parents,2)
    parent2 = permutation(parents , 2)
    print ("parent1: ", list(parent1))
    print ("parent2: ", list(parent2))

#Function used to create my 4 parents and 3 genes
def generateRandom(population , m):
   Population = np.random.rand (population,m)   
   return(Population)

# main code where I am setting returns from the functions to other vairables to call later
for i in range(2):
    candidateSolution = generateRandom(4,3)
    print ("the solutions: ", candidateSolution)
    full_population = mating(candidateSolution

Вывод, который я получаю сейчас, - это перестановка, в которой элемент 0 используется против элементов 1, 2, 3.

Что бы я хотел, чтобы это был случайный родитель, назначенный для родителя 1, и случайный неиспользуемый родитель, чтобы быть родителем 2. Я хотел бы использовать каждого родителя только один раз.

Тема, на которую я смотрел, показала, что я получаю: Пара комбинаций элементов в словаре без повторений

Однако они хотели иметь его там, где элемент 0 используется несколько раз. Я хочу, чтобы он использовался только один раз.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Код, используемый для исправления этой проблемы:

for i in range (int(len(parents)/2)):
    parent1 = parents[i]
    parent2 = parents[-i-1]
    print ("Parent1: ", parent1)
    print ("parent2: ",parent2)

Это работает для того факта, что моя длина будет четным числом.

0 голосов
/ 27 июня 2018

Вместо выбора уникальных случайных комбинаций в упорядоченном списке, вы можете выбрать определенные элементы в перетасованном списке. Таким образом, вы уверены в уникальности родителей и гарантируете случайность при разведении.

from random import shuffle
parents = [i for i in range(10)]
shuffle(parents)

n = len(parents)
couples = [(parents[i], parents[n-i-1]) for i in range(int(n/2))]

print(couples)
# an output obtained [(8, 7), (5, 2), (6, 9), (1, 0), (4, 3)]

Приспосабливаясь к вашей рутине, она превращается в:

def mating(parents):
    n = len(parents)
    parents_1 = parents[:int(n/2)]
    # a small security if n is not even
    if n == 2*int(n/2):
        parents_2 = parents[int(n/2):]
    else:
        parents_2 = parents[int(n/2):-1]
    print("parent1: ", list(parents_1))
    print("parent2: ", list(parents_2))
    return parents_1, parents_2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...