Я написал функцию, которая должна произвольно выбирать 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
Мое предположение: Это списки списков (списков?), И вы просто изменяете внутренние списки, тем самым затрагивая все внешние списки, содержащие ссылки на одни и те же внутренние списки. –
У меня возникли проблемы с пониманием того, что вы говорите. Не могли бы вы перефразировать это (возможно, с меньшим количеством слов «список»)? –
Ну, вы никогда не создаете _copy_ вашего списка. У ваших «детей» все есть ссылка на один и тот же «геном», и когда вы меняете гены детей, вы также меняете гены родителей, а значит, и всех других детей. –