Java Unterschiedliche Resultate je nach Run

Eggcake

Commodore
Registriert
Juni 2007
Beiträge
4.837
Hallo zusammen

Ich bin derzeit an meiner Masterarbeit dran (mit dem Programmierteil praktisch fertig, danach nur noch schreiben) und entdecke erst jetzt einen etwas übleren Bug.
Mein Programm ist schon relativ gross und komplex, grundsätzlich geht es mir erstmal gar nicht darum den Fehler spezifisch zu finden sondern einzugrenzen und vielleicht kann mir jemand einen Hinweis geben wo das Problem liegen könnte.

Was ich genau mache ist erstmal, wie gesagt, nicht so wichtig. Kurz gesagt, ich benutze die Geotools Library um ein Shapefile einzulesen, bilde einen Graphen, gruppiere die Kanten nach gewissen Kriterien zusammen und bilde danach den dualen Graphen davon (Algo geht noch viel weiter, aber hier entsteht dann das Problem). Danach berechne ich gewisse Zentralitätsmasse für die Knoten des dualen Graphen und genau hier entsteht das folgende Problem:

Ich habe also einen (dualen) Graphen, wo für jeden Knoten ein gewisser Wert berechnet wird. Jetzt ist mir (keine Ahnung warum erst jetzt, das finde ich daran eben auch sehr merkwürdig) aufgefallen, dass die Resultate nicht immer gleich sind. Also habe ich bei jedem Durchgang die Summe der Werte aller Knoten berechnet und siehe da, die Werte sind nicht konsistent. Meistens entsteht ein gewisser Wert, doch jeder 2.-3. Durchgang entsteht ein anderer.

Und jetzt das, meiner Meinung nach, verdammt merkwürdige (was auch den Grund darstellt dass ich dachte, ich hätte den Bug gefixt gehabt) :
Diese Unterschiede bestehen nur, wenn ich das Programm manuell mehrfach laufen lasse, wenn ich über eine zweite Main-Methode das Programm mehrfach laufen lasse (über eine for-schleife die Main-Methode mehrfach aufrufe) sind die Resultate konstant

Meine Frage ist deshalb, an was das eurer Meinung nach liegen könnte. Primär geht es darum die Problemsuche einzugrenzen. Mein erster Gedanke war, dass es etwas mit einer Random-Funktion zu tun hat. Ich benutze Random für die hashcode()-Funktion, da ich gewisse Sets benutze. Da die Seeds afaik währenddem die JVM läuft konstant bleiben, entstehen dann keine Unterschiede...hat sonst noch jemand eine Idee?
 
Zuletzt bearbeitet:
Wenn du das Programm aufrufst wird doch auch jedesmal eine neue JVM generiert? Einfach den Seed fix initialisieren. Ist dann natürlich nicht mehr zufällig.
Zweite Möglichkeit die mir einfällt ist eine uninitialisierte Variable. Das wäre aber eher ein Bug der JVM denke ich.
 
Nur, wenn ich das Programm manuell mehrfach aufrufe (und nur dann gibt es ja unterschiedliche Werte). Wenn ich über eine for-Schleife einfach die Main-Methode mehrfach aufrufe wird keine neue JVM generiert.
 
Benutzt du irgendwo im Code Backtracking vielleicht?
 
Nein... :/

Ich habe so extrem viel Zeit damit verbracht am falschen Ort zu suchen, ist langsam zum heulen. Ein Teil wird auch multithreaded berechnet, also dachte ich zuerst direkt "Aha!"...denkste.
 
Ohne zu wissen Welche berechnungen du genau anstellst ist das die Suche nach der Nadel im Void....

Hash codes ändern sich natürlich - ausser du implementierst die hash funktion selber nach einem bestimmten schema.....

Ich würde mal mit mehr infos rüberkommen sonst kann man hier nur raten ohne wirklich anhaltspunkte zu haben..
 
Fehler wohl gefunden...lag tatsächlich an einem HashCode bzw. equalsTo-Methode.
Allerdings nicht von mir, sondern von der GeoTools Library. Wird mir eine Lehre sein denen blind zu vertrauen - muss ich das Ganze eben über eine Wrapperklasse machen.
Ergänzung ()

Eine kleine Randbemerkung:

Die Resultate sind jetzt konsistent, aber je nachdem wie ich das Ganze z.B. zusammenzähle, erhalte ich unterschiedliche Resultate (Differenzen ab der ~8. Kommastelle). Das liegt aber daran, dass Rundungsfehler entstehen.

Das heisst: wenn ich eine ArrayList mit 50k Doubles habe und die Summe davon berechne, kann ich je nachdem wie die Liste sortiert ist ein anderes Resultat erhalten.


Nur so als Nebenbemerkung - das ist normal (wenn man Doubles verwendet).
 
Eggcake schrieb:
Die Resultate sind jetzt konsistent, aber je nachdem wie ich das Ganze z.B. zusammenzähle, erhalte ich unterschiedliche Resultate (Differenzen ab der ~8. Kommastelle). Das liegt aber daran, dass Rundungsfehler entstehen.

Das heisst: wenn ich eine ArrayList mit 50k Doubles habe und die Summe davon berechne, kann ich je nachdem wie die Liste sortiert ist ein anderes Resultat erhalten.


Nur so als Nebenbemerkung - das ist normal (wenn man Doubles verwendet).

Das ist normal, weil nicht jede Zahl in Double darstellbar ist. Addierst du in anderer Reihenfolge, so treten diese Zahlen, die gerundet werden müssen, an unterschiedlichen Stellen auf und dann hast du natürlich ein anderes Ergebnis.

Eventuell auf BigDecimal oder so umsteigen. Dann hast du das mit der Genauigkeit, aber das Programm wird um einiges langsamer.
 
Zurück
Oben