在遗传算法中选择 parents

Selecting parents in a Genetic Algorithm

我正在努力做到这一点,当我 运行 我的代码时,parent 数组中的 parent 只使用一次。为了排除故障,我缩短了数字。我希望我的程序从我的数组中 select 一个可能的组合。一旦选择了那个单个元素,我希望它再次无法使用。

我目前使用的代码:

#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。

我想要它做的是将随机 parent 分配给 parent 1 并将随机 non-used parent 分配给 parent 2 . 我只想使用每个 parent 一次。

我正在查看的一个主题表明我得到的是:Pair combinations of elements in dictionary without repetition

但是,他们希望在多次使用元素 0 的地方使用它。我希望它只使用一次。

您可以 select 在随机列表中定义项目,而不是 select 在有序列表中进行独特的随机组合。这样既确定了亲本的唯一性,又保证了繁殖的随机性。

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

用于解决此问题的代码是:

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

这适用于我的长度将是偶数的事实。