Newsgroup: it.comp.www.php
Titolo: Algoritmo creazione calendario-campionato

Salve a tutti,
sto disperatamente cercando una fonte che mi possa spiegare come funzioni
l'algoritmo che crea calendari-campionato (o come dir si voglia) tra un
numero N di squadre.
Voglio realizzare una specie di fantacalcio online visto che quelli presenti
sono a pagamento.
Il difficile è creare un calendario per cui:
-tutte le squadre incontrino tutte le altre (come è naturale)
-ogni squadra alternativamente deve giocare in casa e poi fuori o viceversa
(con una eccezione di un massimo di 2 volte consecutive "casa-casa",
"fuori-fuori")
Credo sia tutto.
Ringrazio anticipatamente chi darà una mano.





 ha scritto nel messaggio
news:bbnjcl$a3d$1...@lacerta.tiscalinet.it...


Anzi, altra idea:
Mettiamo che hai 2N squadre.
Le dividi in due gruppi: e le metti in due array
s1[squadra1,squadra2, squadra3...squadraN];
s2[squadra1,squadra2, squadra3...squadraN];
la prima giornata fai le accoppiate s1[1] s2[1], s1[2]s2[2] ecc...
e le memorizzi in giornata[1]
poi fai shiftare l'array s2[]
in modo da avere s2[]=s2[N,1,2...N-1]
e rifai le accoppiate e le memorizzi in gironata[2] e cosě via per N volte
 adesso hai s1 e s2 come all'inizio.
a questo punto fai shiftare con lo stesso sistema s1 invece che s2 per N
volte e li memorizzi in giornata2[]
per fare che una squadra giochi prima in casa e poi fuori basta che prendi
alternato un elemento di gironata1 e uno di giornata2

Scusa ho detto una cagata.... in sto modo non si incontrano tutte...

Booo forse la strada potrebbe essere questa...
fai un array es 1-2-3-4-5-6
poi togli 1
e fai scorrere il rimanente e lo inserisci all'intero di variabili
1-2;1-3;1-4;1-5;1-6
poi togli il 2
2-3;2-4;2-5;2-6
via via arrivi a
5-6;
Cosi' tutte giocano contro tutte..
Poi gli fai creare delle stringhe(giornate) che non contengano 2 volte 
lo stesso numero...
--
pierluigi

 ha scritto nel messaggio
news:fbJDa.45834$pR3.9...@news1.tin.it...


 ha scritto nel messaggio
news:tFPDa.48367$pR3.1...@news1.tin.it...


On Thu, 05 Jun 2003 16:16:09 +0200, Kursk wrote:
ciao!
io ho fatto uno script php che
crea un campionato partento da N squadre.
e' una funzione ricorsiva sfruttando il backtracking.
sfortunatamente non implemente il casa-fuori.
se sei interessato te la mando :)
ciao
gigi 
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[ /gigi a.k.a calca ] 
[ "If anything can go wrong, it will" Murphy ]
[ GPG Key fingerprint ]
[ C6F1 4997 0574 C302 EAE1  42B7 5A17 AA64 F909 FC99 ]

 ha scritto nel messaggio
news:bbpjgv$7ur$1...@lacerta.tiscalinet.it...


 ha scritto nel messaggio
news:pan.2003.06.06....@tiscali.it...


interessa anche a me
grazie


 Naturalmente se ci riesco ti faccio sapere.
bene :)
alcune spiegazioni, la classe e' nata per interfacciarsi ad un database
ma purtroppo non mai avuto il tempo di completarla.
il metodo principale e' calendario()
dove trovi l'array delle squadre. e la chiamata
alle funzioni.
il metodo campionat() fa backtracking sul calendario di tutto il
campionato.
il mentodo giornata_campionato() fa backtracking sulla singola giornata.
dovresti intervenire qui per mettere le modifiche da te interessate.
print_campionato() visualizza il risultato :)
be, buon lavoro :)


 be, buon lavoro :)
mi sono dimenticato il codice :)
ecco :
 
class campionato extends misql {
  // Variabili Globali
  var $giornate_svolte=array();
  var $partite_giornata=array();
  var $insert;
  var $select="SELECT id FROM partecipanti ";
  var $insert="INSERT INTO `campionato` (`id`, `id_squadra_1`, `id_squadra_2`) VALUES ( '#ID#', '#SQUADRA_1#', '#SQUADRA_2#' )"; 
  var $DEBUG,$DEBUG_2;
  var $time_limit=120;
/*
  +----------------------------------------+
  | imposta debug                          |
  +----------------------------------------+
*/
  function set_debug($altri=""){
    $this->DEBUG=1;
    if ( !empty($altri)) $this->DEBUG_2=1;
  }
/*
  +----------------------------------------+
  | imposta debug                          |
  +----------------------------------------+
*/
  function set_time_limit($pippo){
    $this->time_limit($pippo);
  }
/*
  +----------------------------------------+
  | imposta insert                         |
  +----------------------------------------+
*/
  function set_insert($value){
    $this->insert=$value;
  }
/*
  +----------------------------------------+
  | imposta select                         |
  +----------------------------------------+
*/
  function set_select($void){
    $this->select=$void;
  }
  /*
  +----------------------------------------+
  | select partecipanti                    |
  +----------------------------------------+
*/
  function select_squadre(){
    $ris=$this->fai_query($this->select);
    while( $row = mysql_fetch_array($ris)){
       $squadre[]=$row[0];
    } // fine while
    return $squadre;
  }
  /*
  +----------------------------------------+
  | select partecipanti                    |
  +----------------------------------------+
*/
  function giornate($squadre){
    return count($squadre)-1;
  }
 
  /*
  +-----------------------------------------+
  | backtraking per giornata                |
  +-----------------------------------------+
  */
  function giornata_campionato($squadre,$scontri,$n_giornata){
    global $giornate_svolte,$insert;   
    // fine backtraking
    if ( $scontri == 0 ) { return 1; }
    // backtraking
    for($z;$z<1000;$z++){
      // seleziono le squadra
      $team=array_rand($squadre,2);
      $first_team=$squadre[$team[0]];
      $sec_team=$squadre[$team[1]];
      // controllo che non sia gia' presente l'incotro
      $andata=$first_team."-".$sec_team;
      $ritorno=$sec_team."-".$first_team;
      // controllo che sia possibile giocare la partita
      if ( !in_array($andata,$this->giornate_svolte) && !in_array($ritorno,$this->giornate_svolte)){
	// mossa
	if ( !empty($this->DEBUG)) echo "Partita: $first_team - $sec_team <br>";
	// aggiungo la giornata svolta
	$this->giornate_svolte[]=$andata;
	$this->partite_giornata[$n_giornata][]=$andata;
	// tolgo da $squadre quelle utilizzate
	for($i=0;$i<count($squadre);$i++){
	  if( $squadre[$i] != $first_team && $squadre[$i] != $sec_team ){
	    $squadre_next[]=$squadre[$i];
	  }
	}// fine for
	// richiamo la giornate di campionato
	if ( $this->giornata_campionato($squadre_next,$scontri-1,$n_giornata) == "1" ) {
	  // ok 
	  return 1;
	} 
	  // annulla mossa
	  if ( !empty($this->DEBUG)) echo "Annullo Mossa Giornata <br>";
	  // tolgo la giornata dall'array
	  for($i=0;$i<count($this->giornate_svolte);$i++){
	  if( $this->giornate_svolte[$i] != $andata ){
	    $temp_giornate_svolte[]=$this->giornate_svolte[$i];
	  }
	  }// fine for
	  $this->giornate_svolte=$temp_giornate_svolte;
	  return 0;
 
      } //fine if
    } // fine for
    return 0;
  }// fine funzione
 
  /*
  +-----------------------------------------+
  | backtraking per calendario              |
  +-----------------------------------------+
  */
  function campionat($squadre,$numero_giornate,$n_giornata){
    // valura il numero di scontri
    if ( $scontri == "" ){
      $scontri=count($squadre)/2;
    }
    // fine backtraking
    if ( $numero_giornate == 0 ) return 1;
    // backtraking
    while(1){
      $n_giornata=$n_giornata+1;
      $numero_giornate=$numero_giornate-1;
      if ( !empty($this->DEBUG)) echo "> Giornata $n_giornata: <br>";
      // giornata di campionato
      if ( $this->giornata_campionato($squadre,$scontri,$n_giornata) == "1" ){
	// vado avanti col campinonato
	if ( $this->campionat($squadre,$numero_giornate,$n_giornata) == "1" ) {
	  // campionato ok 
	  return 1;
	} 
      } // fine if
      // annulla mossa
      if ( !empty($this->DEBUG)) echo "Annullo Mossa Campionato <br>";
      // annullo giornata
      $counter=0;
      foreach ( $this->partite_giornata[$n_giornata] as $key => $value ){
	//	echo "gior: $n_giornata, $value <br>";
	$counter++;
	$temp_togliere[]=$value;
      } // fine foreach
      for($i=0;$i<count($this->giornate_svolte);$i++){
	//if ( in_array($this->giornate_svolte[$i],$temp_togliere) )echo "$n_giornata, tolgo:". $this->giornate_svolte[$i] ."<br>";
	if ( !in_array($this->giornate_svolte[$i],$temp_togliere)){
	  $temp_giornate_svolte[]=$this->giornate_svolte[$i];
	     }
      }// fine for
      // cancello la vecchia giornata
      for ($i=0;$i<$counter;$i++){
	if ( !empty($this->DEBUG)) echo "Gio $n_giornata, canc:".$this->partite_giornata[$n_giornata][$i]."<br>";
	$this->partite_giornata[$n_giornata][$i]=0;
      }
      //$this->partite_giornata[$n_giornata]=0;
      $this->giornate_svolte=$temp_giornate_svolte;
      $n_giornata=$n_giornata-1;
      $numero_giornate=$numero_giornate+1;
      //return 0;
    }// fine while
  }
  /*
  +-----------------------------------------+
  | print                                   |
  +-----------------------------------------+
*/
  function print_campionato($giornate){
    echo "Campionato <br>";
    for($i=1;$i<=$giornate;$i++){
      echo "> Giornata $i <br>";
      foreach($this->partite_giornata[$i] as $key ){
	if ( $key != "0" ) echo " $key <br>";
      }
    }
  }
  /*
  +-----------------------------------------+
  | prepare query                           |
  +-----------------------------------------+
*/
  function crea_insert($giornate){
    //$insert="INSERT INTO campionato ('id', 'id_squadra_1', 'id_squadra_2') VALUES ( '#ID#', '#SQUADRA_1#', '#SQUADRA_2#' )";
    echo "Insert <br>";
    for($i=1;$i<=$giornate;$i++){
      if ( !empty($this->DEBUG)) echo "> Giornata $i <br>";
      foreach($this->partite_giornata[$i] as $key ){
	if ( $key != "0" ){
	$squadre=explode("-",$key);
	$string=str_replace("#ID#",$i,$this->insert);
	$string=str_replace("#SQUADRA_1#",$squadre[0],$string);
	$string=str_replace("#SQUADRA_2#",$squadre[1],$string);
	echo $string."<br>";
	$return_select[]=$string;
	if ( !empty($this->DEBUG)) echo $string."<br>";
	}// fine if
      }// fine foreach
    }// fine for
    return $return_select;
  }
  /*
  +-----------------------------------------+
  | inserisci nel db                        |
  +-----------------------------------------+
*/
  function inserisci_db($insert){
    echo "bo:".count($insert)."<br>";
    for($i=0;$i<count($insert);$i++){
      echo "faccio la query <br>";
      $this->fai_query($insert[$i]);
    }
  }
  /*
  +-----------------------------------------+
  | crea calendario                         |
  +-----------------------------------------+
*/
  function calendario(){
    // preparo i dati
    set_time_limit($this->time_limit);
    //    $this->mysql();
    //$squadre=$this->select_squadre($this->select);
    $squadre=array("Gigi", "Luca - Adamo", "Ale - Max", "Cela - Mario", "Berra", "Davide - Walter", "Giorgio", "Dozzon - Claudio ", "Dario", "Roby"  );
    $numero_giornate=$this->giornate($squadre);
    $n_giornata=0;
    // creo il campionato
    $this->campionat($squadre,$numero_giornate,$n_giornata);
    //    if ( !empty($this->DEBUG)) 
    $this->print_campionato($this->giornate($squadre));
    //  $this->inserisci_db($this->crea_insert($this->giornate($squadre)));
  }
}
calca


 quelli presenti sono a pagamento.
ti segnalo il mio che è gratuito, anzi GPL, ed in php:
http://www.digitaldruid.net/fantacalciobazar/
Io il tuo problema l'ho risolto creando direttamente dei file con gli
scontri diretti, non è molto elegante ma funziona :)
Ciao, Marco
-- 



http://nekton.mine.nu/fantamanager/
pure il mio e' gpl :)
gestite le squadre, le formazioni e l'invio ..
non e' completo, manca la gestione del campionato  .. :(
purtorppo non ho il tempo di terminarlo :)
ciao


 ha scritto nel messaggio
news:kre2cb...@127.0.0.1...



Se volete posso realizzarvi un softwarino dove si inseriscono le squadre è lui crea i gironi e le giornate, per info 
principi...@gmail.com
 


Se vuoi posso realizzarti un software per generare campionato, gironi e giornate, per info 
principi...@gmail.com
 


Se vuoi posso realizzareti uno schemino dove vengono spiegate le date :p