Как реализовать SUS с помощью Python 3? - PullRequest
0 голосов
/ 11 февраля 2019

Я использую стохастическую универсальную выборку в генетическом алгоритме.Я нашел псевдокод этого.Я выявляю проблемы при его кодировании с использованием Python 3. Ошибка: Истинное значение Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().Может кто-нибудь мне помочь?

Псевдокод:

SUS(Population, N)
    F := total fitness of Population
    N := number of offspring to keep
    P := distance between the pointers (F/N)
    Start := random number between 0 and P
    Pointers := [Start + i*P | i in [0..(N-1)]]
    return RWS(Population,Pointers)

RWS(Population, Points)
    Keep = []
    for P in Points
        i := 0
        while fitness sum of Population[0..i] < P
            i++
        add Population[i] to Keep
    return Keep

Мой пробный код выглядит следующим образом:

def susSelection(popRanked, eliteSize):

    df = pd.DataFrame(np.array(popRanked), columns=["Index","Fitness"])
    F = df.Fitness.cumsum()
    P = F/eliteSize
    Start = np.random.uniform(0,P)
    Pointers = [Start + i*P for i in range(0,(eliteSize-1))]
    return RWS(popRanked, Pointers)

def RWS(pop, points):
    Keep = []
    for P in points:
        i = 0
        for j in (0,i):
            df = pd.DataFrame(np.array(pop), columns=["Index","Fitness"])
            sumFit = df.Fitness.cumsum()
        if sumFit< P: 
            i+=1
        else: 
            Keep.append(pop[i])
    return Keep 

1 Ответ

0 голосов
/ 13 февраля 2019

Я использовал следующий код на Python 3. Надеюсь, это поможет тем, кто выявляет те же проблемы.

def susSelection(popRanked, popSize):

    import copy
    sumFitness = np.cumsum([popRanked[i][1] for i in range(len(popRanked))])
    pointerDistance = sumFitness[len(sumFitness)-1]/popSize

    start = np.random.uniform(0, pointerDistance)

    pointers =[]
    for i in range(popSize):
        pointers.append(start + i*pointerDistance)

    cumulativeFit = 0
    newIndiv = 0
    newPop = [None] * popSize
    nPop=[]
    for i in range(len(pointers)):
        while cumulativeFit <= pointers[i]:
            cumulativeFit += popRanked[newIndiv][1]
            newIndiv += 1
        if (newIndiv>= len(popRanked)-1):
            break
        newPop[i] = copy.deepcopy(popRanked[newIndiv][0])

    for i in range(len(pointers)):
        if newPop[i]!= None:
            nPop.append(newPop[i])

    return nPop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...