Benni: Prioritäten vergeben nach Werten

Hallo!
Ich bin gerade dabei, einen Backtrackingalgorithmus zu schreiben und dazu will ich für 4 Richtungen Prioriäteten bilden. Also die Richtung mit der höchsten Priorität wird als erstes versucht.
Dazu bilde ich eine Differenz zwischen den Zielkoordinaten und den momentanen Koordinaten mit folgendem Code:

---------------------------------------
  $difference[up] = $y_now - $y_goal;
  $difference[down] = $y_goal - $y_now;
  $difference[left] = $x_now - $x_goal;
  $difference[right] = $x_goal - $x_now;
---------------------------------------

Nun soll die größte Priorität dorthin, wo der Wer der Differenz am größten ist. Die Priorität soll mit den Zahlen 1, 2, 3 und 4 abgespeichert werden in $priority[up/down/right/left].
Ich wüsste zwar, wie man das ganze realisiert mit weiß ich nicht wie vielen If - Überprüfungen, aber irgendwie muss es dafür doch einen besseren Weg geben?

MfG,
Benni

  1. » Ich wüsste zwar, wie man das ganze realisiert mit weiß ich nicht wie vielen If - Überprüfungen, aber irgendwie muss es dafür doch einen besseren Weg geben?

    MfG,
    Benni

    sagt dir bubelsource was?? dann sortiert er dir die 4 werte auf bzw. absteigend (im array) und dann noch ein switch. ansonsten bleibt dir wohl nur die große heilige if verschachtelung

    1. sagt dir bubelsource was?? dann sortiert er dir die 4 werte auf bzw. absteigend (im array) und dann noch ein switch. ansonsten bleibt dir wohl nur die große heilige if verschachtelung

      Nein, sagt mir leider nichts und Google hat auch kein einziges Ergebnis dazu?
      Falls du Bubblesort meinst, das sagt mir schon eher war aber ist das hier denn anwendbar?

      MfG,
      Benni

      1. Bubblesort jupp, srz tip fehler. weis nicht ob das mit assoziativen arrys geht, vll gehts wenn du einen index 1234 für up,down,left,right for das ergebniss stellst dann soll er die zeichen nach dem ersten vergleichen und dann hast dus sortiert nach der höhe und wenn du nur das erste zeichen von array[0] abfragst weist du welche richtung.

  2. aber irgendwie muss es dafür doch einen besseren Weg geben?

    Wieso sortierst du $difference nicht einfach und schreibst die Prioritäten der Reihe nach in $priority?

    http://es2.php.net/manual/de/function.usort.php

    1. Wieso sortierst du $difference nicht einfach und schreibst die Prioritäten der Reihe nach in $priority?

      Nehmen wir mal an, $difference wäre sortiert, dann müsste ich aber trotzdem noch gucken, welches das größte beinhaltet und den entsprechenden Wert in $priority schreiben oder? Das wäre dann wieder die Lösung mit den vielen If - Abfragen...

      MfG,
      Benni

      1. echo $begrueszung;

        Wieso sortierst du $difference nicht einfach und schreibst die Prioritäten der Reihe nach in $priority?

        Nehmen wir mal an, $difference wäre sortiert, dann müsste ich aber trotzdem noch gucken, welches das größte beinhaltet und den entsprechenden Wert in $priority schreiben oder? Das wäre dann wieder die Lösung mit den vielen If - Abfragen...

        Wenn ein Array aufsteigend oder absteigend sortiert ist, sollte doch der größte Wert entweder am Ende oder am Anfang des Array stehen. Und da gibts dann einiges, wie man an den Wert am einen oder anderen Ende gelangen kann: reset(), current(), array_reverse(), max(), min(), ...

        Oder etwa nicht? :-)

        echo "$verabschiedung $name";

        1. echo $begrueszung;

          Wieso sortierst du $difference nicht einfach und schreibst die Prioritäten der Reihe nach in $priority?

          Nehmen wir mal an, $difference wäre sortiert, dann müsste ich aber trotzdem noch gucken, welches das größte beinhaltet und den entsprechenden Wert in $priority schreiben oder? Das wäre dann wieder die Lösung mit den vielen If - Abfragen...

          Wenn ein Array aufsteigend oder absteigend sortiert ist, sollte doch der größte Wert entweder am Ende oder am Anfang des Array stehen. Und da gibts dann einiges, wie man an den Wert am einen oder anderen Ende gelangen kann: reset(), current(), array_reverse(), max(), min(), ...

          Oder etwa nicht? :-)

          echo "$verabschiedung $name";

          Das mit min() und max() hat schon ein wenig geholfen, dankesehr! Ich habe nun eine Lösung aber die ist mir ehrlich gesagt immernoch wesentlich zu lang und unschick...

          Wen's interessiert:

          $minimal = min($difference[up],$difference[down],$difference[left],$difference[right]);
                     if($difference[up] == $minimal) { $priority[up] = 1; }
                else if($difference[down] == $minimal) { $priority[down] = 1; }
                else if($difference[left] == $minimal) { $priority[left] = 1; }
                else if($difference[right] == $minimal) { $priority[right] = 1; }

          $maximal = max($difference[up],$difference[down],$difference[left],$difference[right]);
                     if($difference[up] == $maximal) { $priority[up] = 4; }
                else if($difference[down] == $maximal) { $priority[down] = 4; }
                else if($difference[left] == $maximal) { $priority[left] = 4; }
                else if($difference[right] == $maximal) { $priority[right] = 4; }

          if(empty($priority[up]) && empty($priority[down]))
             {
              if($difference[up] > $difference[down])  {    $priority[up] = 3;    $priority[down] = 2;  }
                    else        {    $priority[up] = 2;    $priority[down] = 3;  }
             }

          if(empty($priority[up]) && empty($priority[left]))
             {
              if($difference[up] > $difference[left])  {    $priority[up] = 3;    $priority[left] = 2;  }
                    else        {    $priority[up] = 2;    $priority[left] = 3;  }
             }

          if(empty($priority[up]) && empty($priority[right]))
             {
              if($difference[up] > $difference[right]) {    $priority[up] = 3;    $priority[right] = 2;  }
                    else        {    $priority[up] = 2;    $priority[right] = 3;  }
             }

          if(empty($priority[down]) && empty($priority[left]))
             {
              if($difference[down] > $difference[left]) {    $priority[down] = 3;    $priority[left] = 2;  }
                    else        {    $priority[down] = 2;    $priority[left] = 3;  }
             }

          if(empty($priority[down]) && empty($priority[right]))
             {
              if($difference[down] > $difference[right]) {    $priority[down] = 3;    $priority[right] = 2;  }
                    else        {    $priority[down] = 2;    $priority[right] = 3;  }
             }

          if(empty($priority[left]) && empty($priority[right]))
             {
              if($difference[left] > $difference[right]) {    $priority[left] = 3;    $priority[right] = 2;  }
                    else        {    $priority[left] = 2;    $priority[right] = 3;  }

          MfG,
          Benni

          1. echo $begrueszung;

            Das mit min() und max() hat schon ein wenig geholfen, dankesehr! Ich habe nun eine Lösung aber die ist mir ehrlich gesagt immernoch wesentlich zu lang und unschick...

            Das ist wirklich sehr umständlich... :-)

            Nachdem du die Differenzen ermittelt hast, hat dein Array $difference 4 Werte in der Form:

            $difference = array(
              up => 26,
              down => 2,
              left => 3,
              right => 42);

            Das musst du nur mit einer passenden Array-Sortier-Funktion (siehe Kapitel Array-Funktionen im PHP-Handbuch), bei der die Zuordnung zwischen Schlüssel und Wert erhalten bleibt, sortieren. Dann bekommst du das:

            $difference = array(
              down => 2,
              left => 3,
              up => 26,
              right => 42);

            Dann gehst du mit foreach über diese Schlüssel-Wert-Paare und lässt dabei einen Zähler hochzählen, den du als Wert für den korrespondierenden Schlüssel in $priority zuweist.

            $prio = 1;
            foreach ($sorted_difference as $key => $value) {
              $priority[$key] = $prio;
              $prio++;
            }

            oder auch noch kürzer dafür aber etwas undurchsichtiger:

            foreach (array_keys($sorted_difference) as $prio => $key)
              $priority[$key] = $prio + 1;

            echo "$verabschiedung $name";