Stau Prognosen

LadyAccess

Mitglied
Hallo Zusammen,

ich bin kein Programmier-Ass...das weiß ich :autsch:
Damit ich endlich mit meiner Masterarbeit beginnen kann muss ich ein Projekt erfolgreich bestehen.

In dem Projekt geht es um Stau Prognosen. Ich soll ein Algorthmus entwickeln, der anhand von Abhängigkeits-Regeln erkennt, dass zB wenn auf der A3 über einen Zeitraum ein Stau existiert, dann nach einer gewissen Zeitdauer auch ein Stau auf der AX entsteht.

Diesen Algorithmus habe ich geschrieben...muss diesen jetzt 'NUR' noch implementieren :bahnhof:

Mir steht eine Datenbank mit folgenden Attributen zur Verfügung:

- Autobahn, Richtung, Anschlussstelle, Stau_Länge, Tiemstamp -


Mein Problem ist im ersten Schritt der Timestamp!!!!

Die Datenbank ist im moment so eingestellt, dass er jede 6 Min Staumeldungen abruft.

Das heißt zu einem Stau der 1 Stunde andauerd existeieren 10 Datensätze.
Ich möchte nun im ersten Schritt den Anfangs- und den Endzeitpunkt eines Staus bestimmen:


- Autobahn, Richtung, Anschlussstelle, Stau_Länge, Staz_Anfang - Stau_Ende-

Ich weiß gar nicht wie ich an die Aufgabe dran gehen soll :(

Ich habe mehrehe Java Tutorials mir Teilweise angeschaut :rtfm: und sehr einfache Programme selbst geschrieben...aber dies ist mir bereits zu hoch :(

Ich wäre euch wirklich dankbar wenn Ihr mir helfen könntet.


Ich möchte zum Schluss sagen, dass es mir wirklich wichtig ist, die codes hier gepostet werden auch zu verstehen... Komme einfach nicht weiter... :noe:
 
Zuletzt bearbeitet von einem Moderator:

ARadauer

Top Contributor
Also den ersten und den letzen Eintrag laden und die Differenz ausrechnen? Woher weißt du ob es der selbe Stau ist?

Bwz was ist die konkrete Frage?

Mir fällt auf: Umso weniger Fragezeichen in der Frage sind umso mehr Fragezeichen gibt es in der Antwort, darüber könnte man mal eine Masterarbeit schreiben ;-)
 

LadyAccess

Mitglied
Erst mal: Vielen Dank für die schnelle Antwort :) !

eine Autobahn definiert sich durch die Attribute Autobahn, Richtung, Anschlussstelle.

Die Datenbank hat beispielsweise folgende Einträge:

Autonbahn Richtung Anschlussstelle Timestamp

A3 Köln Nippes 20.03.2012 09:26:54.768767
A3 Köln Nippes 20.03.2012 09:32:32.878754
A3 Köln Nippes 20.03.2012 09:38:18.658751
A46 Oberhausen Irgendwo 20.03.2012 09:38:18.878754
A3 Köln Nippes 20.03.2012 09:44:38.635751
A3 Köln Nippes 20.03.2012 09:50:28.258751


Wie man sieht zieht die datenbank jede 6 Minuten die aktuellen stau Informationen.
Ich möchte jetzt zu jedem Stau die Start und die Endzeit zu bestimmen.

Die Start und die Endzeit für den Stau auf der A3 wäre hier


Stau_Start Stau_Ende

20.03.2012 09:26:54.... 20.03.2012 09:50:28.....


Die konkrete Frage lautet: Wie berechne ich zu jedem einzelnen Stau die Start - und Endzeit???
 

M_Schaffrath

Aktives Mitglied
Wie liegen die Daten denn vor? Kannst du z.B. einen Datensatz per Java in der Konsole ausgeben und dazu einmal einen kurzen Codeschnipsel von dir posten. Dann kann man sich eher vorstellen, womit du arbeitest.
 

The_S

Top Contributor
Wie liegen die Daten denn vor? Kannst du z.B. einen Datensatz per Java in der Konsole ausgeben und dazu einmal einen kurzen Codeschnipsel von dir posten. Dann kann man sich eher vorstellen, womit du arbeitest.

Ich denke mal als Datensätze in einer Datenbank, wie er schrieb ;)

@LadyAccess

Aus meiner Sicht gibt es zumindest keinen SQL, der dir das Ergebnis direkt liefert. Du müsstest dich bspw. mit einem SQL auf alle Staus an einem Tag auf einer Autobahn konzentrieren. Bei den Daten überprüfen, ob es am Tagesanfang und/oder Tagesende einen Stau gab und dann noch diese Datensätze mitlesen. Dann kannst du iterativ in Java deine Datensätze durchlaufen und wenn ein Eintrag mehr als 6 Minuten nach dem letzten liegt, hast du ein Stauende gefunden. Jeder Datensatz nach einem Stauende bzw. der erste Datensatz ist ein Stauanfang. Der letzte Datensatz ist auch ein Stauende.
 

LadyAccess

Mitglied
Im moment arbeite ich mit einer selbst erstellen .txt Datei. Die genauso aufgebaut ist wie oben geschrieben. Momentan lese ich die Daten aus der .txt Datei und gebe Sie Zeielnweise aus. Mehr hab ich nciht :(

Ich hab das noch nicht nal hinbekommen die Daten zu speichern :(

Die Datenbankanbindung kommt später.
 

LadyAccess

Mitglied
Danke Dir!!!

Die Idee ist super und einleuchtend. Wenn ein Stau länger als 6 min zurückliegt, dann handelt es sich um eienn neuen Stau. Perfect!

Aber wie implementiere ich das jetzt...

Habt Ihr irgendwas ähnliches 'irgendwo', woran ich mich orientieren kann?
 

The_S

Top Contributor
Dann besteht der erste Schritt, wenn die Datenquelle später ausgetauscht werden soll, ein DAO mit entsprechender Schnittstelle zu erstellen. Dieses DAO liest die Daten aus der Textdatei (später wird ein anderes DAO mit identischer Schnittstelle und Datenquelle Datenbank eingesetzt) ein und wandelt es in eine Liste mit Java-Objekten, die einen Datensatz der Datenquelle repräsentieren, um. Danach kannst du so vorgehen, wie ich es beschrieben habe.
 

timbeau

Gesperrter Benutzer
@Slater: Ich entschuldige mich für meinen wohl zu lockeren Spruch

@Lady: Datumspielereien

Java:
package dates;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class DateTests {

	private static final SimpleDateFormat formatter = new SimpleDateFormat(
			"dd.MM.yyyy hh:mm:ss", Locale.GERMANY);

	public static void main(String[] args) throws ParseException {
		String d1 = "20.03.2012 09:26:54";
		String d2 = "20.03.2012 09:50:28";
		Date date1 = getDate(d1);
		System.out.println(formateDate(date1));
		Date date2 = getDate(d2);
		System.out.println(formateDate(date2));

		GregorianCalendar gc1 = new GregorianCalendar(Locale.GERMANY);
		gc1.setTime(date1);
		GregorianCalendar gc2 = new GregorianCalendar(Locale.GERMANY);
		gc2.setTime(date2);

		long time = gc2.getTime().getTime() - gc1.getTime().getTime(); // Differenz
																		// in ms
		long minutes = Math.round((double) time / (60 * 1000));
		System.out.println("Zeit-Differenz in Minuten: " + minutes);

	}

	/**
	 * @param datumsString
	 *            - geparster String
	 * @return ein "Date" Objekt oder null wenn <br>
	 *         der Datumsstring nicht gelesen werden konnte
	 */
	private static Date getDate(String datumsString) {
		try {
			return (Date) formatter.parse(datumsString);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Formatiert das Datum, nicht unbedingt nötig
	 * @param date
	 * @return
	 */
	private static String formateDate(Date date) {
		return formatter.format(date);
	}

}

Einlesen und auslesen von der Textdatei kriegst du ja hin, Zeilen kannst du mit .split aufteilen
 

LadyAccess

Mitglied
@timbeau

was macht dieses Programm genau?

Wenn ich das richtig seheg muss man ja in der main Methode selbst das Datum eingeben.:

public static void main(String[] args) throws ParseException {
String d1 = "20.03.2012 09:26:54";
String d2 = "20.03.2012 09:50:28";
.....


So wie ich das verstehe, gibt es mir nicht an, wann ein Stau beginnt und endet.


Ich versuche grade den Algorithmus von The_S zu implementieren.
Das ist genau das was ich im ersten schritt brauche.
Aber ich krieg das einfach nciht hin....puuh...???:L


@ARadauer
..... frag nicht....:oops:
 

timbeau

Gesperrter Benutzer
Also ich behaupte, dass du dieses ganze Programm nie alleine hinbekommst. Ich weiß nicht, was man bei euch können sollte aber die Frage von wegen "main-Methode" und dem Rest ist schon hart.

Aber ich versuchs mal. Du hast irgendwo Daten. Diese Daten liest du aus. Wie genau zeigst du nicht. Ich nehme mal an Zeilenweise. Dann hast du sowas wie oben A3 etc. Diese Zeile musst du auswerten. Mit Split, Regex, Substring etc. Dann hast du auch die 2 Datumsstrings. Jetzt kannst du aus meiner "main" eine "nicht-main" Methode machen und dieser die Strings übergeben. Diese sagt dir dann wieviele Minuten z.B. die 2 Daten auseinanderliegen.

Sowas umzusetzen dauert ca 30 Minuten als Anfänger. Nicht verzweifeln aber wenn das Programm jmd komplett schreiben soll würde ich mal in der Jobbörse posten.
 

ARadauer

Top Contributor
Wenn ich ehrlich bin finde ich das schon einwenig krass... Ich sag ja nix wenn sich irgendwelche medien designer mal eine hausübung kopieren. Aber die Masterarbeit sollte man schon selber schreibn...
 

LadyAccess

Mitglied
@ARadauer

Sorry...aber Du solltest in Zukunft die Beiträge etwas genauer lesen.

Hier geht es NICHT um meine Masterarbeit.

Es handelt sich hier lediglich um eine unbenotete Projektarbeit!

Wenn Du mir eh nicht helfen kannst oder willst solletst Du vielleicht zumindest hier keine Beiträge posten.

Danke
 

VfL_Freak

Top Contributor
Moin,

Sorry...aber Du solltest in Zukunft die Beiträge etwas genauer lesen.
Hier geht es NICHT um meine Masterarbeit.
Es handelt sich hier lediglich um eine unbenotete Projektarbeit!

Wenn Du mir eh nicht helfen kannst oder willst solletst Du vielleicht zumindest hier keine Beiträge posten.
ok, das habe ich jetzt auch erst beim dritten Lesen so verstanden ...... :autsch:

Im übrigen finde ich aber, das ARadauer völlig Recht hat !
Im übrigen gäbe es hier auch die Jobbörse ......... :noe:

Gruß
Klaus
 

LadyAccess

Mitglied
natürlich hat er recht wenn man hier generell etwas kopiert und es als sein eigenes werk verkauft.
egal ob es sich um eine masterarbeit, eine projektarbeit oder eine billige hausaufgabe handelt.

ich möchte doch einfach nur wissen wie ich das programmieren soll.

ich möchte doch nichts fertiges!

und im übrigen leute.... das ist ja wirklich nur der erste schritt meiner aufgabe.

der hauptteil des programmierens kommt ja noch!

aber damit ich mich überhaupt an die berechnung machen kann benötige ich die information wann ein stau beginnt und wann eins endet.

also bitte nur die leute posten, die mir auch wirklich helfen wollen und nicht irgendeine blöde predigt halten wollen!

danke
 

timbeau

Gesperrter Benutzer
Wie wärs wenn du mal mit programmieren anfängst und dann hier zeigst.

Und dann mal mit Programmtechnischen Fragen ankommst und nicht mit "ich weiß nicht wie ich anfangen soll"...


Aller Anfang eines Programms ist die Main
 

LadyAccess

Mitglied
ok, ich stelle mein progrämmchen heute abend rein wenn ich zuhause bin... und dann???

ich hab es bisher nur geschafft meine txt datei ein und auszulesen.


ich dachte ihr könntet mir tipps geben wie ich anfangen soll...
habe gedacht dass es hier bereits was ähnlicehs wie meine aufgabe gibt....woran ich mich orientieren kann...

irgendwas was mir weiterhilft...


sorry dass ich noch kein programmier- ass bin!

anscheinend ist das hier ein treff für leute die das eh schon können.

bravo
 

The_S

Top Contributor
Ich weiß jetzt nicht, ob du dich auf meinen Beitrag beziehst, aber irgendwie ist keine konkrete Frage rausgekommen bzw. habe ich zumindest keine gesehen. Gleichzeitig wirkst du aber auch ziemlich hilflos. Deshalb meine Nachfrage. Hatte keinen negativen Hintergedanken.
 

LadyAccess

Mitglied
@The_S

danke dir... irgendwie habe ich das gefühl, dass du der einzige bist, der mir irgendwie helfen möchte...

du hast auch recht...ich bin ehrlich etwas verzweifelt...

ich hänge schon seit 2 wochen an dem programm...habe mir verschiedene implementierungen von diversen algorithmen angesehen, aber das hat mir nicht weitergeholfen.

deine idee mit der 6 minuten prüfung ist genau der richtige ansatz!

ich möchte jetzt nur noch wissen wie ich anfangen soll das zu programmieren....

mir würde es auch wirklich weiterhelfen wenn ihr irgendwas ähnliches habt woran ich mich orientieren kann...

wenn ich diesen teil habe muss ich dann meinen modifizierten assoziationsalgorithmus implemntieren...das wird das schwierigste...aber hauptsache ich habe schon mal etwas womit ich was anfangen kann und darauf aufbauen kann :(


danke nochmal...
 

The_S

Top Contributor
Du musst die Datei zeilenweise einlesen, das bekommst du hin, oder? Dann hast du ja die Daten in einem String. Dann musst du die einzelnen Daten aus dem String extrahieren. Bspw. mit einem regulären Ausdruck, split oder mit substring und length. Sobald du alle relevanten Daten einzeln ausgeben kannst, schauen wir weiter.
 

LadyAccess

Mitglied
ok. dass mit den Datei zeilenweise einlesen habe ich. das poste ich heute abend daa auch, ob ich das wirklich so richtig gemacht habe wie du das auch meinst...

gut u´nd jetzt muss ich die daten aus dem string extrahieren sagst du...

das werde ich mir auch heute anschauen und hoffentlich irgendwie hinbekommen... :rtfm:

danke dir...jetzt bin ich wieder etwas zuversichtlicher... :)
 

timbeau

Gesperrter Benutzer
Aktuell wäre die einzige Hilfe die man dir anbieten kann

a) alles selber zu machen
b) dir die Insel ab Kapitel 1 zu empfehlen.

Du reagierst pampig, weil nicht das kommt, was du dir wünschst. Aber du gehst ja auch nicht in ein Autohaus und sagst du brauchst jetzt ein spezielles Auto und das bitte umsonst und eigentlich sollten die im Autohaus wissen was du brauchst um Aufgabe XYZ zu erledigen.

Ein Codebeispiel hast du auch nicht gepostet. Daran könnte man ja schonmal teilweise was sehen. Z.B. die Stringextraktion.
 
P

pappawinni

Gast
Also ich komm da nicht mit..;(
Anfangs hiess es noch, dass
"- Autobahn, Richtung, Anschlussstelle, Stau_Länge, Timestamp - "
erfasst würden.
Demnach hätte es in der gegebenen Liste überhaupt keinen Stau gegeben, oder?
Ich könnte mir denken, dass die Staulänge doch auch Einfluss auf potentiell folgende Staus haben könnte. Wo aber ist die Staulänge hin gekommen ???:L
 

axelg

Neues Mitglied
Wenn man die Richtung an der Anschlussstelle noch beruecksichtigt waere das doch ein nettes EJB Modul, dass mit einem Timer die Datenbank ueberwacht, oder habe ich da was uebersehen?
gruss axelg
 

LadyAccess

Mitglied
Daswas ich bisher habe ist folgendes:


import java.io.*;


public class StauPrognose {

public static void main (String[] args) throws IOException, FileNotFoundException
{
try {
BufferedReader in = new BufferedReader(new FileReader("stau.txt"));
String zeile = null;
while ((zeile = in.readLine()) != null) {
System.out.println("Gelesene Zeile: " + zeile);
}
} catch (IOException e) {
e.printStackTrace();
}
}

}





ich probiere jetzt mal den string zu cutten...oder???
 

LadyAccess

Mitglied
stimmt... die Information der Stau_Länge habe ich für mein Algorithmus jetzt nicht genommen...das wäre auch sehr interessant.

Zur Zeit arbeitet mein Algorithmus mit den Informationen: Autobahn, Richtung, Anschlussstelle und Timestamp.

Ein Stau wird durch die 3 Attribute Autobahn, Richtung, Anschlussstelle definiert (man kann ja nicht einfach sagen: 10 km Stau auf der A3.... Ja aber wo auf der A3 bitte???? - deswegen die weiteren Informationen )

Die Information wie lang ein Stau ist könnte auch sehr interessant sein. Wüssete aber im moment nicht ob ich es in den jetzigen Algo. rein packen könnte, oder ob ich einen weiteren Algo. dafür schreiben würde.

Aber ich muss erst mal den ersten Algo. implementieren bevor ich mich überhaupt über andere Ideen nachdenken kann.

Danke Dir :)
 

axelg

Neues Mitglied
Was haelst du davon, deine eingelesene Zeile mit der split Methode des Strings zeile zu zerlegen? Eine, nicht gerade professionelle Zerlegung, deiner Zeile koennte so aussehen:
Java:
while ((zeile = in.readLine()) != null) {
                System.out.println("Gelesene Zeile: " + zeile);
                String[] splitArray = zeile.split(" ");
                
                String autobahn = splitArray[0];
                System.out.println("Autobahn: " + autobahn);
                StringBuilder anschlussstelleStrBuild = new StringBuilder(splitArray[1]);
                for(int i=2;i<(splitArray.length-2);++i){
                    anschlussstelleStrBuild.append(" ");
                    anschlussstelleStrBuild.append(splitArray[i]);                    
                } 
                String anschlussstelle = anschlussstelleStrBuild.toString();
                System.out.println("Anschlussstelle: " + anschlussstelle);                 
                String datumAsStr = splitArray[(splitArray.length-2)] + " " + splitArray[(splitArray.length-1)];
                System.out.println("Timestamp String: " + datumAsStr);                
            }
Ich gehe davon aus, dass die Zeile immer die Autobahnbezeichnung, eine Anschlussstelle und einen Timestamp wie im Beispiel hat.
 
Zuletzt bearbeitet:

LadyAccess

Mitglied
Hi Axelg :)

danke Dir.

Ich versuche den Code in meinen Code einzubringen.

Freu mich so dass man hier echt hilft :)

Habe noch bis Ende April Zeit für die Projektarbeit. Zum ersten mal seit 3 Wochen (nach dem Frtigstellen meines Algorithmus) bin ich wieder zuversichtlich :)
 

LadyAccess

Mitglied
Meine Beispiel .Txt Datei ist folgendermaßen aufgebaut

Autobahn Anschlussstelle Timestamp
A3 Würzburg 03.03.2011 12:23:23.898765
A3 Oberhausen 03.03.2011 12:23:23.898765
A3 Oberhausen 03.03.2011 12:23:23.898765
A1 Duisburg 03.03.2011 12:23:23.898766
A45 Krefeld 03.03.2011 12:23:23.898765
A3 Frankfurt 03.03.2011 12:23:23.898765
A45 Krefeld 03.03.2011 12:23:23.898765
A34 Dortmund 03.03.2011 12:23:23.898765
A1 Trier 03.03.2011 12:23:23.898765
A33 Dresden 03.03.2011 12:23:23.898765

Habe irgendein Timestap genommen.

Habe ich txt Datei vielleicht falsch aufgebaut???
 

LadyAccess

Mitglied
So habe den code etwas umgeändert:


import java.io.*;


public class StauPrognose {

public static void main (String[] args) throws IOException, FileNotFoundException
{
try {
BufferedReader in = new BufferedReader(new FileReader("stau.txt"));
String zeile = null;
while ((zeile = in.readLine()) != null) {
System.out.println("Gelesene Zeile: " + zeile);
}
} catch (IOException e) {
e.printStackTrace();
}
}
{


String zeile;
BufferedReader in = null;
try {
while ((zeile = in.readLine()) != null) {
System.out.println("Gelesene Zeile: " + zeile);
String[] splitArray = zeile.split(" ");

String autobahn = splitArray[0];
System.out.println("Autobahn: " + autobahn);
StringBuilder anschlussstelleStrBuild = new StringBuilder(splitArray[1]);
for(int i=2;i<(splitArray.length-2);++i){
anschlussstelleStrBuild.append(" ");
anschlussstelleStrBuild.append(splitArray);
}
String anschlussstelle = anschlussstelleStrBuild.toString();
System.out.println("Anschlussstelle: " + anschlussstelle);
String datumAsStr = splitArray[(splitArray.length-2)] + " " + splitArray[(splitArray.length-1)];
System.out.println("Timestamp String: " + datumAsStr);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}
}



Die Ausgabe dazu sieht folgendermaßen aus:


Gelesene Zeile:
Gelesene Zeile: Autobahn Anschlussstelle Timestamp
Gelesene Zeile: A3 Würzburg 03.03.2011 12:23:23.898765
Gelesene Zeile: A3 Oberhausen 03.03.2011 12:23:23.898765
Gelesene Zeile: A3 Oberhausen 03.03.2011 12:23:23.898765
Gelesene Zeile: A1 Duisburg 03.03.2011 12:23:23.898766
Gelesene Zeile: A45 Krefeld 03.03.2011 12:23:23.898765
Gelesene Zeile: A3 Frankfurt 03.03.2011 12:23:23.898765
Gelesene Zeile: A45 Krefeld 03.03.2011 12:23:23.898765
Gelesene Zeile: A34 Dortmund 03.03.2011 12:23:23.898765
Gelesene Zeile: A1 Trier 03.03.2011 12:23:23.898765
Gelesene Zeile: A33 Dresden 03.03.2011 12:23:23.898765


Kann ich damit jetzt die Anfangszeit und die Endzeit eines Staus berechnen???
 

timbeau

Gesperrter Benutzer
Siehst du die große rote Schrift wenn du etwas postest?

Und was soll die Frage, ob du die Staulänge bzw die Staudauer berechnen kannst? Schau dir doch mal deine Timestamps an. Fällt dir dabei was auf?
 

LadyAccess

Mitglied
Oh sorry, habe jetzt die 'große rote Schrift' gesehen... werde ich beim nächsten posten von code beachten.

Ich weiß, dass die Timestamps alle gelich sind. Das ist auch nur ein Beispiel txt.

Ich muss jetzt zu einem stau den anfangs- und den endzeitpunkt berechnen.

Wie schon erwähnt wird jede 6 min staumeldungen abgerufen. Die Idee von TheS war schon sehr gut.

Im Grunde genommen, muss ich zeilenweise vorgehen.
Gehe jede Zeile durch, schau ob es sich um die selbe Autobahn handelt und der Timestamp nicht größer als 6 min von dem vorherigen Stau entfernt liegt. Wenn doch handelt es sich um einen neuen stau...
 

Neue Themen


Oben