moien,
ich wollte gerne den kürzesten weg von einem bestimmten startpunkt über alle wegpunkt berechnen, wobei es keinen festen zielpunkt gibt.
ich habe mich da am Dijkstra-Algorithmus orientiert, soweit ich den verstanden habe
.
ich denke mir also, dass ich vom startpunkt zum nächstliegendstem punkt gehe, den abspeicher und von der "noch-zu-gehen" liste streiche und dann von dem abgespeichertem punkt zu ihm am nächsten liegenden punkt gehe.
ziel soll es sein die gesamtstrecke am geringsten zu halten.
allerdings kann ich schon jetzt sagen, dass es mindestens eine ausnahme geben wird. wenn es vom startpunk, oder jedem anderen zwischenstartpunkt, mindestens zwei nacharpunkte mit gleichem abstand gibt, dann entscheidet der programm noch nicht, welcher nun den kürzesten weg verursacht. es wird der erste zu berechnende punkt genommen, und danach wird weiter berechnet. es muss also nicht der kürzeste weg herauskommen.
das programm kann aber mit punkten gleicher koordinaten umgehen. da spielt dann die reihenfolge keine rolle, da die gesamtdistanz nicht beeinflusst wird.
so, was haltet ihr von dem ansatz? und gleich vorweg. ich bin kein informatiker, ich kenne keine noch so grossen leute und deren algorythmen. auf Dijkstra bin ich auch erst nachdem mein satz fertig war gestossen
.
grüße, Andreas
ich wollte gerne den kürzesten weg von einem bestimmten startpunkt über alle wegpunkt berechnen, wobei es keinen festen zielpunkt gibt.
ich habe mich da am Dijkstra-Algorithmus orientiert, soweit ich den verstanden habe
ich denke mir also, dass ich vom startpunkt zum nächstliegendstem punkt gehe, den abspeicher und von der "noch-zu-gehen" liste streiche und dann von dem abgespeichertem punkt zu ihm am nächsten liegenden punkt gehe.
ziel soll es sein die gesamtstrecke am geringsten zu halten.
Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package shortestway;
import static java.lang.Math.*;
import java.util.*;
/**
*
* @author Andreas
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
// wegpunkte
// wegpunkte als einfache 2d koordinaten
// original wegpunkte 0,1,2,3,4,5 test
double[] xOriginal = {7,4,3,5,3,5};
double[] yOriginal = {4,5,7,5,1,5};
// startpunkt
double xStart = 3;
double yStart = 3;
// list, damit gezielt geloecht und index angepasst werden kann
LinkedList x = new LinkedList();
LinkedList y = new LinkedList();
LinkedList position = new LinkedList();
LinkedList route = new LinkedList();
// ueberfuehren der original koordinaten in listen wg veraenderbarkeit
// position wird gespeichert, um route ueber wegpunkte abspeicherbar
for(int i=0; i<xOriginal.length; i++){
x.add(xOriginal[i]);
y.add(yOriginal[i]);
position.add(i);
}
//System.out.println(position.get(4));
//System.out.println(position.size());
// berechnung startpunkt zu erstem wegpunkt
double distanceTMP;
int indexTMP = 0;
distanceTMP = Math.sqrt(Math.pow((Double) x.get(0) - xStart,2) + Math.pow((Double) y.get(0) - yStart,2));
//System.out.println("distanceTMP0 = " + distanceTMP + " indexTMP0 = " + indexTMP);
for(int i=1; i<x.size(); i++){
//System.out.println(Math.sqrt(Math.pow((Double) x.get(i) - xStart,2) + Math.pow((Double) y.get(i) - yStart,2)));
if(distanceTMP > Math.sqrt(Math.pow((Double) x.get(i) - xStart,2) + Math.pow((Double) y.get(i) - yStart,2))){
distanceTMP = Math.sqrt(Math.pow((Double) x.get(i) - xStart,2) + Math.pow((Double) y.get(i) - yStart,2));
indexTMP = i;
}
}
System.out.println("distanceTMP1 = " + distanceTMP + " indexTMP1 = " + indexTMP);
route.add(position.get(indexTMP));
// nun von letzter stelle der schon in der routenliste gespeicherten koordinaten zu den noch in den koordinatenliste befindlichen stellen
for(int j=0; j<xOriginal.length-1; j++){
// position mit der kuerzesten strecke vom start aus koordinatenliste entfernen
x.remove(indexTMP);
y.remove(indexTMP);
position.remove(indexTMP);
// neustart der variablen
distanceTMP = 0;
indexTMP = 0;
distanceTMP = Math.sqrt(Math.pow((Double) x.get(0) - xOriginal[(Integer) route.get(route.size()-1)],2) + Math.pow((Double) y.get(0) - yOriginal[(Integer) route.get(route.size()-1)],2));
//System.out.println("distanceTMP0 = " + distanceTMP + " indexTMP0 = " + indexTMP);
for(int i=1; i<x.size(); i++){
//System.out.println(Math.sqrt(Math.pow((Double) x.get(i) - xOriginal[(Integer) route.get(route.size()-1)],2) + Math.pow((Double) y.get(i) - yOriginal[(Integer) route.get(route.size()-1)],2)));
if(distanceTMP > Math.sqrt(Math.pow((Double) x.get(i) - xOriginal[(Integer) route.get(route.size()-1)],2) + Math.pow((Double) y.get(i) - yOriginal[(Integer) route.get(route.size()-1)],2))){
distanceTMP = Math.sqrt(Math.pow((Double) x.get(i) - xOriginal[(Integer) route.get(route.size()-1)],2) + Math.pow((Double) y.get(i) - yOriginal[(Integer) route.get(route.size()-1)],2));
indexTMP = i;
}
}
System.out.println("distanceTMP1 = " + distanceTMP + " indexTMP1 = " + indexTMP);
route.add(position.get(indexTMP));
}
// nur noch ausgabe der routenpunkte
System.out.print("route = ");
for(int i=0; i<route.size(); i++){
System.out.print(route.get(i) + ";");
}
System.out.println();
}
}
allerdings kann ich schon jetzt sagen, dass es mindestens eine ausnahme geben wird. wenn es vom startpunk, oder jedem anderen zwischenstartpunkt, mindestens zwei nacharpunkte mit gleichem abstand gibt, dann entscheidet der programm noch nicht, welcher nun den kürzesten weg verursacht. es wird der erste zu berechnende punkt genommen, und danach wird weiter berechnet. es muss also nicht der kürzeste weg herauskommen.
das programm kann aber mit punkten gleicher koordinaten umgehen. da spielt dann die reihenfolge keine rolle, da die gesamtdistanz nicht beeinflusst wird.
so, was haltet ihr von dem ansatz? und gleich vorweg. ich bin kein informatiker, ich kenne keine noch so grossen leute und deren algorythmen. auf Dijkstra bin ich auch erst nachdem mein satz fertig war gestossen
grüße, Andreas