Algorithmus zum verteilen von Wahlen mit 1. Wahl, 2. Wahl und 3. Wahl

Nikke123

Mitglied
Hallo Leute,

Ich bin daran ein System für Schulen zu entwickeln, mit dessen Hilfe Schüler für Online eingestellte Projekte ihre 1., 2. und 3. Wahl abgeben können. Ein Algorithmus, der mit 50 Zufallsdurchgängen berechnet, in welches Projekt jeder bekommt, sucht sich dann aus diesen 50 zuordnungen die beste aus. Das ist mein Vorschlag, der aber nicht geht, da die Seite einfach immer nur am Laden ist und nicht passiert kann ich auch keine Fehlermeldung lesen, da es keine gibt.

PHP:
<?php
tabellen_kopieren_algorithmus();

for($i_haupt = 0; $i_haupt < 5; $i_haupt++){

	$zaehlvar_1 = 0; // Variable 1 für Punktzahl für beste Zuteilung
	$zaehlvar_2 = 0; // Variable 2 für Punktzahl für beste Zuteilung
	$nutz_tabelle = 1; // Tabelle die genutzt wird
	$punkte_zaehl_variable;
	$faktor = 3;

	for($i_i = 1; $i_i < 4; $i_i++){
		
		$i_ii = 1;
		$sql_projekte = "SELECT * FROM algorithmus_projekte_".$nutz_tabelle."";
		$query_projekte = mysql_query($sql_projekte) or die(mysql_error());
		$anzahl_projekte = mysql_num_rows($query_projekte);
	// Alle Projekte werden geladen
		while($erg_projekte = mysql_fetch_assoc($query_projekte)){
			$sql_benutzer_wahl1 = "SELECT * FROM algorithmus_benutzer_".$nutz_tabelle." WHERE wahl_".$i_ii." = ".$erg_projekte['id']." AND projekt_final = 0";
			$query_benutzer_wahl1 = mysql_query($sql_benutzer_wahl1) or die(mysql_error());
	//Benutzer die noch kein Projekt haben werden geladen
			$anzahl_benutzer = mysql_num_rows($query_benutzer_wahl1);
	
			if($anzahl_benutzer == $erg_projekte['freie_plaetze']){
	
				$sql_benutzer_wahl1_zuteilung = "UPDATE algorithmus_benutzer_".$nutz_tabelle." SET projekt_final = ".$erg_projekte['id']." WHERE wahl_".$i_ii." = ".$erg_projekte['id']."";
				mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
			//Wenn die Anzahl der Benutzer die ein Projekt gewählt haben gleich der Anzahl 
// Der anzahl der freien plätze ist, werden allen schülern das projekt zugewiesen
				$sql_projekte_freieplaetze_update = "UPDATE algorithmus_projekte_".$nutz_tabelle." SET freie_plaetze = 0 WHERE id = ".$erg_projekte['id']."";
				mysql_query($sql_projekte_freieplaetze_update) or die(mysql_error());
			
				$zaehlvar_1 += ($anzahl_benutzer*$faktor);
		
			}else if($anzahl_benutzer > $erg_projekte['freie_plaetze']){
		
				$x = 0;
				while($erg_benutzer = mysql_fetch_assoc($query_benutzer_wahl1)){
					$benutzer_zufall[$x][0] = $erg_benutzer['benutzername'];
					$x ++;
				}
		
				for($i_1 = 1; $i_1 <= $erg_projekte['freie_plaetze']; $i_1++){
					$bool_benutzername_belegt = true;
					$i_2;
					while($bool_benutzername_belegt == true){
						$i_2 = mt_rand(0, $anzahl_benutzer);
						if(isset($benutzer_zufall[$i_2][1])){
							$bool_benutzername_belegt == true;
						}else{
							$bool_benutzername_belegt == false;
						}
					} // Wenn mehr Benutzer ein Projekt haben wollen werden die in ein 
// nummerisches Array gepackt und dann zufällig so viele benutzer ausgewählt, wie wir freie
// plätze haben 
					$sql_benutzer_zufall_zuweisung = "UPDATE algorithmus_benutzer_".$nutz_tabelle." SET projekt_final = ".$erg_projekte['id']." WHERE benutzername = '".$benutzer_zufall[$i_2][0]."'";
					mysql_query($sql_benutzer_zufall_zuweisung) or die(mysql_error());
					$sql_projekte_freie_plaetze_update = "SELECT * FROM algorithmus_projekte_".$nutz_tabelle." WHERE id = ".$erg_projekte['id']."";
					$query_projekte_freie_plaetze_update = mysql_query($sql_projekte_freie_plaetze_update) or die(mysql_error());
					$erg_projekte_freie_plaetze_update = mysql_fetch_assoc();
					$sql_freie_plaetze_set = "UPDATE algorithmus_projekte_".$nutz_tabelle." SET freie_plaetze = ".($erg_projekte_freie_plaetze_update['freie_plaetze'] - 1)." WHERE id = ".$erg_projekte['id']."";
					mysql_query($sql_freie_plaetze_set) or die(mysql_error());
					$zaehlvar_1 += $faktor;
				}
		
				$sql_projekte_freieplaetze_update = "UPDATE algorithmus_projekte_".$nutz_tabelle." SET freie_plaetze = 0 WHERE id = ".$erg_projekte['id']."";
				mysql_query($sql_projekte_freieplaetze_update) or die(mysql_error());
		
			}else if($anzahl_benutzer < $erg_projekte['freie_plaetze']){
				$sql_benutzer_wahl1_zuteilung = "UPDATE algorithmus_benutzer_".$nutz_tabelle." SET projekt_final = ".$erg_projekte['id']." WHERE wahl_".$i_ii." = ".$erg_projekte['id']."";
				mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
		
				$sql_freieplaetze_update = "UPDATE algorithmus_projekte_".$nutz_tabelle." SET freie_plaetze = ".(($erg_projekte['freie_plaetze']) - ($anzahl_benutzer))."";
				mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
			
		 		$zaehlvar_1 +=($anzahl_benutzer*$faktor);
			}
		}
	$i_ii ++;
	$faktor --;
	}
	
	
	echo $zaehlvar_1;
	echo "<br>";
	
	if($zaehlvar_1 > $zaehlvar_2){ // Wenn die Punktzahl höher ist als die vorherige wird die jetzige konstellation gesichert
		$zaehlvar_2 = $zaehlvar_1;
		if($nutz_tabelle == 1){
			$nutz_tabelle = 2;
			$sql = "DROP TABLE algorithmus_benutzer_".$nutz_tabelle."";
			mysql_query($sql) or die(mysql_error());
		}else if($nutz_tabelle == 2){
			$nutz_tabelle = 1;
			$sql = "DROP TABLE algorithmus_benutzer_".$nutz_tabelle."";
			mysql_query($sql) or die(mysql_error());
		}
	}else{
	$sql = "DROP TABLE algorithmus_benutzer_".$nutz_tabelle."";
	mysql_query($sql) or die(mysql_error());
	}
	
	tabellen_kopieren_algorithmus();

}
PHP:
function tabellen_kopieren_algorithmus(){

	$sql_tabelle_kopieren_benutzer = "CREATE TABLE IF NOT EXISTS algorithmus_benutzer_1 AS SELECT * FROM benutzer";
	mysql_query($sql_tabelle_kopieren_benutzer) or die(mysql_error());

	$sql_tabelle_kopieren_projekte = "CREATE TABLE IF NOT EXISTS algorithmus_projekte_1 AS SELECT * FROM projekte";
	mysql_query($sql_tabelle_kopieren_projekte) or die(mysql_error());
	
	$sql_tabelle_kopieren_benutzer = "CREATE TABLE IF NOT EXISTS algorithmus_benutzer_2 AS SELECT * FROM benutzer";
	mysql_query($sql_tabelle_kopieren_benutzer) or die(mysql_error());

	$sql_tabelle_kopieren_projekte = "CREATE TABLE IF NOT EXISTS algorithmus_projekte_2 AS SELECT * FROM projekte";
	mysql_query($sql_tabelle_kopieren_projekte) or die(mysql_error());
	
}

P.S.: Jeder Schueler der seine erstwahl bekommt, bekommt 3 Punkte, seine 2. Wahl 2 Punkte und drittwahl 1 Punkt

Über eure Hilfe wäre ich sehr dankbar
Grüße
Niklas
 
Zuletzt bearbeitet:
Bitte schreib mal einige Komentare in den Code, damit wir ev. nachvollziehen können was da eigentlich abgehen soll.

Und willst du wirklich dauernd neue Tabellen erstellen? Ich rate davon ab.
 
Auf den ersten Blick konnte ich den Fehler noch nicht finden. Aber ein Tipp für die Zukunft. Benenne die Variablen beim Namen. $iWahl anstelle von $i_i.

Frage: Was soll $i_ii bewirken? Die sit doch immer gleich der $i_i.
 
Ich sehe grade, dass du vollkommen Recht hast, das ist das gleiche. Es gibt halt 3 Wahlen und für Wahl1 und Wahl2 und Wahl3 soll das jeweils stehen. Ich habe aber nach einem ganzen Tag Coden, wohl den Wald vor lauter Bäumen aus der Sicht verloren.
 
Ich habe glaube ich den Fehler eingrenzen können. Nach Überschreitung der max_execution_time endet der hier bei ausführung des Scriptes:
PHP:
else if($anzahl_benutzer > $erg_projekte['freie_plaetze']){
		
				$x = 0;
				while($erg_benutzer = mysql_fetch_assoc($query_benutzer_wahl1)){
					$benutzer_zufall[$x][0] = $erg_benutzer['benutzername'];
					$x ++;
				}
		
				for($i_1 = 1; $i_1 <= $erg_projekte['freie_plaetze']; $i_1++){
					$bool_benutzername_belegt = true;
					$i_2;
					while($bool_benutzername_belegt == true){
						$i_2 = mt_rand(0, $anzahl_benutzer);
						if(isset($benutzer_zufall[$i_2][1])){
							$bool_benutzername_belegt == true; // HIER ENDET DER!
						}else{
							$bool_benutzername_belegt == false;
							$benutzer_zufall[$i_2][1] = 1;
						}
					}
					$sql_benutzer_zufall_zuweisung = "UPDATE algorithmus_benutzer_".$nutz_tabelle." SET projekt_final = ".$erg_projekte['id']." WHERE benutzername = '".$benutzer_zufall[$i_2][0]."'";
					mysql_query($sql_benutzer_zufall_zuweisung) or die(mysql_error());
					$sql_projekte_freie_plaetze_update = "SELECT * FROM algorithmus_projekte_".$nutz_tabelle." WHERE id = ".$erg_projekte['id']."";
					$query_projekte_freie_plaetze_update = mysql_query($sql_projekte_freie_plaetze_update) or die(mysql_error());
					$erg_projekte_freie_plaetze_update = mysql_fetch_assoc();
					$sql_freie_plaetze_set = "UPDATE algorithmus_projekte_".$nutz_tabelle." SET freie_plaetze = ".($erg_projekte_freie_plaetze_update['freie_plaetze'] - 1)." WHERE id = ".$erg_projekte['id']."";
					mysql_query($sql_freie_plaetze_set) or die(mysql_error());
					$zaehlvar_1 += $faktor;
				}
Fatal error: Maximum execution time of 300 seconds exceeded in C:\xampp\htdocs\projekt\seite\rechnen_algorithmus.php on line 48
 
$bool_benutzername_belegt == true; // Also mit zwei Gleichzeichen kann eine Variablenzuweisung auch nicht klappen *Selbsverprügel*
 
Ich habe mal deinen Quelltext formatiert und deine SQL-Abfragen geordnet. Vielleicht finden die Anderen jetzt den Fehler besser:
PHP:
tabellen_kopieren_algorithmus();

for($i_haupt = 0; $i_haupt < 5; ++$i_haupt)
{
  $zaehlvar_1   = 0; # Variable 1 für Punktzahl für beste Zuteilung
  $zaehlvar_2   = 0; # Variable 2 für Punktzahl für beste Zuteilung
  $nutz_tabelle = 1; # Tabelle die genutzt wird
  $faktor       = 3;
  $punkte_zaehl_variable;
  
    for($i_i = 1; $i_i < 4; ++$i_i)
    {
      $i_ii = 1;
      $sql_projekte    = sprintf(
        'SELECT * FROM algorithmus_projekte_%s',
        $nutz_tabelle
      );
      $query_projekte  = mysql_query($sql_projekte) or die(mysql_error());
      $anzahl_projekte = mysql_num_rows($query_projekte);
      # Alle Projekte werden geladen
      while($erg_projekte = mysql_fetch_assoc($query_projekte))
      {
        $sql_benutzer_wahl1 = sprintf(
          'SELECT * FROM algorithmus_benutzer_%s WHERE wahl_%i = %i AND projekt_final = 0',
          $nutz_tabelle,
          $i_ii,
          $erg_projekte['id']
        );
        $query_benutzer_wahl1 = mysql_query($sql_benutzer_wahl1) or die(mysql_error());
        # Benutzer die noch kein Projekt haben werden geladen
        $anzahl_benutzer = mysql_num_rows($query_benutzer_wahl1);
        
        if($anzahl_benutzer == $erg_projekte['freie_plaetze'])
        {
          $sql_benutzer_wahl1_zuteilung = sprintf(
            'UPDATE algorithmus_benutzer_%s SET projekt_final = %i WHERE wahl_%i = %i',
            $nutz_tabelle,
            $erg_projekte['id'],
            $i_ii,
            $erg_projekte['id']
          );
          mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
          # Wenn die Anzahl der Benutzer die ein Projekt gewählt haben gleich der Anzahl
          # Der anzahl der freien plätze ist, werden allen schülern das projekt zugewiesen
          $sql_projekte_freieplaetze_update = sprintf(
            'UPDATE algorithmus_projekte_%s SET freie_plaetze = 0 WHERE id = %i',
            $nutz_tabelle,
            $erg_projekte['id']
          );
          mysql_query($sql_projekte_freieplaetze_update) or die(mysql_error());
          $zaehlvar_1 += ($anzahl_benutzer*$faktor);
        }
        elseif($anzahl_benutzer > $erg_projekte['freie_plaetze'])
        {
          $x = 0;
          while($erg_benutzer = mysql_fetch_assoc($query_benutzer_wahl1))
          {
            $benutzer_zufall[$x][0] = $erg_benutzer['benutzername'];
            ++$x;
          }
          
          for($i_1 = 1; $i_1 <= $erg_projekte['freie_plaetze']; ++$i_1)
          {
            $bool_benutzername_belegt = true;
            $i_2;
            while($bool_benutzername_belegt == true)
            {
              $i_2 = mt_rand(0, $anzahl_benutzer);
              if(isset($benutzer_zufall[$i_2][1]))
              {
                $bool_benutzername_belegt = true;
              }
              else
              {
                $bool_benutzername_belegt = false;
              }
            }
            # Wenn mehr Benutzer ein Projekt haben wollen werden die in ein
            # nummerisches Array gepackt und dann zufällig so viele benutzer ausgewählt, wie wir freie
            # plätze haben
            $sql_benutzer_zufall_zuweisung = sprintf(
              'UPDATE algorithmus_benutzer_%s SET projekt_final = %i WHERE benutzername = "%s"',
              $nutz_tabelle,
              $erg_projekte['id'],
              $benutzer_zufall[$i_2][0]
            );
            mysql_query($sql_benutzer_zufall_zuweisung) or die(mysql_error());
            $sql_projekte_freie_plaetze_update = sprintf(
              'SELECT * FROM algorithmus_projekte_%s WHERE id = %i',
              $nutz_tabelle,
              $erg_projekte['id']
            );
            $query_projekte_freie_plaetze_update = mysql_query($sql_projekte_freie_plaetze_update) or die(mysql_error());
            $erg_projekte_freie_plaetze_update = mysql_fetch_assoc();
            $sql_freie_plaetze_set = sprintf(
              'UPDATE algorithmus_projekte_%s SET freie_plaetze = %i WHERE id = %i',
              $nutz_tabelle,
              $erg_projekte_freie_plaetze_update['freie_plaetze'] - 1,
              $erg_projekte['id']
            );
            mysql_query($sql_freie_plaetze_set) or die(mysql_error());
            $zaehlvar_1 += $faktor;
          }
          
          $sql_projekte_freieplaetze_update = sprintf(
            'UPDATE algorithmus_projekte_%s SET freie_plaetze = 0 WHERE id = %i',
            $nutz_tabelle,
            $erg_projekte['id']
          );
          mysql_query($sql_projekte_freieplaetze_update) or die(mysql_error());
        }
        elseif($anzahl_benutzer < $erg_projekte['freie_plaetze'])
        {
          $sql_benutzer_wahl1_zuteilung = sprintf(
            'UPDATE algorithmus_benutzer_%s SET projekt_final = %i WHERE wahl_%i = %i',
            $nutz_tabelle,
            $erg_projekte['id'],
            $i_ii,
            $erg_projekte['id']
          );
          mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
          $sql_freieplaetze_update = sprintf(
            'UPDATE algorithmus_projekte_%s SET freie_plaetze = %i',
            $nutz_tabelle,
            $erg_projekte['freie_plaetze'] - $anzahl_benutzer
          );
          mysql_query($sql_benutzer_wahl1_zuteilung) or die(mysql_error());
          $zaehlvar_1 += $anzahl_benutzer * $faktor;
        }
      }
      ++$i_ii;
      --$faktor;
    }
    
    echo $zaehlvar_1;
    echo '<br />';
    
    # Wenn die Punktzahl höher ist als die vorherige wird die jetzige konstellation gesichert
    if($zaehlvar_1 > $zaehlvar_2)
    {
      $zaehlvar_2 = $zaehlvar_1;
      $nutz_tabelle = $nutz_tabelle == 1 ? 2 : 1;
      $sql = sprintf(
        'DROP TABLE algorithmus_benutzer_%s',
        $nutz_tabelle
      );
      mysql_query($sql) or die(mysql_error());
    }
    else
    {
      $sql = sprintf(
        'DROP TABLE algorithmus_benutzer_%s',
        $nutz_tabelle
      );
      mysql_query($sql) or die(mysql_error());
    }
    
    tabellen_kopieren_algorithmus();
  }
}
 
Zurück