-1

Я написал функцию, которая должна произвольно выбирать 2 списка из первых 9 элементов большего списка и произвольно выбирать значения из каждого списка и создавать новый список с одинаковой длиной. При тестировании на нем функция работает правильно, но когда она называется частью программы, она ничего не делает. Каждое поколение возвращает те же самые значения, что и последние. Я действительно не уверен, что здесь не так, и я буду рад вашей помощи!Попытка объединить элементы из 2 списков в 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 

Вот код, который я использовал для тестирования функции:

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]) 

Я просто понял это, и я чувствую себя невероятно глупо. Результатом кода является функция стоимости для каждой сети. Это значение стоимости выводится явно как сеть [x] [10]. Однако при вычислении функции стоимости она добавляется к концу списка, а не заменяет значение. Функция работала отлично, но поскольку стоимость добавляется вместо изменения кода, выводится статическое значение.

Scratch that. Это определенно было проблемой, но после исправления я все еще сталкивался с такой же проблемой. Вот мой обновленный код (edit: Я также создал сеть вывода функции evol() [9] в начале и конце функции, и она показывает, что веса меняются, как и должно быть. Это заставляет меня поверить в проблему либо с расчетами сетей, либо с их выходом):

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

Мое предположение: Это списки списков (списков?), И вы просто изменяете внутренние списки, тем самым затрагивая все внешние списки, содержащие ссылки на одни и те же внутренние списки. –

+0

У меня возникли проблемы с пониманием того, что вы говорите. Не могли бы вы перефразировать это (возможно, с меньшим количеством слов «список»)? –

+0

Ну, вы никогда не создаете _copy_ вашего списка. У ваших «детей» все есть ссылка на один и тот же «геном», и когда вы меняете гены детей, вы также меняете гены родителей, а значит, и всех других детей. –

ответ

0

В исходном коде было 2 очень глупых вопроса.

  1. Выход функции затрат читает сеть [х] [10], но новые значения стоимости были приложены вместо того, чтобы заменить старое значение, поэтому выход только тушить ту же переменную на петле.
  2. Циклы вычислений и затрат были установлены до конца, прежде чем они перейдут к последнему элементу в списке, поэтому, в то время как весы менялись, эти значения никогда не вычислялись и не отображались.