| Paste number 5495: | intelligence.py |
| Pasted by: | AaronSw |
| When: | 7 years, 3 months ago |
| Share: | Tweet this! | http://paste.lisp.org/+48N |
| Channel: | #swhack |
| Paste contents: |
import random
from copy import copy
class Node:
def __init__(self, name):
self.m = {} # memory
self.c = 0 # counter
self.name = name
def __repr__(self): return "<Node "+str(self.name)+">"
def input(self, names):
out = []
for name in names:
if name in self.m:
out.append(self.m[name])
return sum(out)
def learn(self, names):
for name in names:
if name in self.m: self.m[name] += 1
else: self.m[name] = 1.
self.c += 1
def top(self, n):
out = []
for k in self.m.keys():
if len(out) < n:
out.append(k)
elif self.m[k] > self.m[out[0]]:
out[0] = k
out.sort(lambda x,y: cmp(self.m[x], self.m[y]))
return out
class Brain:
def __init__(self, size):
self.nodes = []
for i in range(size): self.nodes.append(Node(i))
def train(self, input):
for names in input:
self.choose(names, 1)
def choose(self, names, train=0):
max = -1
best = None
equal = True
for node in self.nodes:
r = node.input(names)
if max != -1 and r!=max: equal = False
if r > max:
max = r
best = node
if equal:
newnodes = copy(self.nodes)
newnodes.sort(lambda x,y: cmp(len(x.m.keys()), len(y.m.keys())))
newnodes[0].learn(names)
best = self.choose(names, train)
else:
best.learn(names)
return best
def related(self, names, n):
node = self.choose(names)
return node.top(n)
training = [
("eat", "kill", "hit"),
("hit", "sit", "stare"),
("stare", "strike", "sip"),
("book", "box", "mat"),
("mat", "bat", "bit"),
("bit", "kit", "kite")
]
b = Brain(2)
for i in range(1): b.train(training)
This paste has no annotations.