zoukankan      html  css  js  c++  java
  • NetLogo AStar path finding

    you should add a "setup" button and an "go" button on the GUI of the netlogo, like this:

    and then you paste the code here to the code tab:

    patches-own
    [
      can-reach?
      parent-node
      is-open?
      is-close?
      
      g-score
      f-score
      
      temp-g-score
    ]
    
    globals
    [
      move-space
      open-set
      close-set
      start-node
      goal-node
      
      a-stop
      b-stop
    ]
    
    to setup
      clear-all
      set a-stop 1
      set b-stop 0
      ask patches
      [
        set can-reach? true
        set is-open? false
        set is-close? false
        set parent-node -1
      ]
      ask patches
      [
        if pxcor + pycor < 40 and pxcor + pycor > -50
        [
          if pxcor = pycor
          [
            set can-reach? false
          ]
          if pxcor = pycor + 1
          [
            set can-reach? false
          ]
          if pxcor = pycor - 1
          [
            set can-reach? false
          ]
        ]
        if pxcor - pycor < 40 and pxcor - pycor > -40
        [
          if pxcor + pycor = 40
          [
            set can-reach? false
          ]
          if pxcor + pycor = 41
          [
            set can-reach? false
          ]
          if pxcor + pycor = 39
          [
            set can-reach? false
          ]
        ]
      ]
      ask patches
      [
        if-else can-reach?
        [
          set pcolor 87
        ]
        [
          set pcolor 17
        ]
      ]
      set start-node patch -40 40
      ask start-node
      [
        set is-open? true
      ]
      set goal-node patch 40 -40
      reset-ticks
    end
    
    to go
      ask patches with [is-open? = true]
      [
        set g-score 0
        set f-score g-score + sqrt(([pxcor] of self - [pxcor] of goal-node)*([pxcor] of self - [pxcor] of goal-node) + ([pycor] of self - [pycor] of goal-node)*([pycor] of self - [pycor] of goal-node))
      ]
      while [(count patches with [is-open? = true]) != 0]
      [
        set open-set patches with [is-open? = true]
        let min-f-score min [f-score] of open-set
        let current-node one-of open-set with [f-score = min-f-score]
        if current-node = goal-node
        [
          color-the-path
          stop
        ]
        ask current-node
        [
          set is-open? false
          set is-close? true
          ask neighbors
          [
            set temp-g-score [g-score] of current-node + 1.42
          ]
          ask neighbors4
          [
            set temp-g-score temp-g-score - 0.42
          ]
          ask neighbors
          [
            if can-reach?
            [
              set pcolor pcolor + -0.3
              if-else is-close?
              [
                if-else temp-g-score >= g-score
                [
                ]
                [
                  if is-open? = false or temp-g-score < g-score
                  [
                    set parent-node current-node
    ;                show word self current-node
                    set g-score temp-g-score
                    set f-score g-score + sqrt(([pxcor] of self - [pxcor] of goal-node)*([pxcor] of self - [pxcor] of goal-node) + ([pycor] of self - [pycor] of goal-node)*([pycor] of self - [pycor] of goal-node))
                    if is-open? = false
                    [
                      set is-open? true
                    ]
                  ]
                ]
              ]
              [
                if is-open? = false or temp-g-score < g-score
                [
                  set parent-node current-node
    ;              show word self current-node
                  set g-score temp-g-score
                  set f-score g-score + sqrt(([pxcor] of self - [pxcor] of goal-node)*([pxcor] of self - [pxcor] of goal-node) + ([pycor] of self - [pycor] of goal-node)*([pycor] of self - [pycor] of goal-node))
                  if is-open? = false
                  [
                    set is-open? true
                  ]
                ]
              ]
            ]
          ]
        ]
        tick
      ]
    end
    
    to get-f-score
      let h-score sqrt(([pxcor] of self - [pxcor] of goal-node)*([pxcor] of self - [pxcor] of goal-node) + ([pycor] of self - [pycor] of goal-node)*([pycor] of self - [pycor] of goal-node))
      set f-score g-score + h-score
    end
    
    to color-the-path
      let p goal-node
      while [p != -1]
      [
        ask p
        [
          set pcolor black
          set p parent-node
        ]
      ]
      show word "finded the shortest path: " [f-score] of goal-node
      tick
    end

    then you click on the "start" button and click on the "go" button, you will see a A-star path finding algorithm.

    Sorry for that there is not much comments there, and I did have no ability for increase the speed of the algorithm, then the code is ineffiency and ugly. hope for that it's useful to some body(even this is beyond the dream of myself...).

  • 相关阅读:
    php的迭代器
    memcache学习使用
    php数组操作小结
    ThinkPHP-3.2.3学习
    正则
    PHP中$_FILES的使用方法及注意事项说明
    子进程管理模块subprocess
    atexit模块解析
    GNU自动补全模块readline解析
    python命令行解析工具argparse模块【3】
  • 原文地址:https://www.cnblogs.com/henyihanwobushi/p/3021520.html
Copyright © 2011-2022 走看看