⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ---abtkernel.nlogo

📁 NETLOGO
💻 NLOGO
📖 第 1 页 / 共 2 页
字号:
; 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 + -