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