EDIT 2 : 이것은 너무 늦었을 수도 있지만 문제를 파악했습니다. 나는 프로젝트를 오해했고, 가장 긴 경로가 아니라 가장 큰 대역폭 경로를 요구했다. 그것은 다르지만 지금까지는 알지 못했습니다. 기본적으로 모든 대역폭 경로 문제 (최대 또는 최소)에서 가중치는 누적되지 않으며 경로 값은 경로에서 가장 작은 가중치로 결정됩니다. 그것을 파이프의 경로라고 생각하면 물의 흐름은 경로를 따라가는 가장가는 파이프에 의해 결정됩니다.가장 긴 경로에 대한 Dijkstra의 알고리즘
편집 1 : PQ 문제가 수정되었지만 여전히 작동하지 않습니다.
과제 (인정)이지만 제출하지 않으면 전체 과정에 실패 할 수 있습니다. Dijkstra의 알고리즘을 수정하여 최단 경로 대신 가장 긴 단순 경로를 계산해야합니다. 해결책을 찾지 못했습니다. 나는 인터넷을 수색하고 this를 찾아 냈다 (그것은 동일한 문제조차이다).
하지만 실행하면 잘못된 값이 생성됩니다. 내가 빠진 것이 있습니까? 왜 전신과 무게를 합산하지 않습니까? 왜 분을 사용합니까?
그래프에 대한 정보 : 1. 각 노드가 다른 노드의 약 25 %에 대해 에 연결되도록 임의로 그래프를 생성합니다. 2. 무게는 양수입니다. 3. 그래프에 25 개의 노드가 있습니다.
"라우팅 알고리즘은 그래프에서 최대 대역폭 경로를 찾는 알고리즘으로 Max-Heap 구조를 사용하는 Dijkstra의 알고리즘 수정을 기반으로합니다"라고 말합니다. 도움이 될만한 트릭이 있습니까?
public class MaxDijkstra {
Graph graph;
PriorityQueue<Node> queue;
public MaxDijkstra(Graph graph, Node s){
this.graph = graph;
s.addAttribute("ui.class", "start");
queue = new PriorityQueue<>(new Comparator<Node>(){
@Override
public int compare(Node n1, Node n2) {
if(Utils.getNodeBW(n1) == Utils.getNodeBW(n2)){
return 0;
}else if(Utils.getNodeBW(n1) < Utils.getNodeBW(n2)){
return 1;
}else{
return -1;
}
}
});
// init
for(Node n : graph){
Utils.setNodeBW(n, 0);
}
Utils.setNodeBW(s, Float.POSITIVE_INFINITY);
// add to Q
for(Node n : graph){
queue.add(n);
}
while(!queue.isEmpty()){
Node u = queue.remove();
Iterator<Node> iterator = u.getNeighborNodeIterator();
while(iterator.hasNext()){
Node v = iterator.next();
float min = Float.min(Utils.getNodeBW(u), Utils.getEdgeBW(u.getEdgeBetween(v)));
if(min > Utils.getNodeBW(v)){
Utils.setNodeBW(v, min);
Utils.setPreOfNode(v, u);
}
}
// validate PQ
// I know it is not good, just for debuggin now
// I will implemnt my own PQ later
List<Node> list = new ArrayList<>();
while(!queue.isEmpty()){
Node w = queue.remove();
list.add(w);
}
for(Node w : list){
queue.add(w);
}
}
}
public void printInfo(){
for(Node n : graph){
System.out.println("N="+n.getId()+" D="+Utils.getNodeBW(n)+" pre="+ (Utils.getPreOfNode(n) == null ? "NIL" : Utils.getPreOfNode(n).getId()));
}
}
/**
* Just to colourise the path
* @param target
*/
public void backtrack(Node target){
target.addAttribute("ui.class", "end");
Node currunt = target;
Node pre = Utils.getPreOfNode(currunt);
while(pre != null){
currunt.getEdgeBetween(pre).addAttribute("ui.class", "route");
currunt = pre;
pre = Utils.getPreOfNode(currunt);
}
}
사전에 여러분 모두 감사합니다.
이 페이지의 알고리즘 사용 : https : //en.wikipedia.org/wiki/Dijkstra's_algorithm # 알고리즘, 최소 거리 대신 가장 큰 거리 값을 항상 취하도록 3 단계를 변경하십시오. –
가장 긴 경로 문제는 NP-hard입니다. https://en.wikipedia.org/wiki/Longest_path_problem#Weighted_directed_acyclic_graphs – yassin
그래프에 제한이 있습니까? – yassin