NetLogo:限制在某个补丁上充电的用户数量时出现的问题



我正在进行一个项目,对电动汽车充电对电网的影响进行建模,并对汽车用户的驾驶和充电习惯进行建模/模拟。我的代码中有一个问题,目前还无法解决。

每个位置都有数量有限的充电端口。例如,WORK总共有2个TERMINALS,因此只有2个采用者可以同时在那里收费(先到先得(。我想做的是,当两个采用者到达WORK时,他们开始充电(如果需要,即"充电状态"=true(。任何其他采用者都要等到那里有可用的端口。完成充电的采用者应该为等待名单上的人腾出充电端口,即使他们没有离开。

以下是我所做的部分工作(代码(:

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代码

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]
...
]

其中,charge-car

to charge-car
if patch-here = current-loc and charging-point
[
ifelse soc < 1
[
if charge-power = 1
[
set charging-speed 1 / 12
set charging-status true
]
if charge-power = 2
[
set charging-speed 6.6 / 12
set charging-status true
]
]
[
set charging-status false
set color blue
]
]
end

CCD_ 3为

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

其中,rem-termremaining-ports相同,charging-statuscharging?相同。我尝试在go-to-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
]
]

请注意,为了清楚起见,我还更改了您的代码以测试/更新剩余端口的数量。

关于你关于列表的问题,在列表中添加一只乌龟是没有问题的(例如set queue lput self queue(,但如果你想要更多的细节,请单独问一个问题。我强烈建议您在现有代码正常工作之前,不要尝试为端口引入队列。

最新更新