2017-04-21 4 views
0

こんにちは私は遺伝的アルゴリズムを研究しています。私は誰かが クロスオーバーステップで私を助けることができるかどうか疑問に思います。python-positionを変更せずにサブリストを取得

例:

dad=[1,2,3,4,5,6,7] 
mom=[2,3,6,1,7,5,4] 

私はお父さんのランダムなサブセットを選択したい、サブセットのサイズは、ランダムすることができます。例えば、[1,2,3]または[3,4,5]または[2,3,4]または[1,2]または[4,5]または[1,2,3,4]お父さんの元の順序でなければなりません。

たとえば、ランダムサブセットは[2,3,4,5] です。次に、私の子孫を[、2,3,4,5 ,,]にします。それから、私はママのリストを使って空の場所を埋めるつもりです。私はママのリストを繰り返したい。最初に2、2が既にリストに入っているので、2をスキップします。3、3も既にリストの子孫に入っているので、3をスキップします。6、6は子孫リストにないので、最初の利用可能な場所。だから子孫は今[6,2,3,4,5 ,,]です。結局、offspring[6,2,3,4,5,1,7]

すべてのヘルプははるかに高く評価されますする必要があります! 私が助けが必要な最も難しい部分は、この手順に到達する方法ですと考えています[,2,3,4,5,,] おそらく私のためにママのリストを通した繰り返しです。

更新されたコード

dad=[1,2,3,4,5,6,7] 
mom=[2,3,6,1,7,5,4] 

upper=random.randint(0,len(dad)-1) 
lower=random.randint(0,len(dad)-1) 
slice=dad[lower:upper] 
child=copy.deepcopy(dad) 

j =0 
for i in child: 
    if i not in slice: 
     child[j] = 0 
    j+=1 
n=len(child) 
h=0 
k=0 
while k <= len(child)-1: 
    if child[k] == 0: 
     if mom[h] not in slice: 
      child[k]=mom[h] 
      h+=1 
      k+=1 
     else: 
      h+=1 
    else: 
     k+=1 
+1

私はこれを正しく理解していますか?アルゴリズムの概要は一歩一歩はっきりしていますが、タスクを解決するためのコード*を1行書くことはできません。 pseduo乱数を生成するための** random **パッケージを探します。その最初のステップを得ることができます。 – Prune

+0

*私たち*はどう見ているのですか?Pythonに質問してください。このプログラムは何をしていますか? (ヒント:あなたは私の提案のうち、下位と上位の値をチェックしていないので、完全に機能していません) – Prune

+0

また、1文字の変数名でコードを読み取ったり、デスクチェックを行ったりすることはありません。 – Prune

答えて

0

範囲LEN(DAD)に2つの整数の乱数を生成します(使用のためのdocumentationを参照してください)。これらはランダムなサブセットの限界です。 と呼んでください。

お父さんのコピーを作成します。 1 +下部及び上部:サブレンジ0 -1(最後の要素)、順番にお母さんの利用可能な要素とdad_copyのその要素を置き換えます。あなたは、その要素がすでにある場合は、リストに進め、あなたがお母さんのどこにいるかを追跡するために、単純なカウンタを使用することができます。

while mom[i] in dad_copy: 
    i += 1 

がコーディング段階にあなたを移動することは十分ですか?


のOP CODEの試み:

それはあなたがここまで見るのは素晴らしいことです。 deepcopyこれには通常のフルスライスコピーが必要です(私の変更を参照)。

import random 
dad = [1,2,3,4,5,6,7] 
mom = [2,3,6,1,7,5,4] 
upper = random.randint(0,len(dad)-1) 
lower = random.randint(0,len(dad)-1) 
# Note: if lower > upper, you have to switch them. 
# If they're equal, you need to change one. 

slice = dad[lower:upper] 
child = dad[:] # Easier way to get a shallow copy 

for i in child: 
    if i not in slice: 
     i == 0 

ここでフォーカスを失ってしまいましたか?あなたは、の外側にあるの外側のすべての位置を踏む必要があります。また、あなたと何をしようとしているのかわかりません。i == 0;裸の比較はうまく行かず、iへの代入はあなたのループを台無しにするでしょう。 これを続けてください。これらはあなたが開発するために必要なスキルです。この課題を開始する前に、いくつかの演習をスキップしたようです。

+0

ありがとうございます – user02

+0

私はパパを使ってパパをスライスすることができますね[下:上]しかし、私は自分の位置を保つ方法がわかりません – user02

+0

気にしないでください。そのスライス連結はあまりにも単純でした。 ** dad **をコピーし、その範囲外の要素を変更するだけです。コピーはそれらを自然に正しい場所に置きます。 – Prune

-1
dad=[1,2,3,4,5,6,7] 
mom=[2,3,6,1,7,5,4] 
upper=random.randint(0,len(dad)-1) 
lower=random.randint(0,len(dad)-1) 
slice=dad[lower:upper] 
#Find elements from mom only 
from_mom = [e for e in mom if e not in slice] 
#Append elements from mom to the start and end of the child list. 
child = from_mom[0:lower]+slice+from_mom[lower:] 
+1

解説を編集して説明を加えてください。コードのみの回答は、今後のSO読者の教育にはほとんど役に立ちません。あなたの答えは低品質であるためにモデレーションキューにあります。 – mickmackusa

関連する問題