如何使用轮盘赌选择父母?

2024-04-18 21:09:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个遗传算法来解决旅行商问题(TSP)。你知道吗

我有两个班,城市和健身。你知道吗

我已经完成了初始化的代码。你知道吗

class City:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def distance(self, city):
        xDis = abs(self.x - city.x)
        yDis = abs(self.y - city.y)
        distance = np.sqrt((xDis ** 2) + (yDis ** 2))
        return distance

    def __repr__(self):
        return "(" + str(self.x) + "," + str(self.y) + ")"

class Fitness:
    def __init__(self, route):
        self.route = route
        self.distance = None
        self.fitness = None

    def routeDistance(self):
        if self.distance == None:
            pathDistance = 0.0
            for i in range(0, len(self.route)):
                fromCity = self.route[i]
                toCity = None
                if i+1 < len(self.route):
                    toCity = self.route[i+1]
                else:
                    toCity = self.route[0]
                pathDistance += fromCity.distance(toCity)
            self.distance = pathDistance
        return self.distance

    def routeFitness(self):
        if self.fitness == None:
            self.fitness = 1 / float(self.routeDistance())
        return self.fitness


def selection(population, size=None):

    if size== None:
        size= len(population)

    matingPool = []

    fitnessResults = {}
    for i in range(0, size):
        fitnessResults[i] = Fitness(population[i]).routeFitness()
        matingPool.append(random.choice(population))

    return matingPool

上面的代码只是在选择方法中随机选择一个父对象。你知道吗

我的问题是:如何代码选择父母使用轮盘赌轮子?你知道吗


Tags: 代码selfnonecitysizelenreturnif
2条回答

你可以试试这个 [12]

from numpy.random import choice

def selection(population, size=None):

    if size== None:
        size= len(population)

    fitnessResults = []
    for i in range(0, size):
        fitnessResults.append(Fitness(population[i]).routeFitness())

    sum_fitness = sum(fitnessResults)
    probability_lst = [f/sum_fitness for f in fitnessResults]

    matingPool = choice(population, size=size, p=probability_lst)

    return matingPool

this

所以基本上,一个适应值越高,它被选择的机会就越大。但此时,高健身价值意味着高健身。但是在TSP中,适应度值越低越好,所以要实现这一点,我们需要实现概率与适应度值间接成正比的概念。你知道吗

下面是我用python实现的一些东西,做了一些修改

def choose_parent_using_RWS(genes, S):
    P = random.uniform(0, S)
    for x in genes:
        P += get_fitness_value(x)
        if P > S:
            return x
    return genes[-1]

其中S是当前总体适应值的倒数之和(即,1/f1+1/f2+1/f3+…)

以及

get\u fitness\u value(x)返回距离的倒数,就像routeFitness()函数一样

TeeHee

相关问题 更多 >