如何使用python3实现SUS?

2024-05-15 01:36:34 发布

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

我在遗传算法中使用随机通用抽样。我找到了它的伪代码。在使用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

我的审判代码如下:

^{pr2}$

Tags: ofto代码innumberreturnbetweenstart
2条回答

我使用python3使用了以下代码。我希望它能帮助暴露同样问题的人。在

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

这是我的实现,可能会有帮助!在

def make_pointer (pop,n):# n=number of offspring to keep , pop should be sorted !
    F=sum(i.fitness for i in pop) #total fitness of population 
    P=F/n# distance between the pointers 
    start = np.random.random()
    pointers= [start+i*P for i in range(n)]
    return pointers
def select_parents_sus(pop,n ):
    Points=make_pointer (pop,n)
    keep=[]
    for P in Points:
        i=0
        while sum(pop[j].fitness for  j in range(i+1))<P:
            i+=1
        keep.append(pop[i])
    return keep
init_pop=make_init_pop(items,num_of_pop=100)
init_pop = sorted(init_pop, key=operator.attrgetter('fitness'))# note : after each generation you should sort the population by fitness

相关问题 更多 >

    热门问题