我有一个算法,它根据到达输出节点所需的路径数量,将节点分类到不同的层中。
例如,如果有以下节点:
- 两个输入节点
- 一个隐藏节点
- 一个输出节点
它们将按此顺序显示(输入在第0层,隐藏在第1层,输出在第2层)。
for node in self.nodes: if node.nodeType != 'INPUT': inNodeIDs = [con.inNode for con in self.connections if con.outNode == node.ID] node.layer = max([node.layer for node in self.nodes if node.ID in inNodeIDs])+1
一个节点包含:ID(ID),层号(layer)和节点类型(‘HIDDEN’/’INPUT’/’OUTPUT’)
一个连接包含:输入节点(inNode,按ID引用节点)和输出节点(outNode,按ID引用节点)
我的算法获取到达该节点的所有连接列表,然后找到与其连接的具有最高层号的节点,并将当前节点的层号设置为比该节点高1,因为它比那个节点多一层。
我的算法的问题在于节点是按ID排序的,但可能会添加一个节点,其所在的层在ID更高的节点之前,因此当算法处理时,由于计算节点的顺序错误,无法正确计算。
例如,输出节点在初始化时创建,所以如果有2个输入和1个输出,它是节点2(ID从0开始显然有其原因),因此节点相对于它们的层的ID可能如下所示:
- 第0层(节点0,节点1)输入
- 第1层(节点5)隐藏
- 第2层(节点4)隐藏
- 第3层(节点3)隐藏
- 第4层(节点2)输出
https://i.sstatic.net/GfjhX.jpg(绿色=输入,灰色=隐藏,蓝色=输出)
如你所见,节点8和节点6被放置在同一层,而其中一个显然连接到另一个。
节点是通过禁用一个连接并在原连接的两个节点之间添加一个节点和两个连接来添加的
(1) (1)_ | | | | = (3) | | | |(2) (2)_|
新节点的层号是通过旧连接的输出节点的层加1计算的(输出节点的层号也增加),但当在两个现有节点之前创建一个节点时,它不会增加其层号,即在上面的例子中,节点5被添加,但节点3的层号不会被更新
有没有人能想出解决这个问题的办法,有没有逻辑上的方法可以将这种层号变化传播到整个网络中,我唯一能想到的是多次运行它以确保一切都能通过网络传播。
附注:希望这一切都有意义,提前感谢大家的帮助
回答:
尝试在每次添加新节点时调用你的算法,这应该能使网络节点分配得更均匀。如果这样做不起作用,可能代码的其他地方有错误