0

我正在尝试在 netlogo 中实现一个拍卖概念——它类似于哲学家就餐问题程序。

我的程序处理与哲学家就餐程序中的哲学家和叉子相对应的计算机和处理器。在哲学家程序中,用户需要 2 个叉子才能吃饭,但在计算机和处理器中,一台计算机需要一个处理器才能工作。

我的程序中定义的状态是IDLE, NEED, ,USING对应于哲学家程序中的 , 。THINKINGHUNGRYEATING

目前,我的程序到了所有计算机状态都更改为NEED. 我在为计算机获取服务器时遇到问题。

代码片段是 -

  // ... lines of code for declaration etc
  . 
  . 
  .
  to update 
  if state = "IDLE" [
     if random-float 1.0 < hungry-chance [
     set state "NEED"
  ]
  stop
  ]
  if state = "USING" [

  set total-used (total-used + 1)
     if random-float 1.0 < full-chance 

     [ release-servers ]

     set state "IDLE"
    stop
   ]
  if state = "NEED" 

     [ acquire-servers ]
       if we've got both forks, eat.
      if got? servers
     [ set state "USING" ]
   stop

 end
 //lines of code in between
 .
 .

  to acquire-servers  ;; philosopher procedure
    ask servers [
     if [owner] of servers = nobody[
     set owner myself
     move-to owner
     set heading [heading] of owner

     ]
   ]
 end
 // lines of code at end
4

1 回答 1

0

首先,您需要将if测试状态更改为ifelse并删除stop命令。这样,计算机就会找到它的正确状态并执行相关程序,而不是查看其他状态。

其次,acquire-servers 过程当前将所有服务器分配给需要一个的第一台计算机。您可能需要一个看起来更像的过程:

to acquire-one-server
  let candidates servers with [ owner = nobody ]
  if any? candidates
  [ ask one-of candidates
    [ set owner myself
      move-to owner
      set heading [heading] of owner
    ]
  ]
end
于 2015-11-24T11:31:49.087 回答