给定图上的最佳路径

时间:2014-03-01 20:01:43

标签: netlogo

我正在研究netLogo中的一个项目,其中我有一个随机网络,其中每个链路都分配了一个带宽。算法自己选择一个随机的源和目的地,之后它必须选择这两者之间的最佳路径。

我的问题是如何通过探索所有可能的路径来选择最佳路径。

特此附上我的模型的源代码:

    breed[nodes node]
    breed[ants ant ]

    globals [nodename nodenumbersource nodenumberdestination relaynode dead-network num        ]
    nodes-own[visited ]
    links-own[visit bandwidth]



    ants-own 
    [
    distance-gone
    distance-to-go
    target-node
    current-node
    ]




     to cr11
     ask  nodes with [label = "Source"]
     [
     set num  count (link-neighbors)
     ]
     create-ants num ;num-ants 
     [

     let n one-of nodes with [label = "Source"]

     setxy ([xcor] of n)  ([ycor]of n)
     set current-node n
     set color white set size 0.95
     set distance-gone 0
     set distance-to-go 0
     set target-node one-of nodes with [ label = "Relay Node" ] ;nobody
     ]
     end

     to face-targets
     ask ants ;with [ target-node]; = node 4 ]    ;nobody ]
     [

     let d 0

     face (one-of nodes with [ label = "Relay Node" ]);target-node
      ask current-node [
        set d distance  (one-of nodes with [ label = "Relay Node" ]);target-node)

      ] 
      set distance-to-go d

      ]
      end

      to move-forward
      face-targets 

      ask ants [
       while [  distance-gone < (distance-to-go  )]
      [


       fd  1
       set distance-gone (distance-gone + 1)
       ]
      ]
        ask ants [
           if distance-gone < distance-to-go

           [
            set current-node target-node 
            setxy ([xcor] of current-node) ([ycor] of current-node)
            set distance-gone 0
            set distance-to-go 0

            ]
           ]
            end





                ;This is used to design the Network
               to setup
                setup1
                 setup-spatially-clustered-network
                 ask links [set color white
                 set visit false
                 set bandwidth (5 + random 10) ;min bw 5 max 15
                ] 


                end



             to setup1

            __clear-all-and-reset-ticks
            set dead-network 0
            create-nodes number-of-nodes
               [

                 setxy (random-xcor   * 0.95) (random-ycor * 0.95)
                 set shape "circle"
                 set color green
                 set visited false
                 set label who
               ]


             end

             ;Links are created for the  nodes
             to setup-spatially-clustered-network
             let num-links (6 * number-of-nodes) / 2 

             while [count links < num-links ]
             [
               ask one-of turtles
              [
               let choice (min-one-of (other turtles with [not link-neighbor? myself])
              [distance myself])
           if choice != nobody [ create-link-with choice

         ]
        ]
       ]

       repeat 10
       [ 
         layout-spring turtles links 0.3 (world-width / (sqrt number-of-nodes)) 1
       ]  
        end

       ;This is to Generate Message for nodes
       to test1
       ask one-of nodes
       [
        set color red 
         set label "Source"
         set nodenumbersource who


        ]
          ask one-of nodes with [color = green]
         [
          set color red
          set label "Destination"
          set nodenumberdestination who


          ]

        cr11


        end



        to test3




        ask turtles with [label = "Source"]
      [
      set label "ants moving"

       ask my-links 
      [
         set color green
       ]


           ask link-neighbors
        [
          set color blue

         ]




            ask min-one-of turtles with [color = blue and my-links] [distance turtle   nodenumberdestination ] 
           [
           ask max-one-of my-links [bandwidth ]
           [


             set color red 
            ]
           set color white
           set relaynode who
           set label "Relay Node"
            ]



            ; face-targets 
            move-forward
          end

     to test4


      ask turtle nodenumberdestination 
       [
       while [color != white]
       [


        ask turtle relaynode
        [
        set label "" 

         ask my-links
         [
          set color green
          ]
         ask link-neighbors
        [


      set color yellow
        ]
        ]

       ask turtles with [color = yellow] 

       [
        set color violet
        ]

         ask turtles with [color = violet] with [visited = false]
         [
         set color magenta
         ]
         ask min-one-of turtles with [color = magenta] [distance turtle nodenumberdestination] 
         [  
          set color white
         set relaynode who
         set label "Relay Node" 
         set visited true
        ]
         move-forward

          ]
       ]








      end

      to test6
      ask nodes ; turtles
      [
       set color green
       set visited false
       set label ""
       ]
      ask links
       [
       set color white
       set visit false
        ]
      end


      to test5

      test1
      test3
      test4


     end

1 个答案:

答案 0 :(得分:3)

你可以使用NW-Extension!只需download it并将其粘贴在NetLogo的扩展文件夹中。然后,在您的模型中,您可以通过添加

开始使用

extensions [ nw ]

到代码的顶部。然后你可以使用其中一个weighted-path-to基元来获取两个节点之间最短路径上的海龟或链接。

请注意,nw扩展正在积极开发中,尽管它已经过充分测试。您还必须使用最新版本的NetLogo。

如果你想自己实现它,Dijkstra's algorithm是经典的解决方案,如果你的图中有非负权重。