Javascript Verkehrsleitsystem

OP (Firma: Laboratorium_S1) #7434639
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

#7434658
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.

#7434690
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.

OP (Firma: Laboratorium_S1) #7435071
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.

(Firma: matzetronics) #7436935
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'.

#7437106
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.

Gast #7437117
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:

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

#7437133
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.

OP (Firma: Laboratorium_S1) #7441871
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 im Beitrag #7437106:

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

#7467692
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

#7485016
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/

#7485102
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren