Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Algoritmo creazione calendario-campionato

981 views
Skip to first unread message

Kursk

unread,
Jun 5, 2003, 10:16:09 AM6/5/03
to
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.


Kursk

unread,
Jun 5, 2003, 10:16:48 AM6/5/03
to

Kursk

unread,
Jun 5, 2003, 10:16:51 AM6/5/03
to

Juz

unread,
Jun 5, 2003, 10:27:10 AM6/5/03
to
Non mi viene in mente molto, intanto potresti fare l'elenco di tutte le
partite facendo una tabella squadre con un campo squadra e dentro ci metti i
nomi delle N squadre
Per fare le accoppiate fai:
SELECT DISTINCT squadre.squadra, squadre_1.squadra
FROM squadre, squadre AS squadre_1
WHERE squadre.squadra<> squadre_1.squadra;

Poi dovresti ordinarle in qualche maniera....

"Kursk" <anf...@ton.it> ha scritto nel messaggio
news:bbnjcl$a3d$1...@lacerta.tiscalinet.it...

Juz

unread,
Jun 5, 2003, 10:41:56 AM6/5/03
to
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


Juz

unread,
Jun 5, 2003, 11:18:35 AM6/5/03
to
Scusa ho detto una cagata.... in sto modo non si incontrano tutte...

niubbo

unread,
Jun 5, 2003, 6:40:25 PM6/5/03
to
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

Kursk

unread,
Jun 6, 2003, 4:31:26 AM6/6/03
to
Va beh,
comunque il concetto che mi serve è questo: date N squadre devo fare un
ciclo di N-1 giornate (il ritorno sarà speculare all'andata naturalmente).
Il problema è come creare questo ciclo in modo che non solo tutte incontrino
tutte, ma si alterni la giocata: casa-fuori e viceversa.
Volevo provare in maniera empirica a ritroso da uno già fatto, ma scriverlo
qui è troppo lungo. Che faccio, l'allego?


"Juz" <juji_...@hotmail.com> ha scritto nel messaggio
news:fbJDa.45834$pR3.9...@news1.tin.it...

Kursk

unread,
Jun 6, 2003, 4:34:02 AM6/6/03
to
Ok,
cosě risolvo il problema delle combinazioni.
Partendo da questo, come posso poi calcolare che non giochino 2 giornate
consecutive in casa o fuori casa?


"niubbo" <niu...@tin.it> ha scritto nel messaggio
news:tFPDa.48367$pR3.1...@news1.tin.it...

calca

unread,
Jun 6, 2003, 6:30:02 AM6/6/03
to
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 ]

dilox

unread,
Jun 6, 2003, 4:58:39 AM6/6/03
to
Una volta che hai il ciclo di andata ad es:

$1=1-2 $2=1-3 $3=1-4 $4=1-5 $5=1-6
$6=2-3 $7=2-4 $8=2-5 $9=2-6
3-4 3-5 3-6

Prima di fargli fare le giornate potresti creare un ciclo che ti inverta la
stringa quando i è pari
tipo:
for($i=1 $i<=x $i++)
{
if (isint $i/2)
{
$$i=funzioneperinvertirelastringa($$i);
}
}
Quando poi crei le giornate alla prima dovresti avere 1-2 alla seconda 3-1
etcetc..
--
dilox


"Kursk" <anf...@ton.it> ha scritto nel messaggio
news:bbpjgv$7ur$1...@lacerta.tiscalinet.it...

Kursk

unread,
Jun 6, 2003, 3:18:28 PM6/6/03
to
Grazie, molto volentieri.
Se vuoi metterla qui come allegato poi la scarico, così magari posso cercare
di svilupparlo per il discorso casa-fuori.
Naturalmente se ci riesco ti faccio sapere.

"calca" <ca...@tiscali.it> ha scritto nel messaggio
news:pan.2003.06.06....@tiscali.it...

fullname

unread,
Jun 8, 2003, 10:49:33 AM6/8/03
to
interessa anche a me

grazie

calca

unread,
Jun 8, 2003, 1:37:21 PM6/8/03
to
On Fri, 06 Jun 2003 21:18:28 +0200, Kursk wrote:

> Grazie, molto volentieri.
> Se vuoi metterla qui come allegato poi la scarico, cosě magari posso cercare


> di svilupparlo per il discorso casa-fuori.
> 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 :)

calca

unread,
Jun 8, 2003, 1:38:36 PM6/8/03
to
On Sat, 07 Jun 2003 08:53:45 +0200, calca wrote:

> On Fri, 06 Jun 2003 21:18:28 +0200, Kursk wrote:
>
>> Grazie, molto volentieri.

>> Se vuoi metterla qui come allegato poi la scarico, così magari posso cercare


>> di svilupparlo per il discorso casa-fuori.
>> 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 :)

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

Marco De Santis

unread,
Jun 9, 2003, 1:07:00 PM6/9/03
to
Kursk ha scritto:

> Voglio realizzare una specie di fantacalcio online visto che
> 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

--

calca

unread,
Jun 9, 2003, 3:40:08 PM6/9/03
to

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

Kursk

unread,
Jun 10, 2003, 1:23:28 PM6/10/03
to
Grazie mille a tutti,
farò un po' di prove, cercherò di espanderlo..e chissà...magari come nacque
linux...:-)
va beh, le mie pretese sono molte, anzi troppe! Ma mi piace l'idea di
sviluppare qualcosa tramite newsgroup...chissàmai se un giorno mi capiterà!
Appena ho delle news vi dico.

Ciao


"Marco De Santis" <ma...@digitaldruid.net> ha scritto nel messaggio
news:kre2cb...@127.0.0.1...

principi...@gmail.com

unread,
Oct 11, 2017, 10:54:34 AM10/11/17
to
Se volete posso realizzarvi un softwarino dove si inseriscono le squadre è lui crea i gironi e le giornate, per info principi...@gmail.com

principi...@gmail.com

unread,
Oct 11, 2017, 10:55:39 AM10/11/17
to
Se vuoi posso realizzarti un software per generare campionato, gironi e giornate, per info principi...@gmail.com

fmigliori

unread,
Oct 11, 2017, 11:09:09 AM10/11/17
to
Se vuoi posso realizzareti uno schemino dove vengono spiegate le date :p
0 new messages