Netlogo 计算并报告代理移动半径周围特定半径内的地块地租
总结 我正在开发一个土地利用模型,其中有一个森林世界和海龟,它们有能力将森林转化为农田。海龟在这种特殊情况下,公司有能力移动到其活动范围内的目的地,清除周围半径内的森林,将其变成农田。 目标是让公司根据转换周围补丁的预期利润来选择目的地补丁,也就是说,就在景观中的何处移动做出经济决策。在我的模型中,利润或地租是转换成本、维护成本和潜在惩罚的函数,从斑块产量中减去。因此,理想的目标补丁是其周围的补丁集群具有最高的预测利润总和的补丁。我做了一个小数字来帮助形象化这个概念: 到目前为止我做了什么 到目前为止,我有以下与寻找最高地租补丁相关的程序:1将公司移至具有最高预测地租的补丁 2使用“报告”功能报告最大预测地租。我也尝试了一个询问补丁的功能,但是没有用。 补丁有一个与之相关的惩罚,这取决于它们是否是保护区的一部分,并且可以由某个参与者拥有,这取决于它们所在的位置和转换它们的人 问题/目标 我需要的是一个结构,要求海龟公司给定半径内的每个地块计算另一给定半径内每个地块的地租。换言之,我希望海龟能够说:如果我去这个在我移动半径范围内的区域xy,我从转换该区域xy周围的所有区域中获得最大地租。 下面的代码不会产生任何错误消息,但是从海龟的行为来看,它似乎也没有正确运行。海龟在世界各地随意移动,并直接进入受保护的区域,因为侵入而遭受巨额罚款,导致它们破产Netlogo 计算并报告代理移动半径周围特定半径内的地块地租,netlogo,Netlogo,总结 我正在开发一个土地利用模型,其中有一个森林世界和海龟,它们有能力将森林转化为农田。海龟在这种特殊情况下,公司有能力移动到其活动范围内的目的地,清除周围半径内的森林,将其变成农田。 目标是让公司根据转换周围补丁的预期利润来选择目的地补丁,也就是说,就在景观中的何处移动做出经济决策。在我的模型中,利润或地租是转换成本、维护成本和潜在惩罚的函数,从斑块产量中减去。因此,理想的目标补丁是其周围的补丁集群具有最高的预测利润总和的补丁。我做了一个小数字来帮助形象化这个概念: 到目前为止我做了什么 到目
patches-own
owned-by ;; "R" indicated it's unoccupied forest
protected-area ;; whether the patch is part of a protected area
encroachment-fine ;; the $-amount a turtle is fined for converting this patch of forest
GUI inputs
company-conversion-radius ;in what radius around themselves companies can convert land
to move-to-max-rent-C
ifelse any? patches in-radius (company-conversion-radius * 2 - 1) with [owned-by = "R"] [ ;here, companies 'scan' their environment for any patches that have forest (expressed through owned-by = "R"), if there are forested patches, companies move to the destination-patch that promises the highest profit (land-rent)
let destination-C max-rent-C
move-to destination-C
]
;; if no forest patch within their scanning-radius, they face the nearest forest patch anywhere and move towards it
[
face min-one-of patches with [owned-by = "R"] [distance myself]
move-to patch-ahead company-conversion-radius
]
end
to-report max-rent-C
ask patches in-radius (company-conversion-radius * 2 - 1) [
let available-conversion-patches count patches in-radius company-conversion-radius with [owned-by = "R"]
report max-one-of patches in-radius company-conversion-radius with [owned-by = "R"] [;;formula for calculating land rent]
]
end
我找到了这条线索,但它似乎没有完全回答我的问题,因为它只要求计算海龟周围的面积,而不是海龟能到达的面积。我想你差不多到了。我无法运行您的代码,但通过阅读,max-rent-C过程将正确识别给定半径内返回最佳利润的补丁。您的问题是,您没有以正确的方式调用该过程。假设一只海龟在a区,有机会移动到B区,但想选择利润最大的B区。海龟所要做的是想象自己在所有可能的斑块上,并计算在该位置时从周围所有斑块中获得的利润。这是你在问题中所说的,但为了清楚起见,请重复 因此,它不必向A询问最大值,而必须找到给出最大值的最大值 而不是:
let destination-C max-rent-C
尝试:
假设所有公司的半径都相同,我可能会让每个补丁都有自己的值作为变量。然后你可以在一个单独的函数中选择最高的一个。 此外,公司的移动范围现在似乎等于转换范围。我希望这些是不同的东西,所以我会使用不同的名称,即使它们具有相同的值。我在我的代码中将其拆分,以使其更清晰。 您还应该意识到,您所要求的可能在计算上很昂贵。如果N家公司询问M个补丁,那么P个周围补丁的组合值是多少,那么您正在进行N*M*P计算。如果您的程序运行缓慢,这可能是导致它的原因 一般来说,我认为您的代码应该如下所示:
patches-own
rent-value ;the value of this specific tile
HQ-value ;the value of making this a destination patch
to update-value
ask patches [ ; ask every patch to update its HQ value
set HQ-value 0
ask patches in-radius company-conversion-radius [ ; by summing over the rent-value of its radius
set HQ-value of [myself] HQ-value of [myself] + rent-value
;you could incorporate your protections and penalties here too.
]
]
这将导致所有修补程序更新其HQ值。
如果你的公司很少,补丁也很多,那么让turtles做以下事情会更快:
to update-value
ask turtles [
ask patches in-radius company-movement-range [
set HQ-value 0
ask patches in-radius company-conversion-radius [
;...
移动半径和转换半径是否相同?它们是在所有公司中共享的,还是有些公司的半径比其他公司更大?不,移动半径比转换半径大,它是2*转换半径-1个补丁。是的,目前各公司的半径相同。非常感谢您的快速回复!很好的一点,我将保持对模型的速度眼睛-现在它运行良好,但肯定会监测它!非常感谢,这对我来说太完美了!很抱歉,代码没有运行,我修改了它,没有包含所有相关的部分来运行。很抱歉,我不清楚。以允许代码运行的方式为NetLogo编写问题几乎是不可能的。我并没有具体评论你的问题,更多的是关于不确定答案是否正确的一般性评论
to update-value
ask turtles [
ask patches in-radius company-movement-range [
set HQ-value 0
ask patches in-radius company-conversion-radius [
;...