如何将一辆电动汽车仅移动到最近的一个车站

问题描述 投票:0回答:1

我想将电动汽车移到最近的充电站充电。但如果该车站已被占用,其他电动汽车应移动到可用且第二近的位置。我写了这段代码,但电动汽车仍然会前往最近且有人占用的车站。如何解决这个问题?任何帮助表示赞赏...

Set<Station> occupiedStation = new HashSet<>();
     
List<Station> candidateStation = new ArrayList<>();
for (int i = 0; i < main.Lev2Station.size(); i++) {
    candidateStation.add( main.Lev2Station.get(i) );
}
for (int i = 0; i < main.DCStation.size(); i++) {
    candidateStation.add( main.DCStation.get(i) );
}

List<Station> filteredStation = new ArrayList<>();

for (Station st: candidateStation) {
   if (this.distanceTo(st.getX(), st.getY()) <= 10000 && !occupiedStation.contains(st)){
       filteredStation.add(st);
    }
}

Collections.sort(filteredStation, Comparator.comparingDouble(st -> this.distanceTo(st.getX(), st.getY())));

if (!filteredStation.isEmpty()) {
    Station nearestStation = filteredStation.get(0);
    this.moveTo(nearestStation);
}

以及当 EV 通过状态图转换回初始位置(Home)时如何从占用的站列表中删除 EV。注意到我希望 DCStation 的 EV 在 1 小时后返回,Lev2Station 的 EV 在 2 小时后返回。

我应该在状态图中使用发送消息吗?

anylogic agent-based-modeling
1个回答
0
投票

if (this.distanceTo(st.getX(), st.getY()) <= 10000 && !occupiedStation.contains(st)){

这一点毫无意义。站不能

contains(...)
其他站,除非你自己定义了
contains
方法,我对此表示怀疑。

您需要手动记录和存储站

isOccupied()
,您可以使用代理库中的“代理链接”元素来完成此操作。

PS:您可以通过开始使用

traceln(...)
或调试器(如果可用)轻松地自行调试。这样,您就可以准确检查代码在何时以及为什么执行什么操作:)

© www.soinside.com 2019 - 2024. All rights reserved.