NetLogo A-Star 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...).