Есть такой код:
def sgn(x):
if x>0:
return 1
elif x<0:
return -1
else:
return 0
class Sensor:
state=0
def set(self,x):
self.state=x
class Associative:
weights=[]
teta=0
state=0
def run(self,sensors):
summ=0
for sensor in range(len(sensors)):
summ+=sensors[sensor].state*self.weights[sensor]
#print(summ,self.teta)
if summ>self.teta:
self.state=1
else:
self.state=0
class Reacting:
teta=0
def run(self,x,w):
return sgn(sum([w[i]*x[i].state for i in range(len(w))])-self.teta)
class OLRB:
weights=[]
def __init__(self,sensors,associatives):
self.sensors=[Sensor()]*sensors
self.associatives=[Associative()]*associatives
self.reacting=Reacting()
def run(self,x):
for sensor in range(len(self.sensors)):
self.sensors[sensor].set(x[sensor])
for associative in range(len(self.associatives)):
self.associatives[associative].run(self.sensors)
return self.reacting.run(self.associatives,self.weights)
Это основной код. Здесь реализуется персептрон
А вот код, который я пытаюсь использовать для инициализации его перед обучением (расставить веса S-A связей, пороги)
def EC_prepare(p):
while 1:
done=[0]*len(p.sensors)
for i in range(len(p.associatives)):
p.associatives[i].teta=random.randint(0,len(p.sensors))
p.associatives[i].weights=[]
for q in range(len(p.sensors)):
p.associatives[i].weights.append(random.randint(-1,1))
if (p.associatives[i].weights[q]!=0):
done[q]+=1
print(p.associatives[i].weights)
#эта команда выводит веса i-того ассоциативного элемента
if done.count(0)==0:
print(p.associatives[0].weights)
break
else:
print('-'*32)
p.weights=[0]*len(p.associatives)
return p
Выполняю я следующую тестовую программку:
olrb=OLRB(2,2)
olrb=EC_prepare(olrb)
Я заметил, что у ассоциативных элементов постоянно полностью совпадают все параметры (веса и порог)
Сначала я думал, что это случайность, но после 5 повторений решил все же проверить.
Проблема в функции EC_prepare, которая проводит первоначальную инициализацию персептрона. Сначала я проверяю веса сразу после их заполнения и тут все в порядке. Но когда я проверяю веса первого ассоциативного элемента уже после заполнения второго, оказывается, что у первого и у второго элемента веса совпадают. Что это за неявное копирование?