NetLogo:限制在某个补丁上收费的用户数量时出现的问题
我正在进行一个项目,以模拟电动汽车在电网上充电的影响,并对汽车用户的驾驶和充电习惯进行建模/模拟。我的代码中出现了一个无法解决的问题 每个位置都有数量有限的充电端口。例如,WORK总共有2个终端,因此只有2个用户可以在那里同时收费(先到先得)。我想做的是,当两个采用者到达工作地点时,他们开始充电(如果需要,即“充电状态”=true)。任何其他采用程序都会等待端口可用。完成充电的用户应为等待列表中的用户腾出充电端口,即使他们没有离开 以下是我所做的部分工作(代码):NetLogo:限制在某个补丁上收费的用户数量时出现的问题,netlogo,Netlogo,我正在进行一个项目,以模拟电动汽车在电网上充电的影响,并对汽车用户的驾驶和充电习惯进行建模/模拟。我的代码中出现了一个无法解决的问题 每个位置都有数量有限的充电端口。例如,WORK总共有2个终端,因此只有2个用户可以在那里同时收费(先到先得)。我想做的是,当两个采用者到达工作地点时,他们开始充电(如果需要,即“充电状态”=true)。任何其他采用程序都会等待端口可用。完成充电的用户应为等待列表中的用户腾出充电端口,即使他们没有离开 以下是我所做的部分工作(代码): to go ...
to go
...
charge-car ; sets the charging-status based on state-of-charge.
ask adopters
[
if charging? and not marked?
[
ifelse remaining-ports != 0
[
set remaining-ports max list (remaining-ports - 1) 0
set marked? true
]
[set occupied? true]
]
if marked? and not charging?
[
set remaining-ports min list (remaining-ports + 1) terminals
set marked? false
set occupied? false
]
]
ask adopters with [charging? and marked?]
[
set color green
let battery0 battery
let charging-speed0 charging-speed
let battery1 max list 0 ( battery + charging-speed0 )
set battery min list battery1 battery-capacity
let charged min list ( battery - battery0 ) charging-speed0
set charge-demand charge-demand + charged
set soc battery / battery-capacity
set range-left battery / discharge-patch
]
tick
end
现在的问题是:地图上有多个带充电端口的位置。此代码在某些位置给出不同的结果,即使对所有位置和代理都是相同的算法。例如,如果两个端口在某些位置都被占用,则“已占用”将适用于某些位置,而不是所有端口都被占用的位置。我的意思是,这是一个相当随机的反应
有人能帮我吗?有没有其他方法来做我想做的事?另外,如果你需要更多的信息来了解我的情况,请告诉我
谢谢大家!
编辑:
这是我要去的代码
to go
...
ask adopters
[
if patch-here = current-loc ; choose next target only when reached at a destination (current location)
[
choose-target
set nearest-station min-one-of patches with [location = "charging-station"][distance myself]
] ; choose target based on start time and current location
; go to target only when NOT at the arbitrary target location
if target != [0 0]
[
let dist-to-targ distance-between current-loc target
let dist-to-station distance-between current-loc nearest-station
ifelse dist-to-targ > range-left and dist-to-station < range-left
[go-to-station nearest-station]
[go-to-target]
]
if charging = "Charge Car Now"
[charge-car]
...
]
并且转到目标
是
to go-to-target
ifelse patch-here != target
[
; move towards destination and use fuel
face target
; set marked? false
set color blue
ifelse distance target <= speed
[set speed1 0.3 * distance target] ; decrease speed as target gets nearer
[set speed1 speed]
forward speed1
set moving? true
set charging-status false
if marked?
[
set rem-term min list (rem-term + 1) terminals
type patch-here type "Updated ports" print rem-term
set marked? false
set occupied? false
]
]
[
move-to target
if target != [0 0]
[set dist-trav distance-between current-loc target]
set current-loc target
set moving? false
set dwell dwell-acq day-ind time-ind position [location] of target places ; calculate dwell time based on arrival time at target
ifelse dwell < 0
[
set dwell 288 - (ticks mod 288) ; spend rest of the time till 24:00 at that location
set dwell-flag 1
]
[set dwell-flag 0]
if current-loc = target
[
set arrival-time (ticks mod 288)
set start-time (dwell + arrival-time) mod 288
set target [0 0]
set battery battery - (discharge-patch * dist-trav) ; discharge based on distance traveled per tick
set soc battery / battery-capacity
set range-left battery / discharge-patch
if battery < 0
[set battery 0]
if soc < 0
[set soc 0]
]
]
end
转到目标
如果还有补丁在这里!=目标
[
;前往目的地并使用燃料
面对目标
;设置为标记?错误
设置颜色为蓝色
ifelse distance target我看不出你的代码有任何明显的错误。这种情况经常发生,因为你有多个ask turtles
块,你在第一个块中算出了意图,但在第二个块之前不做行为。在你的情况下,我可以看到你在第一个块中更新端口数,所以这并不直接适用
然而,我想知道你是否在用你的if
语句做类似的事情,海龟们正在经历不同于你预期的块,并且你提取的摘录中缺少相关的代码。诊断这类问题的最简单方法是使用print
语句。请参阅下面的一种可能性。
ask adopters
[ if charging? and not marked?
[ ifelse remaining-ports > 0
[ type patch-here print remaining-ports
set remaining-ports remaining-ports - 1
set marked? true
type patch-here type "Updated ports" print remaining-ports
]
[ set occupied? true ]
]
if marked? and not charging?
[ set remaining-ports min list (remaining-ports + 1) terminals
set marked? false
set occupied? false
]
]
请注意,为了清晰起见,我还更改了测试/更新剩余端口数的代码
关于列表的问题,在列表中添加海龟是没有问题的(例如设置队列lput self queue
)但是,如果您想了解更多详细信息,请提出单独的问题。我强烈建议您在现有代码正常工作之前,不要尝试为端口引入队列。我认为发生的情况是,在某些位置,多个(2个以上)采用者(代理)同时到达(同一勾号)这就是导致代码中出现问题的原因。我注意到,代理到达的位置不一致,这没有问题。有人能帮我解决这个问题吗?剩余端口是补丁变量吗?我认为这是补丁上可用的插槽数吗?所以这是未启动的变量正确约会?是的,它是可变的。你是正确的。如果多个(超过2个)代理在同一个补丁上登陆,它不会正确更新。你能给我们看一下你检查是否有充电站的代码吗?我希望看到类似于如果剩余端口>=1[…
我使用“如果其他剩余端口!=0”。这在我问题的代码摘录中。我忘了将rem术语更改为剩余端口。对此表示抱歉。谢谢JenB。请您详细说明一下:“您在第一个块中确定了意图,但在第二个块之前不执行行为”。我确实有多个ask-turtle
块,但我不知道如何组合它们。如果我将整个块发布到这里或在另一个问题中,会有帮助吗?因此我现在有一个特定的情况:现在一个补丁上有6个代理,并且没有一个在收费(即使他们的充电?
状态为true
,因为补丁显示其已被占用
,因为剩余端口=0
。我认为剩余端口
在前一个代理离开某个端口时没有更新:如果已标记?并且未充电?
循环没有针对该位置和代理运行。现在剩下的代理只是在那里等待,没有被收费。在您的代码中,收费在哪里?设置为false?目前,已占用?只有当补丁上有一个已标记但未收费的采纳者时,才能设置为false。但您尚未提供将收费?标志设置为true或false的代码。无论如何,我的建议是:首先,你需要添加一些打印语句,告诉你正在运行哪一段代码。我还将使用inspect windows查看几个补丁。JenB,我遵循你的建议,使用了不同的打印语句,并使用inspect窗口分析问题。该程序运行了一段时间,但当一个补丁上的流量很高,该补丁会出错,即剩余端口
显示的数字不正确,已占用?
状态不正确,用户不充电,只是在那里等待充电,因为剩余端口
被卡为0。我更新了我的问题,并添加了有关ch的信息精氨酸状态
ask adopters
[ if charging? and not marked?
[ ifelse remaining-ports > 0
[ type patch-here print remaining-ports
set remaining-ports remaining-ports - 1
set marked? true
type patch-here type "Updated ports" print remaining-ports
]
[ set occupied? true ]
]
if marked? and not charging?
[ set remaining-ports min list (remaining-ports + 1) terminals
set marked? false
set occupied? false
]
]