2017-11-12 2 views
1
population_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': 3, 
'0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,0': 5, 
'1,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0': 1} 

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) 

이러한 데이터 구조에 대한 누적 확률을 계산하려했으나, 해당 개인의 색인 생성 값의 순서를 유지해야합니다. 다른 목록에서 같은 위치.비 순차 목록의 상대 확률 누적 합계

프로그램은 순차적으로 작업을 수행하여 마지막 위치에 더 높은 가중치를 부여합니다.이 경우 가장 낮은 적합성이됩니다.

올바른 방법 (피트니스 값의 초승달 순서)으로 누적 합계를 수행하는 방법이 있다면 출력 목록에서 위치를 변경하지 않고 알 수 있습니까?

대단히 감사합니다!

+0

'적합도 값의 초승달 순서'는 무엇을 의미합니까? 그 과정을 설명해 주시겠습니까? 당신은'population_d'가 * 만든 순서를 유지할 것으로 기대하십니까 *? – wwii

+0

아마도 OrderedDict (https://docs.python.org/3/library/collections.html#collections.OrderedDict 참조)를 찾고있을 것입니다.이 항목은 사전 순으로 항목을 관리하는 사전과 같은 컨테이너입니다 그것에 추가 되었습니까? –

+0

초승달 순서에 따라 높은 체력 값과 관련된 확률에 더 많은 가중치를 추가하는 것을 의미합니다. 예, 실제 인구가 다른 목록에 있기 때문에 순서를 유지하는 것이 재미있을 것입니다. 나중에 목록 순서를 잃어 버리면 개인을 올바르게 수정하십시오. 당연히 잘못된 것일 수도 있지만, 이것이 이것이 이곡으로 만드는 방법이라고 생각합니다. – vferraz

답변

1
population_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': 3, 
       '0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,0': 5, 
       '1,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0': 1} 

사전에 피트니스 (?) 값과 고유 한 식별자가 연결되어 있습니다. 아마도 이러한 식별자는 프로그램 및 데이터 세트의 다른 곳에서 왔을 것입니다. 이 관계를 유지하기 위해 사전을 작성하는 순서에 의존하는 대신, 연관성을 유지하고 낮은 값에서 높음으로 정렬 한 후에 누적 합계 값을 갖는 새로운 사전을 작성했습니다.

import operator 
def ProbabilityList(population_d): 
    fitness = population_d.values() 
    total_fit = (sum(fitness)) 

    #create list of (individual, fitness) tuples 
    items = population_d.items() 

    #sort by fitness value 
    items = sorted(items, key = operator.itemgetter(1)) 
    #some people prefer 
    #items = sorted(items, key = lambda item: item[1]) 
    #print(items) 

    #maintain association and calculate relative fitness 
    relative_fitness = [(ind,fit/total_fit) for (ind,fit) in items] 
    #print(relative_fitness) 

    cumsum = 0 
    probabilities = {} 
    for ind, fit in relative_fitness: 
     cumsum += fit 
     probabilities[ind] = cumsum 
    return (probabilities) 

d = ProbabilityList(population_d) 
for k, v in d.items(): 
    print('key:{}, fitness:{}, cumsum:{}'.format(k, population_d[k], v)) 

>>> 
key:1,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0, fitness:1, cumsum:0.06666666666666667 
key:0,0,1,1,1,0,0,1,1,0,1,1,0,0,0,1, fitness:3, cumsum:0.26666666666666666 
key:0,1,1,0,1,1,0,0,1,1,1,0,0,1,0,0, fitness:5, cumsum:0.6 
key:0,0,1,0,1,1,0,1,1,1,1,0,0,0,0,1, fitness:6, cumsum:1.0 
>>> 

희망 사전에 당신은 당신의 코드의 다른 부분에 원래 개인에 누적 합계를 연관시킬 수있을 것입니다.


나는이 데이터 세트 및 프로젝트와 관련된 다른 질문을하고 있습니다. Pandas을 배우는 데 약간의 시간을 투자하거나 프로젝트 전체에 흩어져있는 개별 컨테이너 대신 데이터베이스에 데이터를 보관할 수도 있습니다.

+0

나는 그것이 실제로 작동해야한다고 생각한다. 고마워! 나는 팬더를 확실히 점검 할 것이다! – vferraz