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을 배우는 데 약간의 시간을 투자하거나 프로젝트 전체에 흩어져있는 개별 컨테이너 대신 데이터베이스에 데이터를 보관할 수도 있습니다.
'적합도 값의 초승달 순서'는 무엇을 의미합니까? 그 과정을 설명해 주시겠습니까? 당신은'population_d'가 * 만든 순서를 유지할 것으로 기대하십니까 *? – wwii
아마도 OrderedDict (https://docs.python.org/3/library/collections.html#collections.OrderedDict 참조)를 찾고있을 것입니다.이 항목은 사전 순으로 항목을 관리하는 사전과 같은 컨테이너입니다 그것에 추가 되었습니까? –
초승달 순서에 따라 높은 체력 값과 관련된 확률에 더 많은 가중치를 추가하는 것을 의미합니다. 예, 실제 인구가 다른 목록에 있기 때문에 순서를 유지하는 것이 재미있을 것입니다. 나중에 목록 순서를 잃어 버리면 개인을 올바르게 수정하십시오. 당연히 잘못된 것일 수도 있지만, 이것이 이것이 이곡으로 만드는 방법이라고 생각합니다. – vferraz