NetLo go: проблемы, возникающие при ограничении количества пользователей, взимающих плату за определенный патч - PullRequest
1 голос
/ 06 марта 2020

Я работаю над проектом по моделированию воздействия зарядки электрических c автомобилей на электросеть и моделированию / имитации привычек вождения и зарядки пользователей автомобилей. В моем коде появляется проблема, которую пока не удалось решить.

Каждое местоположение имеет ограниченное количество портов для зарядки. Например, WORK имеет в общей сложности 2 ТЕРМИНАЛА, поэтому только 2 усыновителя могут взимать плату там одновременно (в порядке поступления). То, что я хочу сделать, это когда 2 приемных прибудут на РАБОТУ, они начнут заряжаться (если требуется, то есть «состояние зарядки» = истина). Любые дополнительные приемники ждут, пока там не появится порт. Усыновители, которые заканчивают sh зарядку, должны освободить порт зарядки для тех, кто находится в списке ожидания, даже если они не уходят.

Вот часть моих усилий (код), которые я сделал:

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

и go-to-target равно

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-term такое же, как remaining-ports и charging-status такой же, как charging?. Я попытался добавить тот же код в функцию go-to-target, так как сначала менялся статус зарядки, но это не показывало никаких изменений в результатах, которые я получаю.

1 Ответ

2 голосов
/ 09 марта 2020

Я не вижу ничего явно неправильного в вашем коде. Подобные вещи обычно происходят, потому что у вас есть несколько 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), но если вы хотите больше подробностей, пожалуйста, задайте отдельный вопрос. Я настоятельно рекомендую вам не пытаться вводить очереди для ваших портов до тех пор, пока существующий код не будет работать должным образом.

...