-- your code goes here --//Сам нейрон local Neirons = {} Neirons.__index=Neirons local count = 0 function newNeiro(input,value,func,name) n={} n.input = input or {} n.value = value or 0 n.func = func or near n.weight = {} math.randomseed (os.clock()) for i=1,#n.input do n.weight[i]=math.random() end n.name = name or "neiro_"..count count = count+1 return setmetatable(n,Neirons) end --расчет выхода нейрона на основе функции func function Neirons:math() local t = {} if(#self.input>0) then for i=1,#self.input do t[i]={} t[i].value=self.input[i].value t[i].weight=self.weight[i] end self.value = self.func(t) end end --обновляем веса синапсов нейронов function Neirons:newWeights(d) for i=1,#self.input do self.weight[i] = (self.weight[i]+d*self.input[i].value)/2 --тут нужн как-то исправить end end --среднее значение входных параметров function near(t) local n,w = 0,0 for i=1,#t do n = t[i].value*t[i].weight+n w=w+t[i].weight end return w~=0 and n*#t/w or 0 end ---main --нейроны, 2 для установки значений, 3 - счет local first,second = newNeiro(),newNeiro() local add = newNeiro({first,second}) local arr={} for i=1,10 do arr[i]={a=0,b=0,c=0} arr[i].a = math.random(0,10) arr[i].b = math.random(0,10) arr[i].c = arr[i].a+arr[i].b*4 print(string.format("%d+%d*4=%d",arr[i].a,arr[i].b,arr[i].c)) end for i=1,100 do for l=1,#arr do first.value = arr[l].a second.value = arr[l].b add:math() local str = "Succes!!" if(math.abs(add.value-arr[l].c)>0.2) then add:newWeights(add.value-arr[l].c) str = "ERRORR!" end print(string.format("Neiro(%d,%d) %d+%d*4=%d - %s",add.weight[1],add.weight[2],arr[l].a,arr[l].b,add.value,str)) end end