Python 非有序适应值的轮盘赌轮选择

Python 非有序适应值的轮盘赌轮选择,python,python-3.x,selection,genetic-algorithm,Python,Python 3.x,Selection,Genetic Algorithm,我需要对遗传算法采用适合度比例选择方法,但是我的种群不能放松结构顺序,在这种情况下,在生成概率的同时,我相信个体得到了错误的权重,程序是: population=[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [6], [0]], [[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [4], [1]], [[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1

我需要对遗传算法采用适合度比例选择方法,但是我的种群不能放松结构顺序,在这种情况下,在生成概率的同时,我相信个体得到了错误的权重,程序是:

population=[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [6], [0]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [4], [1]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [6], [2]],
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [4], [3]]]

popultion_d={'0,0,1,0,1,1,0,1,1,1,1,0,0,0,0,1': 6, 
'0,0,1,1,1,0,0,1,1,0,1,1,0,0,0,1': 4, 
'0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,0': 6, 
'1,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0': 4}

def ProbabilityList(population_d):
    fitness = population_d.values()
    total_fit = (sum(fitness))
    relative_fitness = [f/total_fit for f in fitness]
    probabilities = [sum(relative_fitness[:i+1]) for i in range(len(relative_fitness))]
    return (probabilities)

def FitnessProportionateSelection(population, probabilities, number):
    chosen = []
    for n in range(number):
        r = random.random()
        for (i, individual) in enumerate(population):
            if r <= probabilities[i]:
                chosen.append(list(individual))
                break
    return chosen

number=2
但是我得到了这个错误:TypeError:choices从2到3个位置参数中选择,但给出了4个

谢谢大家!

使用随机选择当然是个好主意。您只需要理解函数调用。你必须说明你的概率是边际概率还是累积概率。所以你可以用任何一个

import random

def ProbabilityList(population_d):
    fitness = population_d.values()
    total_fit = sum(fitness)
    relative_fitness = [f/total_fit for f in fitness]
    return relative_fitness

def FitnessChoices(population, relative_fitness, number):
    return random.choices(population, weights = relative_fitness, k = number)


我建议您看看python中关键字参数和位置参数之间的区别。

我能问您一个问题吗?如果我决定使用cumultaed权重,在这种情况下,我的cum_probs公式是错误的,对吗?它看起来是正确的,但你也可以简单地使用numpy.cumsum。我想如果我只使用累积和,无序,它会将上一个值添加到下一个值,使较低的适应度得到较高的权重,或者我对函数的工作原理搞错了?想象一下轮盘赌。分数的顺序有关系吗?
import random

def ProbabilityList(population_d):
    fitness = population_d.values()
    total_fit = sum(fitness)
    relative_fitness = [f/total_fit for f in fitness]
    return relative_fitness

def FitnessChoices(population, relative_fitness, number):
    return random.choices(population, weights = relative_fitness, k = number)
import random

def ProbabilityList(population_d):
    fitness = population_d.values()
    total_fit = sum(fitness)
    relative_fitness = [f/total_fit for f in fitness]
    cum_probs = [sum(relative_fitness[:i+1]) for i in range(len(relative_fitness))]
    return cum_probs

def FitnessChoices(population, cum_probs, number):
    return random.choices(population, cum_weights = cum_probs, k = number)