2017-04-21 5 views
0

Hallo Ich arbeite am Genetischen Algorithmus. Ich frage mich, ob jemand mir mit dem Cross-Over-Schritt helfen kann.Python-bekommen eine Unterliste ohne Position zu ändern

Beispiel:

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

Ich mag eine zufällige Teilmenge in Papa holen, kann die Größe der Teilmenge auch zufällig sein. Zum Beispiel [1,2,3] oder [3,4,5] oder [2,3,4] oder [1,2] oder [4,5] oder [1,2,3,4] aber sie muss in der ursprünglichen Reihenfolge in Papa sein.

Also zum Beispiel, zufällige Teilmenge ist [2,3,4,5] Dann möchte ich meine Nachkommen sein [, 2,3,4,5 ,,]. Dann möchte ich den leeren Platz mit Mamas Liste füllen. Ich möchte die Liste von Mama wiederholen. Zuerst betrachte 2, 2 ist bereits in der Liste, also überspringe ich 2. Dann betrachte 3, 3 ist auch schon in der Liste der Nachkommen, also überspringe ich 3. Dann 6, 6 ist nicht in der Nachkommenliste, also werde ich 6 hinzufügen der erste verfügbare Platz. So ist der Nachwuchs nun [6,2,3,4,5]. Schließlich sollte offspring[6,2,3,4,5,1,7] sein

Jede Hilfe wird viel geschätzt werden! Ich denke, der schwierigste Teil, den ich brauche, ist, wie man zu diesem Schritt kommt [,2,3,4,5,,] Die Wiederholung durch die Liste der Mutter wahrscheinlich für mich machbar.

aktualisiert Code

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

Verstehe ich das richtig?Obwohl Sie Schritt für Schritt einen Algorithmus beschrieben haben, können Sie keine * einzelne Codezeile * schreiben, um die Aufgabe zu lösen. Suchen Sie das Paket ** random ** zum Generieren von Pseudozufallszahlen; das kann dir diesen ersten Schritt bringen. – Prune

+0

Frag nicht * us * wie das aussieht: frag Python. Was macht dieses Programm? (Hinweis: Sie haben einen meiner Vorschläge ausgelassen, indem Sie die Werte von Lower & Upper überprüft haben, so dass sie noch nicht voll funktionsfähig ist.) – Prune

+0

Außerdem werden wir Code mit Ein-Buchstaben-Variablennamen wahrscheinlich nicht durchlesen und prüfen. – Prune

Antwort

0

generieren zwei Zufallszahlen im Bereich len (dad) (siehe documentation für die Nutzung). Dies sind die Grenzen Ihrer zufälligen Teilmenge; rufen Sie sie unteren und oberen.

Erstellen Sie eine Kopie von Vater. Für die Unterbereiche 0: untere und obere + 1: -1 (letztes Element), ersetzen Sie das Element dad_copy mit verfügbaren Elementen Mutter, in der Reihenfolge. Sie können einen einfachen Zähler verwenden, um zu verfolgen, wo Sie in Mutter sind, voran, wenn das Element bereits in der Liste enthalten ist:

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

Ist das genug, um Sie auf die Codierung der Bühne zu bewegen?


OP CODE VERSUCH:

Es ist toll, Sie bis hierher zu sehen bekommen. Sie brauchen dafür nicht decopy, nur eine normale Vollbildkopie (siehe meine Änderung zu dieser Zeile).

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 

Ich fürchte, Sie Fokus hier verloren. Sie müssen alle Positionen außerhalb des unteren: oberen Bereichs durchlaufen. Außerdem habe ich keine Ahnung, was Sie mit i == 0; ein bare Vergleich ist nicht gut, und eine Zuordnung zu i würde Ihre Schleife verderben. Arbeiten Sie weiter durch; Das sind Fähigkeiten, die du entwickeln musst. Es sieht so aus, als ob du einige Übungen übersprungen hast, bevor du mit dieser Aufgabe angefangen hast.

+0

Vielen Dank – user02

+0

Ich denke, ich kann Papa mit Vater schneiden [unteren: oberen], aber ich bin mir nicht sicher, wie man ihre Position halten – user02

+0

Mach dir keine Mühe; Diese Scheibenverkettung war zu einfach. Kopieren Sie ** Vater **, und ändern Sie dann nur die Elemente außerhalb dieses Bereichs. Die Kopie bringt sie natürlich an den richtigen Ort. – 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

Bitte bearbeiten Sie Ihre Antwort mit einigen Erklärungen. Code-only-Antworten machen wenig aus, um zukünftige SO-Leser zu schulen. Ihre Antwort befindet sich in der Moderationswarteschlange, weil sie von geringer Qualität ist. – mickmackusa