📄 ---abtkernel.nlogo
字号:
; ABTkernel for the n-queens problem; by Ionel Muscalagiu - mionel@fih.utt.ro ;breeds [queens]globals [no-more-messages tmp nr_cicluri gata];rows, and cols go from [0..num-queens-1];;message-queue contains the incoming messages. We take new ones out from the head.;col is the position of the queen on it's row.;current-view is a list indexed by queen number [col0 col1 col2...] col = -1 if unknown.;nogoods is a list of inconsistent positions [0 1 1 0 ... ] where 0 is good and 1 is no-good.;messages-recieved is the number of messages this queen has received.queens-own [message-queue MyValue_col current-view nogoods messages-received_ok messages-received_nogood nr_constraintcAgentC_Cost parent parent-agent children consistent ]to ComputeParent_Childrenlocals [i]set Children []set i who + 1 while [i < num-queens] [ set Children lput i Children set i i + 1 ]set Parent []set i 0 while [i < who] [ set Parent lput i Parent set i i + 1 ]endto setup-patches ask patches with [(abs (pxcor + pycor)) mod 2 = 0 and pxcor < num-queens - screen-edge-x and pycor > screen-edge-y - num-queens] [ set pcolor 8] end; n is length of list; el is the elementto-report get-list [n el] locals [i lst] set i 0 set lst [] while [i < n] [ set lst fput el lst set i i + 1] report lstendto setup-queens set nr_cicluri 0 create-custom-queens num-queens [ set MyValue_col 0 ;initial value is 0 for all. setxy (MyValue_col - screen-edge-x) (screen-edge-y - who) ;set color red set heading 0 set messages-received_ok 0 set messages-received_nogood 0 set nr_constraintc 0 set AgentC_Cost 0 set current-view get-list num-queens -1 set nogoods get-list num-queens 0 set message-queue [] set-current-plot "Messages" create-temporary-plot-pen "q" + who set-current-plot-pen "q" + who set-plot-pen-color color ]endto setup ca setup-patches setup-queens set gata false ask queens [ComputeParent_Children initialize ]endto update set no-more-messages true set nr_cicluri nr_cicluri + 1 if (nr_cicluri > Max_cycle) [Stop] ask queens [ if (not empty? message-queue)[ set no-more-messages false ] ] if (no-more-messages) [ ask queens [show MyValue_col] stop] ask queens [ handle-message ] if (gata) [ show "no solution" stop] ask queens [ set-current-plot "Messages" create-temporary-plot-pen "q" + who plot messages-received_nogood ;plot messages-received_ok ] if (show-trace)[ print "==============" ask queens [ show "view=" + current-view show "nogood=" + nogoods]]endto receive-message [msg] without-interruption [ set message-queue lput msg message-queue]endto-report retrieve-message locals [msg] without-interruption [ set msg first message-queue set message-queue butfirst message-queue ] report msg endto initialize locals [msg] set consistent true foreach children [ set msg (list "info" (list who MyValue_col) ) ask turtles with [who = ? ] [receive-message msg] ] ;ask queens with [who > who-of myself] ; [set message-queue lput (list "info" (list (who-of myself) (MyValue_col-of myself))) message-queue ;] endto handle-message locals [msg xj dj] if (empty? message-queue) [stop] set msg retrieve-message ifelse (first msg = "stop")[ set gata true stop ] [;show msg CheckAgentView msg]end to UpdateContextInfo [Qj Vj ] locals [i j ] set current-view replace-item Qj current-view Vj ;set i Qj set consistent true ;show MyValue_col + " " + current-view set i 0 while [ i < who ] ;for each queen [ if ( abs (who - i) = abs (MyValue_col - (item i current-view)));diagonal match [ set consistent false ] if ( MyValue_col = (item i current-view) );verticle match [ set consistent false ] set i i + 1 ] set nogoods get-list num-queens 0 set i 0 while [ i < who ] ;for each queen [set j 0 while [ j < num-queens ] ;for each column [ if ( abs (who - i) = abs (j - (item i current-view)));diagonal match [set nogoods replace-item j nogoods 1] if ( j = (item i current-view) );verticle match [set nogoods replace-item j nogoods 1] set j (j + 1)] set i (i + 1)] endto UpdateContextNogood [beef ] locals [ i j msg] set i 0 while [i < who] [if (item i beef) != (item i current-view) [stop] set i (i + 1)] ;if (MyValue_col > -1) set nogoods replace-item MyValue_col nogoods 1 ;mark current position as no good set consistent false set i 0 set j 0 while [ i < num-queens and j = 0] [if ( item i nogoods = 0 ) [set Myvalue_col i ;set consistent true setxy (MyValue_col - screen-edge-x) (screen-edge-y - who) set msg list "info" (list who MyValue_col) ask turtles with [who > who-of myself] [receive-message msg] set j 1] set i (i + 1)] if (j = 0 ) [Backtrack]end to UpdateContext locals [i j msg] set nr_constraintc nr_constraintc + who * num-queens set nogoods get-list num-queens 0 set i 0 while [ i < who ] ;for each queen [set j 0 while [ j < num-queens ] ;for each column [ if ( abs (who - i) = abs (j - (item i current-view)));diagonal match [set nogoods replace-item j nogoods 1] if ( j = (item i current-view) );verticle match [set nogoods replace-item j nogoods 1] set j (j + 1)] set i (i + 1)] ;set consistent false set i 0 set j 0 while [ i < num-queens and j = 0] [if ( item i nogoods = 0 ) [set Myvalue_col i ;set consistent true setxy (MyValue_col - screen-edge-x) (screen-edge-y - who) set msg list "info" (list who MyValue_col) ask turtles with [who > who-of myself] [receive-message msg] set j 1] set i (i + 1)] end to-report ChooseValue locals [i j ] set i 0 set j 0 while [ i < num-queens and j = 0] [if ( item i nogoods = 0 ) [ setxy (i - screen-edge-x) (screen-edge-y - who) set j 1 report i ] set i (i + 1)] ; setxy (i - screen-edge-x) (screen-edge-y - who) report -1 end to CheckAgentView [msg ] locals [xj dj i j temp ] if (first msg = "info")[ set xj item 0 (item 1 msg) set dj item 1 (item 1 msg) set messages-received_ok messages-received_ok + 1 set nr_constraintc nr_constraintc + who * (num-queens + 1) UpdateContextInfo xj dj ] if (first msg = "nogood")[ UpdateContextNogood item 1 msg set messages-received_nogood messages-received_nogood + 1 ] if (not consistent ) [ set temp ChooseValue ifelse (temp > -1 ) [ set MyValue_col Temp foreach children [ set msg (list "info" (list who MyValue_col) ) ask turtles with [who = ? ] [receive-message msg]] ] [Backtrack] ] end to BackTrack locals [msg i j ] ifelse (who = 0);newNogood=empty; [set gata true set msg "stop" receive-message msg ] [set msg (list "nogood" current-view ) ask turtles with [who = who-of myself - 1] [ receive-message msg] ] UpdateContext end@#$#@#$#@GRAPHICS-WINDOW277107974918730.0110111CC-WINDOW617101003598Command CenterBUTTON21083
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -