-1

zu kombinieren Ich habe eine Funktion geschrieben, die nach dem Zufallsprinzip 2 Listen aus den ersten 9 Elemente einer größeren Liste auswählen und zufällig aus jeder Liste Werte auswählen und eine neue Liste mit der gleichen Länge erstellen soll. Wenn sie selbst getestet wird, scheint die Funktion korrekt zu funktionieren, aber wenn sie als Teil des Programms aufgerufen wird, scheint sie nichts zu tun. Jede Generation gibt genau die gleichen Werte zurück wie der letzte. Ich bin mir wirklich nicht sicher, was hier los ist und ich würde deine Hilfe lieben!Versuche, Elemente aus 2 Listen in 1

w, h = 9, 10 
network = [[0 for x in range(w)] for y in range(h)] 

def sigmoid(sigin): 
    return 1/(1 + math.exp(-sigin)) 
def netcal(x): 
    network[x].append(sigmoid((sigmoid(i1*network[x][0]+i2*network[x][1])*network[x][6])+(sigmoid(i1*network[x][2]+i2*network[x][3])*network[x][7])+(sigmoid(i1*network[x][4]+i2*network[x][5])*network[x][8]))) 
def seed(): 
    b = 0 
    while b < 10: 
     y = 0 
     while y < 9: 
      network[b][y] = random.random() 
      y += 1 
     b += 1 
def calall(): 
    c = 0 
    while c < 9: 
     netcal(c) 
     c += 1 
def cost(): 
    d = 0 
    while d < 9: 
     network[d].append(1 - network[d][9]) 
     print(network[d][10]) 
     d += 1 
def sort(): 
    network.sort(key=lambda x: x[-1]) 
#not working 
def evol(): 
    num = random.sample(range(0,10), 2) 
    evol1 = network[num[0]] 
    evol2 = network[num[1]] 
    evol3 = network[9] 
    i = 0 
    while i < 9 : 
     j = random.randrange(0,2) 
     if j == 0 : 
      evol3[i] = evol1[i] 
     else: 
      evol3[i] = evol2[i] 
     i += 1 
    network[9] = evol3 

i1=0 
i2=1 

seed() 

t = 0 
while t < 1000: 
    calall() 
    cost() 
    sort() 
    evol() 
    print('break') 
    t += 1 

Hier ist der Code, den ich verwendet, um die Funktion zu testen:

w, h = 9, 10 
network = [[0 for x in range(w)] for y in range(h)] 

def seed(): 
    b = 0 
    while b < 10: 
     y = 0 
     while y < 9: 
      network[b][y] = random.random() 
      y += 1 
     b += 1 

def sort(): 
    network.sort(key=lambda x: x[-1]) 

def evol(): 
    num = random.sample(range(0,9), 2) 
    print(num) 
    evol1 = network[num[0]] 
    evol2 = network[num[1]] 
    evol3 = network[9] 
    i = 0 
    while i < 9 : 
     j = random.randrange(0,2) 
     if j == 0 : 
      evol3[i] = evol1[i] 
     else: 
      evol3[i] = evol2[i] 
     i += 1 
    network[9] = evol3 

seed() 
sort() 
print(network[9]) 
evol() 
print(network[9]) 

Habe ich es einfach aus und ich fühle mich unglaublich dumm. Die Ausgabe aus dem Code ist die Kostenfunktion für jedes Netz. Dieser Kostenwert wird explizit als Netzwerk [x] [10] ausgegeben. Bei der Berechnung der Kostenfunktion wird sie jedoch an das Ende der Liste angehängt, anstatt den Wert zu ersetzen. Die Funktion funktionierte einwandfrei, aber da die Kosten angehängt sind, anstatt den Code zu ändern, wird ein statischer Wert ausgegeben.

Scratch das. Das war definitiv ein Problem, aber nachdem ich festgestellt habe, dass ich immer noch mit genau dem gleichen Problem konfrontiert bin. Hier ist mein aktualisierter Code (Bearbeiten: Ich habe auch das evol() - Funktionsausgabennetzwerk [9] am Anfang und am Ende der Funktion erstellt, und es zeigt, dass sich die Gewichte so ändern, wie sie sein sollten ist entweder mit der Berechnung der Netze oder deren Ausgabe):

w, h = 11, 10 
network = [[0 for x in range(w)] for y in range(h)] 

def sigmoid(sigin): 
    return 1/(1 + math.exp(-sigin)) 
def netcal(x): 
    network[x][9] = (sigmoid((sigmoid(i1*network[x][0]+i2*network[x][1])*network[x][6])+(sigmoid(i1*network[x][2]+i2*network[x][3])*network[x][7])+(sigmoid(i1*network[x][4]+i2*network[x][5])*network[x][8]))) 
def seed(): 
    b = 0 
    while b < 10: 
     y = 0 
     while y < 9: 
      network[b][y] = random.random() 
      y += 1 
     b += 1 
def calall(): 
    c = 0 
    while c < 9: 
     netcal(c) 
     c += 1 
def cost(): 
    d = 0 
    while d < 9: 
     network[d][10] = (1 - network[d][9]) 
     print(network[d][10]) 
     d += 1 
def sort(): 
    network.sort(key=lambda x: x[-1]) 
#not working 
def evol(): 
    num = random.sample(range(0,9), 2) 
    evol1 = network[num[0]] 
    evol2 = network[num[1]] 
    evol3 = network[9] 
    print('before', network[9]) 
    i = 0 
    while i < 9 : 
     j = random.randrange(0,2) 
     if j == 0 : 
      evol3[i] = evol1[i] 
     else: 
      evol3[i] = evol2[i] 
     i += 1 
    network[9] = evol3 
    print('after', network[9]) 
i1=0 
i2=1 

seed() 


t = 0 
while t < 10: 
    calall() 
    cost() 
    sort() 
    evol() 
    print('break') 
    t += 1 
+0

Meine Vermutung: Das sind Listen von Listen (von Listen?) Und Sie ändern nur die inneren Listen und damit alle äußeren Listen, die Verweise auf die gleichen inneren Listen enthalten. –

+0

Ich habe Probleme zu verstehen, was Sie sagen. Könnten Sie das anders formulieren (vielleicht mit weniger Vorkommen des Wortes "Liste")? –

+0

Nun, Sie erstellen nie eine Kopie Ihrer Liste. Ihre "Kinder" haben alle einen Bezug zum selben "Genom", und wenn Sie die Gene der Kinder verändern, verändern Sie auch die Gene der Eltern und damit auch aller anderen Kinder. –

Antwort

0

Es gab 2 sehr dumme Probleme im ursprünglichen Code.

  1. Die Ausgabe der Kostenfunktion liest Netzwerk [x] [10], aber neue Kostenwerte wurden eher angehängt als der alten Wert ersetzt, so wurde die Ausgabe auf einer Schleife die gleiche Variable Putting out nur.
  2. Die Rechen- und Kostenschleifen wurden beide auf Ende gesetzt, bevor sie zum letzten Element in der Liste gelangen, also wurden die Werte während der Änderung der Gewichte weder berechnet noch angezeigt.
Verwandte Themen