【发布时间】:2015-04-14 03:09:39
【问题描述】:
我正在尝试在 netlogo 中实现拍卖概念 - 它类似于 dining philosophers problem 程序。
我的程序处理与哲学家就餐程序中的哲学家和叉子相对应的计算机和处理器。在哲学家程序中,用户需要 2 个叉子才能吃饭,但在计算机和处理器中,一台计算机需要一个处理器才能工作。
我的程序中定义的状态有IDLE、NEED、USING,对应哲学家程序中的THINKING、HUNGRY、EATING。
目前,我的程序将所有计算机状态更改为NEED。我在为计算机获取服务器时遇到问题。
代码sn-p是-
// ... 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
【问题讨论】:
-
欢迎来到堆栈溢出!我已经对您的问题进行了一些编辑,以使其更易于阅读。我有点困惑你的问题与用餐哲学家有什么关系。这个问题特别关注一个用户需要 2 个资源,并且如果每个人都有一个资源但没有人可以得到两个来“解锁”这种情况,则该用户有可能“锁定”。这将对应于状态
NEED中的每个人,然后您尝试策略来防止这种锁定。但是对于您的情况(1 台计算机的 1 个资源),我看不出哲学家进餐策略有什么帮助。你能澄清一下吗? -
在我的程序中,处理器的数量总是小于计算机的数量。我这里不处理合作案件。这个程序对餐饮哲学家来说更简单。我只需要将处理器分配给计算机的方法,当计算机完成后,它会释放处理器以便将其分配给其他计算机。你能帮助我如何实现这个吗?正如我之前在帖子中所说,目前该程序一直运行到计算机处于需要状态的地步。
-
@RichardSnape 你能帮忙吗
-
如果没有完整的代码,很难为您提供帮助。我可以对服务器/计算机等是什么以及总使用、饥饿机会等的定义以及它们所采用的值做出很多假设,但是如果您发布一个链接到您保存为完整工作模型的链接会更容易nlogo 文件。
-
事实上 - 代码有很多问题,例如:1. 没有称为发布服务器的过程 2. 不清楚哪些代理有
state或者它是否是一个全局变量。显然我假设它是computers-own。在这种情况下,您需要在update中ask计算机,或显示go执行此操作的位置 3. 对if we've got both forks, eat等没有评论。您是基于示例库中的模型吗?如果是这样 - 我们也许可以弄清楚该怎么做
标签: netlogo dining-philosopher