我想将电动汽车移到最近的充电站充电。但如果该车站已被占用,其他电动汽车应移动到可用且第二近的位置。我写了这段代码,但电动汽车仍然会前往最近且有人占用的车站。如何解决这个问题?任何帮助表示赞赏...
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 小时后返回。
我应该在状态图中使用发送消息吗?
if (this.distanceTo(st.getX(), st.getY()) <= 10000 && !occupiedStation.contains(st)){
这一点毫无意义。站不能
contains(...)
其他站,除非你自己定义了contains
方法,我对此表示怀疑。
您需要手动记录和存储站
isOccupied()
,您可以使用代理库中的“代理链接”元素来完成此操作。
PS:您可以通过开始使用
traceln(...)
或调试器(如果可用)轻松地自行调试。这样,您就可以准确检查代码在何时以及为什么执行什么操作:)