Как получить лучший путь во взвешенном орграфе (графе), используя «смежный хеш»? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь получить лучший путь от взвешенного графика, где в моем случае рассматриваются набор из трех различных весов, которые включают стоимость, медлительность и риск. Одна из целей состоит в том, чтобы представить карту, где каждый край является дорогой, а каждая вершина - координатной точкой. Я использую Map <Vertex, HashSet<ConnectionEdge> map; для представления моего графика. Класс ConnectionEdge представляет пакет с целевой вершиной и соответствующим весом этого соединения (origin -> (destination, weight)). Для нахождения наилучшего пути считается сумма среднего значения одной вершины до другой, пока не будет найден пункт назначения, то есть из одной вершины в другую мы добавляем веса (стоимость, медлительность, риск) и делим на три. возьмите этот результат, и мы добавим следующий к следующему.

Я могу установить связи, но у меня проблемы с поиском лучшего способа. Основная цель состоит в том, чтобы напечатать лучший путь как A -> B -> D -> E в соответствии с его общим значением веса (сумма средних значений).

Ниже код класса:

Graph.java

import java.util.*;

public class Graph<T> {
    private Map<Vertex, HashSet<ConnectionEdge>> map;

    public Graph() {
        this.map = new HashMap<Vertex, HashSet<ConnectionEdge>>();
    }

    public boolean add(Vertex<T> vextex) {
        if (!this.map.containsKey(vextex)) {
            this.map.put(vextex, new HashSet<ConnectionEdge>());
            return true;
        }
        return false;
    }


    public boolean put(Vertex<T> origin, Vertex<T> destination, int cost, int slowness, int risk) {
        if (this.map.containsKey(origin) && this.map.containsKey(destination)) {
            if (!this.map.get(origin).contains(destination)) {
                List<Integer> weights = Arrays.asList(cost, slowness, risk);
                this.map.get(origin).add(new ConnectionEdge(destination, weights));
                return true;
            }
        }
        return false;
    }
}

Vertex.java

public class Vertex<T> {
    private String label;
    private T value;

    public Vertex(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

ConnectionEdge.java

import java.util.List;

public class ConnectionEdge<T> {
    private Vertex<T> destination;
    private List<Weight> weights;

    public ConnectionEdge(Vertex<T> destination, List<Weight> pesos) {
        this.destination = destination;
        this.weights = pesos;
    }

    public Vertex<T> getDestination() {
        return destination;
    }

    public void setDestination(Vertex<T> destination) {
        this.destination = destination;
    }

    public List<Weight> getWeights() {
        return weights;
    }

    public void setWeights(List<Weight> weights) {
        this.weights = weights;
    }
}

Weight.java

import java.util.HashMap;
import java.util.Map;

public class Weight {
    private Map<WeightType, Integer> weights = new HashMap<WeightType, Integer>();

    public Weight(WeightType weightType, Integer value) {
        this.weights.put(weightType, value);
    }

    public Map<WeightType, Integer> getWeights() {
        return weights;
    }

    public void setWeights(Map<WeightType, Integer> weights) {
        this.weights = weights;
    }
}

WeightType.java

public enum WeightType {
    COST,
    SLOWNESS,
    RISK
}

Это помогло бы многим указаниям или решению.

1 Ответ

0 голосов
/ 28 мая 2019

Вам следует взглянуть на алгоритм Дейкстры, который эффективно найдет кратчайший (наименее дорогой) путь.https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...