Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Розрахунково-графічна робота
З дисципліни: «Теорія алгоритмів»
На тему: «Вирішіть задачу визначення найкоротшого шляху для пасажира
метрополітену, який би дозволяв йому переміщатися від однієї
заданої станції до іншої заданої станції, використовуючи граф
підземних комунікацій»
Виконав:
студент групи АI-193
Узунов А.Д.
Перевірила:
Арсірій О.О.
Одесса 2020
Тема РГР – Решите задачу определения кратчайшего пути для пассажира
метрополитена, который бы позволял ему перемещаться от одной заданной
станции к другой заданной станции, используя граф подземных
коммуникаций.
Цель: Разработка алгоритма для определения кратчайшего пути при
заданных входных данных.
Описание входных и выходных данных: Входные данные представлены в
виде соединяющихся между собой узлов с установленным значением весов(в
нашем случае значение весов – время пути от станции до станции).
Выходные данный представляют из себя результат выполнения операции
поиска кратчайшего пути по алгоритму Дейкстры (список узлов, длина
минимального пути).
Разработка общей схемы алгоритма: Основная цель алгоритма -
определить кратчайший путь между начальным узлом и заданым конечным.
Учитывая положительно взвешенный граф и начальный узел, алгоритм
определяет кратчайший путь и расстояние от источника(source) до конечной
точки(end) :
Будет использоваться алгоритм Дейкстры, так как он легко реализуем и
имеет относительно небольшую вычислительную сложность (О(n^2))
Чтобы отслеживать процесс, нам нужно иметь два разных набора узлов,
установленных и неустановленных.
Установленные узлы - это узлы с известным минимальным расстоянием от
источника. Набор неустановленных узлов собирает узлы, к которым мы
можем добраться из источника, но мы не знаем минимального расстояния от
начального узла.
Cписок шагов, которые необходимо выполнить для решения поставленной
задачи:
1. Установите расстояние от source до нуля.
2. Установите все другие расстояния на бесконечное значение.
3. Мы добавляем source в набор неустановленных узлов.
Пока набор неустановленных узлов не пуст, мы:
1*. Выбираем узел оценки из набора неустановленных узлов, оценочный узел
должен быть тем, у которого наименьшее расстояние от источника.
2*. Рассчитываем новые расстояния до прямых соседей, сохраняя самые
низкие расстояние при каждой оценке.
3*. Добавляем соседей, которые еще не установлены, в набор
неустановленных узлов.
Эти этапы можно объединить в два этапа: инициализация и оценка.
Инициализация:
Как часть процесса инициализации, нам нужно присвоить значение 0 узлу
source (мы знаем, что расстояние от узла source до узла source, очевидно,
равно 0)
Таким образом, каждый узел в остальной части графа будет отличаться
предшественником и расстоянием:
Чтобы завершить процесс инициализации, нам нужно добавить узел source к
неустановленным узлам, чтобы он был выбран первым на этапе оценки.
Оценка:
Теперь, когда у нас инициализирован наш граф, мы выбираем узел с
наименьшим расстоянием от неустановленного набора, а затем оцениваем
все смежные узлы, которые не находятся в установленных узлах:
Идея состоит в том, чтобы добавить вес ребра к расстоянию узла оценки, а
затем сравнить его с расстоянием назначения.
Узел source затем перемещается из установленных узлов в установленные
узлы.
Узлы смежные узлы добавляются к неустановленным узлам, потому что они
могут быть достигнуты, но их необходимо оценить.
Теперь, когда у нас есть два узла в неустановленном множестве, мы
выбираем тот, у которого наименьшее расстояние, и повторяем, пока не
достигнем конечной точки:
Реализация Java:
В этой реализации мы представим граф в виде набора узлов:
public class Graph {
private Set<Node> nodes = new HashSet<>();
public void addNode(Node nodeA) {
nodes.add(nodeA);
}
}
Узел может быть описан с помощью name , LinkedList со ссылкой на
shortestPath , distance из источника и списка смежности с именем
adjacentNodes :
public class Node {
private String name;
private List<Node> shortestPath = new LinkedList<>();
private Integer distance = Integer.MAX__VALUE;
Map<Node, Integer> adjacentNodes = new HashMap<>();
public void addDestination(Node destination, int distance) {
adjacentNodes.put(destination, distance);
}
public Node(String name) {
this.name = name;
}
}
Атрибут adjacentNodes используется для связи непосредственных соседей с
длиной ребра.
Что касается атрибута shortestPath , это список узлов, который описывает
кратчайший путь, рассчитанный из начального узла.
По умолчанию все расстояния узлов инициализируются с помощью
Integer.MAX_VALUE, чтобы имитировать бесконечное расстояние, как
описано в шаге инициализации.
Описание программной реализации алгоритма:
На вход статического метода calculateShortestPathFromSource подается
объект типа Graph, начальный узел, конечный узел
class Dijkstra {
while (unsettledNodes.size() != 0) {
Node currentNode = getLowestDistanceNode(unsettledNodes);
unsettledNodes.remove(currentNode);
for (Map.Entry< Node, Integer> adjacencyPair:
currentNode.getAdjacentNodes().entrySet()) {
Node adjacentNode = adjacencyPair.getKey();
Integer edgeWeight = adjacencyPair.getValue();
if (!settledNodes.contains(adjacentNode)) {
CalculateMinimumDistance(adjacentNode, edgeWeight, currentNode,
graph,end);
unsettledNodes.add(adjacentNode);
}
}
settledNodes.add(currentNode);
}
graph.setNodes(settledNodes);
return graph;
}
c = (CircleButton) actionEvent.getSource();
c.prevButton = prevButton;
c.pressedCounter = clicked;
String end = c.getName();
Dijkstra.calculateShortestPathFromSource(db.getGraph(),
db.getSource(source), db.getEnd(end)).getMinPath();
if (!pathInMemory.containsKey(db.getSource(source).getName()+
db.getEnd(end).getName())) {
pathInMemory.put(db.getSource(source).getName() +
db.getEnd(end).getName(), "The shortest pass from " + source + " to " + end +
" is: "
+ db.getGraph().getMinPath() + end + " (" +
db.getGraph().getMinDistance(db.getEnd(end)) + " minutes)");
}
Result.setText(pathInMemory.get(db.getSource(source).getName()+
db.getEnd(end).getName()));
} else {
c = (CircleButton) actionEvent.getSource();
prevButton = c;
source = c.getName();
}
clicked++;
}
}
pathInMemory.put(db.getSource(source).getName() +
db.getEnd(end).getName(), "The shortest pass from " + source + " to " + end + " is:
"
+ db.getGraph().getMinPath() + end + " (" +
db.getGraph().getMinDistance(db.getEnd(end)) + " minutes)");
}
Result.setText(pathInMemory.get(db.getSource(source).getName()+
db.getEnd(end).getName()));
nodeB.addDestination(nodeE, 15);
nodeB.addDestination(nodeG, 15);
nodeB.addDestination(nodeA, 20);
nodeB.addDestination(nodeC, 35);
nodeC.addDestination(nodeB, 35);
nodeC.addDestination(nodeE, 60);
nodeC.addDestination(nodeF, 10);
nodeD.addDestination(nodeE, 30);
nodeE.addDestination(nodeD, 30);
nodeE.addDestination(nodeB, 15);
nodeE.addDestination(nodeC, 60);
nodeF.addDestination(nodeC, 10);
nodeF.addDestination(nodeG, 35);
nodeG.addDestination(nodeH, 40);
nodeG.addDestination(nodeB, 15);
nodeG.addDestination(nodeF, 35);
nodeH.addDestination(nodeG, 40);
graph.addNode(nodeA);
graph.addNode(nodeB);
graph.addNode(nodeC);
graph.addNode(nodeD);
graph.addNode(nodeE);
graph.addNode(nodeF);
graph.addNode(nodeG);
graph.addNode(nodeH);
nodes.add(nodeA);
nodes.add(nodeB);
nodes.add(nodeC);
nodes.add(nodeD);
nodes.add(nodeE);
nodes.add(nodeF);
nodes.add(nodeG);
nodes.add(nodeH);
2. Граф моделируется вручную.
3. Выбираем первый узел
3.
4.