2016-11-22 2 views
0

出力ノードに到達するまでの経路数に基づいてノードをレイヤーにソートするアルゴリズムがあります。例えばだからレイヤ数計算アルゴリズム

があった場合:彼らはその順序で表示される

  • 2つの入力
  • 1つの隠れたノードをノード
  • 一方の出力

(層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 

Aノードが含まれていますID(ID)は、layerNumber(層)とのnodeType( 'HIDDEN'/'INPUT'/'OUTPUT')

が接続含ま:ノードを指すinNodeを( (IDでノードを参照する)

私のアルゴリズムは、そのノードに着信する接続のリストを取得し、次に最も高いlayerNumberで接続されているノードを見つけて現在の値を設定しますノードのレイヤ番号は、そのノードよりも1レイヤ低いので、1になります。

私のアルゴリズムの問​​題は、ノードがそこでID順に並べられているが、より高いIDを持つノードの前のレイヤにあるノードを追加できるため、アルゴリズムが通過するときに、ノードを間違った順番に並べ替えます。

    :出力ノードは2イン1つのアウトがあるので、もしそれがそう彼らの層に各ノードのIDは次のようになりますノード2(明白な理由のために0でIDの開始) で初期化時に作成されます
  • レイヤ0(ノード0、ノード1)入力
  • レイヤ1(NODE5)隠さ
  • レイヤ2(ノード4)隠さ
  • レイヤ3(ノード3)隠れ
  • レイヤ4(ノード2)出力
あなたが見ることができるように

http://imgur.com/a/C0Zc1 (緑=入力、グレー=隠された、青=出力)

一つは明らか別

ノードがによって追加されるに接続されている場合と同じ層に配置されたノード8,6接続を無効にし、ノードを追加し、元の接続が

(1) (1)_ 
|  | | 
| = (3) | 
|  | | 
(2) (2)_| 

そしてlayerNumが算出される新たなノードが古い接続アウトノード層+ 1(layerNumはoutnodesによるものであるように接続された2つのノード間で2つの接続また増加した)しかし、 deは既存の2つのノードの前に作成されます。layerNumは増加しません。上記の例では、ノード5は追加されましたが、ノード3のlayerNumは更新されませんでした。

誰でもこの問題を解決する方法を考えることができますネットワークを介してこのレイヤーを変更することはできません。私が考えることができるのは、ネットワークを介してすべてが確実に伝播することを複数回実行していたことだけです。私は、これはすべて理にかなっていると人々への感謝は、あなたのアルゴリズムは、新しいノードを追加するたびに呼び出してみ事前に

答えて

1

を助ける願ってい

P.Sが、これはそれが均等にネットワーク・ノードをアップdivyすべきです。これはおそらくコード内にどこにもエラーがない場合にはうまくいくはずです

+0

ありがとう!これは働いた – Padskiiz

関連する問題