2017-11-12 14 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