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

NetLogo:限制在某个补丁上收费的用户数量时出现的问题,netlogo,Netlogo,我正在进行一个项目,以模拟电动汽车在电网上充电的影响,并对汽车用户的驾驶和充电习惯进行建模/模拟。我的代码中出现了一个无法解决的问题 每个位置都有数量有限的充电端口。例如,WORK总共有2个终端,因此只有2个用户可以在那里同时收费(先到先得)。我想做的是,当两个采用者到达工作地点时,他们开始充电(如果需要,即“充电状态”=true)。任何其他采用程序都会等待端口可用。完成充电的用户应为等待列表中的用户腾出充电端口,即使他们没有离开 以下是我所做的部分工作(代码): to go ...

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

每个位置都有数量有限的充电端口。例如,WORK总共有2个终端,因此只有2个用户可以在那里同时收费(先到先得)。我想做的是,当两个采用者到达工作地点时,他们开始充电(如果需要,即“充电状态”=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
...
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
  ]
]