Ошибка с RoadModel.getDistanceOfPath (RoadModel.getShortestPath (Vehicle, Point))

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

long getTimeToReachGivenPoint(Point point) {

    System.out.println("Point: " + point);

    List<Point> path = getRoadModel().getShortestPathTo(this, point);

    System.out.println("Path: " + path);
    System.out.println("Path length: " + path.size());

    Measure<Double,Length> distance = getRoadModel().getDistanceOfPath(path);   

    long time = (long) (distance.getValue()/AgvAgent.SPEED);
    return time;
}

Когда я запускаю это, я получаю следующий результат:

point: (8.0,36.0)
Path: [(12.0,28.22222222222222), (12.0,32.0), (12.0,36.0), (8.0,36.0)]
Path length: 4

И следующее исключение:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: Can not get connection length from a non-existing connection.
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:135)
at com.github.rinde.rinsim.geom.AbstractGraph.connectionLength(AbstractGraph.java:48)
at com.github.rinde.rinsim.core.model.road.GraphRoadModelSnapshot.getDistanceOfPath(GraphRoadModelSnapshot.java:83)
at com.github.rinde.rinsim.core.model.road.DynamicGraphRoadModelImpl.getDistanceOfPath(DynamicGraphRoadModelImpl.java:226)
at project.agents.AgvAgent.getTimeToReachGivenPoint(AgvAgent.java:162)
at project.agents.AgvScheduler.calculateExpectedPickUpTime(AgvScheduler.java:116)
at project.agents.AgvScheduler.getReservationProposal(AgvScheduler.java:43)
at project.agents.AgvAgent.getReservationProposal(AgvAgent.java:147)
at project.smartMessage.ExplorationAntComputationalBehaviour.compute(ExplorationAntComputationalBehaviour.java:41)
at project.smartMessage.ExplorationAntComputationalBehaviour.run(ExplorationAntComputationalBehaviour.java:75)
at project.smartMessage.AntAgent.run(AntAgent.java:64)
at project.agents.AgvAgent.tickImpl(AgvAgent.java:205)
at com.github.rinde.rinsim.core.model.pdp.Vehicle.tick(Vehicle.java:55)
at com.github.rinde.rinsim.core.model.time.TimeModel.tickImpl(TimeModel.java:139)
at com.github.rinde.rinsim.core.model.time.SimulatedTimeModel.doStart(SimulatedTimeModel.java:32)
at com.github.rinde.rinsim.core.model.time.TimeModel.start(TimeModel.java:94)
at com.github.rinde.rinsim.ui.SimulationViewer$5.run(SimulationViewer.java:401)

Насколько я понимаю, кажется, что нет никаких связей между точками на пути, возвращаемом методом getShortestPath ()?

На данный момент я исправил, если с помощью Measure <Double, Velocity> maxSpeed ​​= Measure.valueOf (getSpeed ​​(), getRoadModel (). GetSpeedUnit ()); Список <Point> path = new LinkedList <> (getRoadModel (). GetPathTo (this, point, this.timeUnit, maxSpeed, GeomHeuristics.euclidean ()). GetPath ()); Но я не уверен, что я делаю что-то не так, как указано выше, или это ошибка.

Damian Szkaut 30.05.2018 11:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод getDistanceOfPath(Iterable<Point>) требует, чтобы все точки на пути были узлами на графике. Путь, возвращаемый getShortestPathTo(RoadUser, Point), может содержать позицию, которая не является узлом в графе, если RoadUser не находится на узле. В настоящее время нет встроенного способа обнаружить это и обойти это.

Вы можете обнаружить эту ситуацию, используя метод GraphRoadModel.getConnection(RoadUser), и если RoadUser находится в соединении, вы можете использовать Connection.to() в качестве отправной точки для вызова getShortestPathTo(RoadUser, Point). Например:

Optional<? extends Connection<?>> conn = ((GraphRoadModel)getRoadModel()).getConnection(this);
Point from;
double dist = 0;
if ( conn.isPresent() ){
  dist += Point.distance(getRoadModel().getPosition(this),conn.to());
  from = conn.to();
} else {
  from = getRoadModel().getPosition(this);
}

List<Point> path = getRoadModel().getShortestPathTo(from, point);
Measure<Double,Length> distance = getRoadModel().getDistanceOfPath(path); 

// total distance is the sum of distance and dist  

Я использую модель RoadModel - CollisionGraphRoadModelImpl. Каким-то образом это делает метод getConnection () невидимым, не знаю почему? Но я попытался преобразовать RoadModel в GraphRoadModel, но когда я делаю Optional<Connection<LengthData>> conn = model.getConnection(this);, я получаю сообщение об ошибке: Type mismatch: cannot convert from Optional<capture#1-of ? extends Connection<?>> to Optional<Connection<LengthData>>

Damian Szkaut 30.05.2018 13:08

Это сработает, если я создаю модель дороги и использую Optional<? extends Connection<?>> в качестве типа подключения.

Damian Szkaut 30.05.2018 13:23

Другие вопросы по теме