在遗传算法中选择 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)
这适用于我的长度将是偶数的事实。
我正在努力做到这一点,当我 运行 我的代码时,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)
这适用于我的长度将是偶数的事实。