Проблема рекурсивного алгоритма - PullRequest
0 голосов
/ 02 мая 2018

У меня есть сеть улиц, каждая улица может расходиться на две улицы, поэтому две улицы могут сходиться в одну улицу. Каждый раз, когда происходит схождение или расхождение, существует узел. И затем есть промежутки рабочей зоны, которые помещаются сверху улиц (таким образом, диапазон рабочей зоны может зависать над несколькими улицами). Теперь идея состоит в том, что я должен в основном сканировать и найти, где начинаются рабочие зоны, и разместите (как минимум) 5 предупреждающих знаков на проходимом пути, ведущем к месту, где фактически начинается рабочая зона. каждый предупреждающий знак должен быть разделен на 500 футов, так что в целом, если вы приближаетесь к рабочей зоне, вы должны увидеть первый предупреждающий знак на расстоянии 2500 футов от него, а затем еще один в 2000 году, и еще один в 1500 и т.д ...

Таким образом, в целом все эти сущности существуют как объекты:

  1. Уличный объект Начинается и заканчивается в узлах, еще одно свойство улиц - это то, как долго они 5000.
  2. Области рабочей зоны. Они имеют свойство начала и конца, где отмечают точные кадры, с которых они начинаются и заканчиваются. (Пример: интервал рабочей зоны начинается на кадре 500 на улице 1 и заканчивается на улице 9 на кадре 3600.

  3. Узловые объекты, узлы имеют объекты соединения, объекты соединения связывают две улицы вместе

  4. Объекты соединения, которые являются частью узла и сообщают вам, какие две улицы связаны друг с другом
  5. объекты предупреждающих знаков, которые я создаю на определенных этапах

Так что в целом мой подход проходил по улицам и проверял, насколько далеко я от рабочей зоны начинаю / заканчиваю. Итак, я сначала проверяю улицу, на которой я нахожусь, если на ней нет рабочих зон начала / конца, то я проверяю соединения, чтобы узнать, есть ли рабочая зона начала / конца там. Если рабочая зона начала / конца существует на соединяющей улице, затем я определяю, как далеко это. поэтому, если длина соединительной улицы составляет 2000 футов, а рабочая зона начинается с 1000, это означает, что мне нужно поставить три предупреждающих знака на улице, которую я сейчас осматриваю. Но, как вы можете видеть, это может быть довольно сложно с различными возможностями. Учитывая тот факт, что я могу обрабатывать только одну улицу за раз, это частичное решение, которое я придумала, но оно все еще неполное, так как я не знаю, как определить, какое максимальное количество предупреждающих знаков необходимо. Приведенный ниже сценарий иллюстрирует это, но в основном, как бы я справился с ситуацией, когда у меня есть соединение рабочей зоны на двух улицах, которые соединяются с третьей улицей. Как я могу вернуть наибольшее количество необходимых знаков? случай:

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

public static Double getLimitIncreasing(StreetVO street, Double offset) {
List<ConnectionVO> connections = street.getBeginNode().getConnections();
        for ( ConnectionVO connect : connections ) {
            StreetVO connectingStreet = connect.getOtherStreet(street);
            if ( connectingStreet.getSpans().containsKey(Constants.WORK_ZONE) ) {
                List<Double> connectionOffsets = getConnectionPoints(connectingStreet); // gets the points in footage where a workzone begins or ends on a given street, there could be multiple ones, and they are sorted in ascending
                Double streetLength = connectingStreet.getStreetLength();
                Double temp = 0.0;
                if ( connectionOffsets.isEmpty() && (streetLength + offset) < 2500 ) { // if we don't find any connections but the street is too small we have to look at the connecting
                // streets
                    temp = getLimitIncreasing(connectingStreet, (streetLength + offset), subdivision, logger, ptcDataModel); // look at the next connections 
                    if ( temp < offset ) {
                        offset = temp;
                    }
                } else if ( connectionOffsets.isEmpty() && (streetLength + offset) > 2500 ) {
                    continue;
                } else if ( connectionOffsets.size() >= 1 ) {
                    offset = offset + (streetLength - connectionOffsets.get(connectionOffsets.size() - 1)); // gets the last connection, and subtract it from the length to get how far from the end of the street are we
                }
            }
        }
        if ( offset != 0 ) {
            return offset;
        } else {
            return -1.0;
        }
    }

    public class StreetVO{

        NodeVO beginNode
        NodeVO endNode
        Double streetLength;
        Map<String,Span> spans // There are other kinds of spans , that exist , workzones-dangerzones, etc... for this part of the problem i am only concerned about workzones, so passing the key value of workzone, will return to me a span object that lets me know whether a work zone on this current street exists , and whether it begins/ends on a different street along with the exact offset it begins/ends at.
        }
    public class NodeVO(){ //
        List<ConnectionVO> connections;

    }
    public class Span(){ // a workzone can exist on two different street or the same street, and it should have a begin offset , and an end offset
        Double beginOffset;
        StreetVO workZoneBeginStreet;
        StreetVO workZoneEndStreet;
        Double endOffset;

    }
    public class ConnectionVO(){ // this object tells you which two streets connect to each other
        StreetVO beginStreet;
        StreetVO endStreet;
        public getOtherStreet(StreetVO street){ // given one street it will return the other one it's connected to
        if(street == beginStreet)return endStreet else return beginStreet

        }

    }

Пример сценария изображения

Прикрепленный выше пример сценария, который поможет визуализировать проблему и желаемое решение. Но, как вы можете видеть, это может быть довольно утомительно при определении путей навигации. Является ли рекурсия лучшим подходом?

...