Я разрабатываю алгоритм, чтобы найти лучший маршрут между двумя аэропортами. Я наткнулся на концепцию Кратчайший путь всех пар (APSP) и библиотеку GraphStream .
Содержимое читается из текстового файла. Каждая строка представляет остановку авиакомпании:
PEK,LAX,5
ATL,HND,75
ATL,LAX,20
DXB,HND,5
ATL,PEK,10
PEK,HND,40
LAX,DXB,20
ATL,DXB,55
Поскольку проблема связана с авиабилетами, я назвал третью колонку «ценой», но когда я попытался ввести в нее реальные значения цены, некоторые маршруты перестали работать. Также одной из функций является добавление новых строк в файл. У меня возникают проблемы при добавлении любых значений, которые я хочу для новых остановок.
Чтение ветки форума по математике StackExchange , я пытался разделить все значения по наибольшему весу перед созданием строки графика но безуспешно:
String graphString;
String graphStringHeader = "DGS004\nmy 0 0\n";
String graphStringNodes = "";
String graphStringEdges = "";
BigDecimal biggestPrice = BigDecimal.ZERO;
while (stLines.hasMoreTokens()) {
line = stLines.nextToken(System.getProperty("line.separator"));
final StringTokenizer stColumns = new StringTokenizer(line);
Airport originAux = null;
Airport destinationAux = null;
BigDecimal priceAux = null;
String column;
Integer columnIndex = 1;
while (stColumns.hasMoreTokens()) {
column = stColumns.nextToken(",");
if (columnIndex == 1) {
originAux = new Airport(column);
if (!nodes.contains(column)) {
// an = add node
graphStringNodes += "an " + column + " \n";
nodes.add(column);
}
} else if (columnIndex == 2) {
destinationAux = new Airport(column);
if (!nodes.contains(column)) {
// an = add node
graphStringNodes += "an " + column + " \n";
nodes.add(column);
}
} else if (columnIndex == 3) {
double parsedPreco = Double.parseDouble(column);
priceAux = BigDecimal.valueOf(parsedPreco);
/**
* Normalizing values.
*/
if (priceAux.intValue() > biggestPrice.intValue()) {
biggestPrice = priceAux;
} else {
priceAux = priceAux.divide(biggestPrice, 2, RoundingMode.HALF_UP);
}
edges.add(originAux.getName() + "," + destinationAux.getName()+ "," + priceAux.intValue());
stopovers.add(new Stopover(originAux, destinationAux, priceAux));
// ae = add edge
graphStringEdges += "ae " + originAux.getName() + "_" + destinationAux.getName() + " "
+ originAux.getName() + " > " + destinationAux.getName()
+ " price:" + priceAux.intValue()
+ " \n";
}
columnIndex++;
}
lineIndex++;
}
graphString = graphStringHeader + graphStringNodes + graphStringEdges;
Это исключение:
java.lang.NullPointerException: null
at org.graphstream.graph.Path.add(Path.java:230)
at org.graphstream.algorithm.APSP$APSPInfo.getShortestPathTo(APSP.java:594)
at service.RouteFinderService.findRoute(RouteFinderService.java:183)
230-я строка службы: Path shortestPath = edge.getShortestPathTo(destination.getName())
. Параметром является код аэропорта назначения.
Вот как я создаю экземпляр объекта Graph
и APSP
:
Graph graph = new DefaultGraph("BestRouteGraph");
ByteArrayInputStream bs = new ByteArrayInputStream(graphString.getBytes());
FileSourceDGS source = new FileSourceDGS();
source.addSink(graph);
source.readAll(bs);
APSP apsp = new APSP();
apsp.init(graph);
apsp.setDirected(false);
apsp.setWeightAttributeName("price");
apsp.compute();