`注释写的蛮清楚的了。先构造拓扑序列,然后根据拓扑序列遍历结点,更新子节点的状态。
from collections import deque
class Neuron():
#初始化的时候全部减去阈值,如果是输入层再单独加上阈值
def __init__(self, status, thre):
self._status = status - thre
self.thre = thre
self._edges=[9999 for i in range(0, n+1)]
self._inDegree=0
def inverThre(self):
self._status+=self.thre
def setEdge(self, en, weight):self.edges[en]=weight
@property
def edges(self, val):return 0
@edges.getter
def edges(self):return self._edges
@property
def inDegree(self, val):self._inDegree = val
@inDegree.setter
def inDegree(self, val):self._inDegree = val
@inDegree.getter
def inDegree(self):return self._inDegree
@property
def status(self, val):self._status = val
@status.setter
def status(self, val):self._status = val
@status.getter
def status(self):return self._status
#拓扑排序,返回拓扑序列
def topo(neus):
d = deque()
topoRes = []
#入度为0的初始节点
for i, neu in enumerate(neus[1:]):
if not neu.inDegree:
d.append(i+1)
neu.inverThre()
#拓扑排序
while d:
curid = d.popleft()
cur = neus[curid]
topoRes.append(curid)
for i, item in enumerate(cur.edges):
if not i or item == 9999:continue
neus[i].inDegree-=1
if not neus[i].inDegree:d.append(i)
return topoRes
#测试是否为输出层 是 返回 true 否 返回 false
def out(neu):
return True if neu.edges.count(9999) == len(neu.edges) else False
# 计算神经网络
def network(neus, orders):
#根据拓扑顺序,逐点推导其子节点的状态
for node in orders:
neu = neus[node]
for i, weig in enumerate(neu.edges):
#仅当status>0时才向下传递信号
if not i or weig==9999 or neu.status<=0:continue
neus[i].status+=weig*neu.status
#结果输出
res = []
for i, neu in enumerate(neus):
if not i or not out(neu):continue
elif neu.status>0:res.append([i,neu.status])
if not res:
print("NULL")
return
for item in res:print(str(item[0])+ " " + str(item[1]))
if __name__=='__main__':
#输入并构建图
global n
n, p=map(int,input().split())
neus=[0 for i in range(n+1)]
for i in range(1, n+1):
status, thre = map(int, input().split())
neus[i]=Neuron(status, thre)
for i in range(0, p):
st,en,weight=map(int, input().split())
neus[st].setEdge(en, weight)
neus[en].inDegree+=1
network(neus, topo(neus))
``