Forum: PC-Programmierung Javascript Verkehrsleitsystem


von Ernst H. (Firma: Laboratorium_S1) (ernst_haft)


Lesenswert?

Hallo,

ich sitze gerade verzweifelnd über folgendem Projekt:

Es geht darum ein Auto (virtuell) von einem Straßenabschnitt zu einem 
Zielabschnitt zu schicken.

Die Straßen sind als Abschnitte bezeichnet. Sie alle sind in einem Array 
("abschnitte") gespeichert. Jeder Abschnitt hat eine eigene individuelle 
Nummer. So sieht der Name eines Abschnitts beispielsweise so aus: a1.

Des weiteren gibt es auch Kreuzungen (korrekterweise sind es eher 
Weichen). Auch diese sind in einem Array gespeichert ("kreuzungen") und 
haben auch eine individuelle Nummer, die nicht die gleichen Nummern der 
Abschnitte sind. Kreuzungen haben beispielsweise den Namen k3. Das k 
steht hierbei für Kreuzung, sodass sie sich von den Abschnitten 
unterscheiden. Es ist nicht möglich, dass es sowohl k2 als auch a2 gibt!

Jede Kreuzung hat drei Attribute. Exemplarisch an Kreuzung k2 wären das:

k2_l - gibt an, wo das Auto hinfahren würde, wenn es nach links fährt.
k2_r - gibt an, wo das Auto hinfahren würde, wenn es nach rechts fährt.
k2 gibt an, ob das Auto nach links oder nach rechts fährt. Immer die 
andere Seite ist gesperrt.

Als Attributwert steht bei allen Attributen ein Abschnitt.

Beispiel für Kreuzung k2:

const k2_l = "w3";
const k2_r = "w1536";
let k2 = "w3";

Von einer Kreuzung bis zur nächsten (also eine Straße) sind alle 
Abschnitte fortlaufend nummeriert.

Ein Auto kann nur vorwärts fahren.

Nun zu meiner Frage:
Wie berechne ich den Weg mit Javascript von einem Abschnitt zu einem 
festgelegten Zielabschnitt, wenn der Weg auch über Kreuzungen gehen 
kann?

Die Ausgabe soll dabei als Array gespeichert sein und alle Abschnitte 
(ausgenommen Kreuzungen) beinhalten, die das Auto passieren muss.

Ohne Kreuzungen hätte ich schon eine Lösung...

Könnt ihr mir helfen?
Vielen Dank vorab und beste Grüße

euer Ernst

: Verschoben durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

Ernst H. schrieb:
> ich sitze gerade verzweifelnd über folgendem Projekt:

s/Projekt/Schulaufgabe/

von Ernst H. (Firma: Laboratorium_S1) (ernst_haft)


Lesenswert?

Harald K. schrieb:
> s/Projekt/Schulaufgabe/

Es ist keine Schulaufgabe. Hätten wir das im Unterricht behandelt, würde 
ich das können.

von Harald K. (kirnbichler)


Lesenswert?

Wäre es ein Projekt, hättest Du eine Vorstellung von dem, was Du 
erreichen willst. Das riecht sehr, sehr streng nach einer von anderen 
gestellten Aufgabe.

Im übrigen ist das der falsche Forenbereich für Deine Fragestellung:

> Hier könnt ihr Projekte, Schaltungen oder Codeschnipsel vorstellen.
> Projekte bitte nur mit Code oder Schaltplan posten (falls ihr nur
> Fotos vorstellen möchtet, bitte in "Zeigt her eure Kunstwerke").
> Bitte hier keine Fragen posten.

von Achim H. (anymouse)


Lesenswert?

Kann das Auto in beide Richtungen über eine Straße fahren? Oder ist das 
dann eine andere Straße?
Falls ja: Was passiert, bzw. wie ist die Notation, wenn das Auto von der 
anderen Seite an eine Weiche kommt? Muss es dann immer den eindeutigen 
Weg nehmen? Oder könnte es an k3 auch von w3 auf w1536 fahren?

Bei der Notation der Weichen fehlt noch die Ausgangsstrecke, d.h. auf 
welcher Straße muss ich sein, damit ich zu k3 komme.

Wäre folgender Semi-Bruteforce-Ansatz möglich:
Schau, ob Start- und Ziel-Strecke identisch sind;
* Falls ja: Fertig.
* Falls nein:
Suche, ob es eine Weiche gibt, bei der ein erlaubter Zweig die Start-, 
ein anderer erlaubter Zweig die Zielstrecke ist;
** Falls ja: Fertig.
** Falls nein: Prüfe für jede Zielstrecke der Weiche an der 
Startstrecke, ob diese zu einer Weiche führt, von der die Zielstrecke 
abgeht.
** Falls ja: Fertig.
** Falls nein: ... usw.

Es gibt dabei natürlich noch Optimierungsmöglichkeiten.

von Ernst H. (Firma: Laboratorium_S1) (ernst_haft)


Lesenswert?

Achim H. schrieb:
> Kann das Auto in beide Richtungen über eine Straße fahren? Oder ist das
> dann eine andere Straße?

Hallo Achim H.,

das Auto kann nur in eine Richtung fahren. Auf einer Straße, wie man sie 
aus der Realität kennt, wäre nun ein Abschnitt die linke Spur, ein 
weiterer Abschnitt die rechte.

Achim H. schrieb:
> Bei der Notation der Weichen fehlt noch die Ausgangsstrecke, d.h. auf
> welcher Straße muss ich sein, damit ich zu k3 komme.

Das habe ich bisher tatsächlich nicht erwähnt:
Bedingt durch die fortlaufende Nummerierung, wissen wir, dass auf 
Abschnitt a3 die Kreuzung k4 folgen kann. So ist es nicht möglich, dass 
nach a3 beispielsweise k546 folgt.

Achim H. schrieb:
> Suche, ob es eine Weiche gibt, bei der ein erlaubter Zweig die Start-,
> ein anderer erlaubter Zweig die Zielstrecke ist;
> ** Falls ja: Fertig.
> ** Falls nein: Prüfe für jede Zielstrecke der Weiche an der
> Startstrecke, ob diese zu einer Weiche führt, von der die Zielstrecke
> abgeht.

Dieser Ansatz hilft sehr. Nun muss ich allerdings darauf achten, dass 
die Zielstrecke nicht zwingend direkt an einer Weiche liegen muss. 
Demzufolge müsste ich von der Zielstrecke rückwärts "fahren" (rein 
virtuell), bis ich zu einer Weiche komme.
Aber das ist dank deiner Hilfestellung eher ein kleineres Problem.

Vielen Dank für die Hilfe!
Ernst H.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Kann es sein, das du den alten A* Algorithmus suchst? Das ist der 
Klassiker für Wegpunkte in der Gamingbranche (und oft auch auf Navis) 
und wird für alles mögliche benutzt (z.B. Autos) um auf einem Netz von 
Wegen den kürzesten und (wenn man die Strecken und Punkte mit Kosten 
beaufschlagt) günstigsten Weg zu finden.
Such mal nach A* und schau, ob das das richtige für dich ist. Ab und zu 
sagt man auch 'AStar'.

: Bearbeitet durch User
von Oliver (imonbln)


Lesenswert?

Für mich klingt das nach einem klassischen Backtrackingalgorithmus.

Was aber deine Beschreibung und Code Beispiele angeht, finde ich die 
suboptimal. Zugeben, ich bin nicht der Javascript Experte, aber ich 
würde erwarten, dass Informationen wie k2_l, k2_r und k2 in einem Objekt 
wie einer Datenklasse gemeinsam gespeichert werden und mit entsprechende 
gettter/setter zur Verfügung stehen.
Das Variablen wie k2 existieren deutet eigentlich schon darauf hin, dass 
es einen Array von ks sein sollte, dann macht es auch nichts, wenn es k2 
&a2 gibt, denn das sind unterschiedliche Entitäten.

von DSGV-Violator (Gast)


Lesenswert?

Lass Dich mal von Dijkstra inspirieren:

https://de.wikipedia.org/wiki/Dijkstra-Algorithmus

Haste Du den Algo in Pseudocode hilft dir bestimmt ein 
Buch/Online-Tutorial weiter das ganze in Java-Script umzu popeln.

--
> Such mal nach A* und schau, ob das das richtige für dich ist. Ab und zu
sagt man auch 'AStar'.
Da gibt es auch mehrere Wikipediaartikel dazu:
 * https://de.wikipedia.org/wiki/A*-Algorithmus
 * https://de.wikipedia.org/wiki/Kategorie:Graphsuchalgorithmus

gilt als Verallgemeinerung des Dijkstra. Vor 10 Jahren war IMHO die 
Beschreibung in der engl. WP besser als die in der deutschsprachigen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Ernst H. schrieb:
> Nun zu meiner Frage:
> Wie berechne ich den Weg mit Javascript von einem Abschnitt zu einem
> festgelegten Zielabschnitt, wenn der Weg auch über Kreuzungen gehen
> kann?

du suchst erst einmal einen Algorithmus, also ein "Rechenverfahren", 
um deine Aufgabenstellung zu lösen.
Zweckmäßigerweise ist das eine Art "Pseudosprache", die erst mal 
allgemein umgangssprachlich (aber dennoch strukturiert) beschreibt, was 
zu tun ist. Beim Beschreiben des Algorithmus werden dir Besonderheiten 
und Einschränkungen des Algorithmus auffallen, dei es zu beachten und zu 
berücksichtigen gilt.

danach suchst du einen Weg, diesen Algorithmus "technisch" in deiner 
Zielsprache (mit dessen Besonderheiten und Einschränkungen) zu 
implementieren.

: Bearbeitet durch User
von Ernst H. (Firma: Laboratorium_S1) (ernst_haft)


Lesenswert?

Hallo.
Seit ich hier das letzte Mal online war, hat sich einiges getan. Ich 
erlaube mir jedoch nicht in chronologischer, sondern auf die Beiträge in 
der Reihenfolge zu antworten, in welcher sie sinngemäß zusammenhängen.

Starten wir also wie folgt:
Oliver schrieb:
> ich
> würde erwarten, dass Informationen wie k2_l, k2_r und k2 in einem Objekt
> wie einer Datenklasse gemeinsam gespeichert werden

Da ich nicht "nur" Javascript verwende, sondern mittels "Node-RED" eine 
MQTT-Anwendung programmiere, in die ich das "Wegesuchsystem" einbette, 
und nicht in jeder "Funktion", in der ich Javascript-Code enthalten habe 
neu Daten zu Kreuzungen und Abschnitten speichern will (die Daten 
zentral zu haben macht es leichter sie im Bedarfsfall zu ändern), 
speichere ich jede Information (z.B. "k2_l", "k2_r", ...) in einer 
einzelnen Variable. So können sich die Programme die Daten "herholen", 
die sie brauchen, ohne lange in Datenstrukturen "herumwühlen" zu müssen.

Matthias S. schrieb:
> Kann es sein, das du den alten A* Algorithmus suchst?

Das kann sehr gut sein. Soweit ich das verstanden habe, braucht der 
Algorithmus einen Parameter "Kosten" (z.B. Weglänge), auf Wikipedia 
"h(x)" genannt. Ich denke, bevor ich den Pseudocode vollends in 
"richtigen" Code umwandle, werde ich mich darauf beschränken, für "h(x)" 
für alle Knoten einen festen Parameter zu verwenden.

Danke an Matthias S., DSGV-Violator,  Wegstaben V und Oliver.
Viele Grüße
von Ernst

von Jr M. (maxie21)


Lesenswert?

Ich arbeite an einer JavaScript-Funktion, die die Summe aller Elemente 
in einem Array berechnen soll. Wenn ich den Code jedoch ausführe, wird 
nicht das erwartete Ergebnis zurückgegeben. Ich habe versucht, es zu 
debuggen, aber ich kann das Problem nicht herausfinden. Kann sich bitte 
jemand meinen Code ansehen und mir helfen, herauszufinden, was das 
Problem verursacht?
1
function calculateSum(arr) {
2
  let sum = 0;
3
  for (let i = 0; i <= arr.length; i++) {
4
    sum += arr[i];
5
  }
6
  return sum;
7
}
8
9
const numbers = [1, 2, 3, 4, 5];
10
const result = calculateSum(numbers);
11
console.log(result); // Output should be 15, but it's not

Ich erwarte, dass die Funktion berechneSum die Summe aller Elemente im 
Zahlenarray zurückgibt, die 15 sein sollte. Die tatsächliche Ausgabe, 
die ich erhalte, ist jedoch anders. Kann mir bitte jemand helfen, 
herauszufinden, was mit meinem Code nicht stimmt, und eine Lösung 
vorschlagen? Danke schön!
Open in Google Translate
•
Feedback

von DSGV-Violator (Gast)


Lesenswert?

off by one

von Ben K. (bkaiser)


Lesenswert?


von Jr M. (maxie21)


Lesenswert?

Ich arbeite an einem kleinen HTML- und JavaScript-Projekt und stoße auf 
ein Problem beim Konvertieren von Zeichenfolgen in Zahlen. Ich habe in 
meinem HTML-Code ein Eingabefeld, in das Benutzer eine Zahl als 
Zeichenfolge eingeben können. Ich verwende JavaScript, um diese 
Zeichenfolge in eine Zahl umzuwandeln und Berechnungen durchzuführen, 
erhalte jedoch nicht die erwarteten Ergebnisse.

Hier ist mein HTML- und JavaScript-Code:
1
<!DOCTYPE html>
2
<html>
3
<head>
4
    <title>String to Number Conversion</title>
5
</head>
6
<body>
7
    <input type="text" id="numberInput" placeholder="Enter a number">
8
    <button onclick="calculate()">Calculate</button>
9
10
    <p id="result"></p>
11
12
    <script>
13
        function calculate() {
14
            let input = document.getElementById("numberInput").value;
15
            let convertedNumber = Number(input);
16
17
            let result = convertedNumber + 10;
18
            document.getElementById("result").textContent = "Result: " + result;
19
        }
20
    </script>
21
</body>
22
</html>

Wenn ich eine Zahl in das Eingabefeld eingebe und auf die Schaltfläche 
„Berechnen“ klicke, ist das Ergebnis nicht wie erwartet. Wenn ich 
beispielsweise „5“ eingebe, wird als Ergebnis „510“ statt „15“ 
angezeigt.Fehlt mir etwas in meinem Code? Wie kann ich sicherstellen, 
dass die Zeichenfolge korrekt in eine Zahl umgewandelt wird, bevor ich 
Berechnungen durchführe? Ich habe auf mehreren Websites gesucht, 
darunter auch auf Scaler, bin aber noch nicht auf eine Lösung gestoßen. 
Ich würde mich über eine klare Erklärung und einige Codebeispiele 
freuen, um die richtigen Verfahren zu zeigen. Ich freue mich schon jetzt 
über Ihre Hilfe!

Scaler: https://www.scaler.com/topics/string-to-number-javascript/

von Peter (pittyj)


Lesenswert?

Jr M. schrieb:
> Ich arbeite an einer JavaScript-Funktion, die die Summe aller Elemente
> in einem Array berechnen soll. Wenn ich den Code jedoch ausführe, wird
> nicht das erwartete Ergebnis zurückgegeben. Ich habe versucht, es zu
> debuggen, aber ich kann das Problem nicht herausfinden. Kann sich bitte
> jemand meinen Code ansehen und mir helfen, herauszufinden, was das
> Problem verursacht?
>
>
1
function calculateSum(arr) {
2
>   let sum = 0;
3
>   for (let i = 0; i <= arr.length; i++) {
4
>     sum += arr[i];
5
>   }
6
>   return sum;
7
> }
8
> 
9
> const numbers = [1, 2, 3, 4, 5];
10
> const result = calculateSum(numbers);
11
> console.log(result); // Output should be 15, but it's not
12
>
>
Früher hätte man in der Schleife auch noch
console.log(i);console.log(arr[i]);console.log(sum);
eingebaut. Und jeder Programmierer hätte seinen Fehler selber erkannt. 
Hätte eine Minute gedauert.
Aber printf-Debugging ist ja sowas von 80er. Heute läßt man im Forum 
seine Fehler suchen. Da bekommt man keine Lösung in 2 Stunden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jr M. schrieb:
> let result = convertedNumber + 10;

Das wirkt offensichtlich als concat für Strings statt als numerische 
Addition. Bin keine Javascript Spezi, aber das Ergebnis spricht dafür.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.