Algorithms
Balanced Round Robin
Glossario
CONSTELLATION GRAPH
Tipi di vincoli
Manuale d'uso
Constellation Census
Constellation Iustitia
Constellation Gare
Sports Leagues Scheduling: Models, Combinatorial Properties, and Optimization Algorithms
Algorithm - Balanced Round Robin  
Constellation Algorithm - Balanced Round Robin bis
by John Jan Popovic


Constellation Algorithm - Balanced Round Robin bis
BALANCED ROUND ROBIN - l'algoritmo per la costruzione del calendario del campionato

REQUIREMENTS for the BALANCED ROUND ROBIN algorithm
Team scheduling in balanced round-robin algorithm
The requirements of the algorithm can be defined by these four constraints:

1) All versus all
Each team must meet exactly once, and once only, the other teams in the division/ league.
If the division is composed of n teams, the championship takes place in the n-1 rounds.

2) Alternations HOME / AWAY rule
No team can have more than 2 consecutive home or 2 consecutive away matches.
Teams should not play neither at Home nor Away, twice in consecutive rounds, i.e. the sequence of alternations HOME / AWAY matches for every teams in the division league, should be retained if possible. For any team in the division league at most once in the sequence of consecutive matches HAHA, occurs the BREAK of the rhythm, i.e. HH or AA match in the two consecutive rounds. In order that the schedule look more balanced, two teams should also not face each other twice in consecutive rounds.


3) The rule of the last slot number
The team with the highest slot number must always be positioned in the last row of the grid. For each subsequent iteration the highest slot number of grid alternates left and right position; left column (home) and right (away).
The system used to compose the league schedule is "counter-clockwise circuit." In the construction of matches in one round of the championship, a division with an even number of teams. If in a division is present odd number of teams, it will be inserted a BYE/Dummy team in the highest slot number of grid/ring.

4) HH and AA non-terminal and not initial
The cadence HH or AA must never happen at the beginning or at the end for any team. Teams should not play neither twice Home or twice Away, in the two consecutive rounds at the beginning or at the end of the season.

Round Robin ALGORITHM
The algorithm that satisfies rule (1) is obtained with a simple algorithm Round Robin: where each successive round is obtained applying to the slot numbers ring a "counterclockwise" rotation.

To satisfy the rule (2) we must "improve", the simple round robin algorithm by performing balancing of Home and Away sequence.
It is performed by applying several "counterclockwise" rotations in the slot numbers ring in order to obtain acceptable combinations of slot positions for the next round. The number of rotations required in the ring is (n / 2 -1).
So we will get that in the two successive rounds, almost all the teams playing at HOME in the previous round, will play AWAY in the next round.

 




DATA STRUCTURE
n_teams: NUMERO_DI_SQUADRE_NEL_GIRONE: (6,8,..,20)
n_rounds: Numero di giornate della gara di (andata/ritorno) = n_teams -1;
Ring – Circuit
Ring is such data structure, i.e. a particular type of sequence where are performable and formally algorithmically defined: operation of (anti-clockwise) ROTATION among ring elements and the operation INSERT_LAST_TEAM, The ring content defines all matches for the each particular round, i.e. scheduled calendar day (round).
Ring.Length is an even number equal to n_teams.
Left_ring subsequence: The Ring subsequence with elements from 1 to n/2.
Right_ring subsequence: Ring subsequence with elements from n/2+1 to n.
Match [i] = Ring_element [ i ] : Ring_element [ n – i + 1 ]; where i = 1 to n/2
The MATCH is an ordered pair composed of two TEAMS, (Home_team : Away_team).
To each Home_team corresponds exactly one Away_team.


Next_Iteration is obtained by applying these rules:
a)   perform (n/2 – 1) times * ANTI CLOCKWISE Rotations

b)   all right column elements, positioned below the last team, will be shifted upwards

c) INSERT_LAST_TEAM
(Insert_Last_Element_into_ Ring_onLeft (n) or Insert_Last_Element_into_Ring_onRight(n), alternatively)

d.1) Last Line LeftRight redundant swap RULE
eventually have to swap elements in the last row once again
it depends on:
i) round / iteration number
ii) Cadence code: CODE ZERO or CODE SIX

Last Line LeftRight redundant inversion RULE / CODE ZERO & SIX
if ( (($iteration == 1) &&($codice == 0)) || #CODE ZERO
(($iteration == ($n_squadre_girone -3)) &&($codice == 6)) ) { #CODE SIX
if ($position eq "right") {$position = "left"} else {$position = "right"};
};

d.2) Last Line LeftRight swap RULE
last team left/right – flip/flop



---------------------------------------------------------------------------------------------------------
In the following example it will be explained how the Ring elements of 8 teams are gradually transformed in five steps, from from the SECOND ROUND into the THIRD ROUND.

0. If we start from from the SECOND ROUND ring:

05 :04
06 :03
07 :02
08 :01


1. After we perform THREE Anti-clockwise rotations, (n =8, 3 = 8/2 -1) we will get the situation like this:

02 :01
03 :08
04 :07
05 :06


2. When we apply the LAST TEAM ROULE,
all the right column elements (06,07) below last team (08) will be shifted upwards for the one position upwards

02 :01
03
04 :07
05 :06


3. And now we will apply the LAST TEAM ROULE
last team (08) will be positioned on the bottom right,
and we will get the situation which describes the THIRD ROUND:
(08 must be moved to the bottom right position)

02 :01
03 :07
04 :06
05 :08

4.a Now it will be checked if for this iteration number (i.e. round) – depending on CODE SIX or ZERO Cadence, we eventually have to change Last element Left/Right swap redundantly,

4.b And at the end will apply the LAST TEAM SLOT REDUNDANT SWAP RULE,
swap left & right elements, if in the previous iteration last team was positioned on the right, in this iteration it will be positioned on the left bottom position, so the last line elements will be swapped, else do nothing.

02 :01
03 :07
04 :06
05 :08


===================================================================


DISPOSIZIONE DELLE GRIGLIE per la PRIMA GIORNATA per il CODICE 6
(Inizializzazione – iteration 0)
Si inizia riportando il numero della griglia di ogni squadre in ordine sequenziale, in circuito in senso antiorario, iniziando dall'alto verso il basso, con la condizione che la squadra con più alto numero di griglia deve essere sempre inserita nell'ultima riga.
Nel girone di esempio abbiamo 8 squadre, e qui è la prima giornata del calendario delle gare per il CODICE 6. (Schema Codice: I6)

Nel calendario della prima giornata del campionato le squadre in colonna sinistra: 01,02,03 e 04 giocano in CASA, contro le squadre nella colona destra: 05, 06, 07 e 08, che giocano in trasferta (FUORI casa).

Casa : Fuori
01:07
02:06
03:05
04:08

Nel sopra riportato girone di esempio abbiamo 8 squadre, ed il campionato si svolge in 7 giornate di gara. In ogni giornata di gara si svolgono 4 partite, dove le 4 squadre giocano in casa e 4 fuori.
La regola della ultimo numero
La squadra con più alto numero di griglia deve essere sempre inserita nell'ultima riga, per ogni successiva iterazione (giornata), alternativamente: sinistra (casa) e destra-(fuori casa).


SECONDA E LE SUCCESSIVE GIORNATE (successive Iterazioni)

Le griglie del calendario della successiva giornata si costruiscono partendo dalla giornata precedente (attuale). Per la successiva giornata portare in basso (nell'ultima riga) il primo numero e quindi di seguito, sempre in ciclo antiorario, disporre gli altri numeri, (rispettando sempre la regola del ultimo numero).
Ovvero, esprimendo si col linguaggio formale: effettuare la rotazione antioraria per n/2-1 volte (dove n è numero di squadre nel girone), e quindi inserire il numero dell'ultima squadra nel anello. Per le successive giornate ripetere la stessa iterazione.

===================================================================
CODICE 6
La disposizione del numero di griglie della PRIMA GIORNATA, per il CODICE 6
01: 07
02: 06
03: 05
04: 08

Nel calendario della prima giornata di gara le squadre in colonna sinistra: 01,02,03 e 04 giocano in CASA, contro le squadre nella colona destra: 05, 06, 07 e 08, che giocano in trasferta (FUORI casa).
Esempio di compilazione di una griglia ad 8 squadre SchemaCodice: I6

I6= GRIGLIA PER 7/8 SQUADRE


1. Giornata Andata
01 :07
02 :06
03 :05
04 :08

2. Giornata Andata
05 :04
06 :03
07 :02
08 :01

3. Giornata Andata
02 :01
03 :07
04 :06
05 :08

4. Giornata Andata
06 :05
07 :04
01 :03
08 :02

5. Giornata Andata
03 :02
04 :01
05 :07
06 :08

6. Giornata Andata
07 :06
01 :05
02 :04
03 :08

7. Giornata Andata
04 :03
05 :02
06 :01
08 :07

I6 ALTERNANZE
Le squadre con le seguenti griglie giocano in alternanza.
01 – 05
02 – 06
03 – 08
04 – 07

I6 Derby si gioca nelle seguenti giornate.
DERBY: 6A 1A 6A 4R

I6 GRIGLIA I6
................1A2A3A4A5A6A7A
I6 SQ.01:: C F F C F C F
I6 SQ.02:: C F C F F C F
I6 SQ.03:: C F C F C C F
I6 SQ.04:: C F C F C F C
I6 SQ.05:: F C C F C F C
I6 SQ.06:: F C F C C F C
I6 SQ.07:: F C F C F C F
I6 SQ.08:: F C F C F F C

Griglie su sfondo grigio che non devono avere abbinamento con nessuna squadra, ovvero devono essere non vincolate.
Le cadenze con gray highlight C e F di alternanze CASA/FUORI non mantengono il ritmo.

Appunti
Il metodo adottato ha come caratteristica una sequenza di alternanze CASA/FUORI e il vantaggio di mantenere questo ritmo di alternanze per qualsiasi numero di squadre nel girone. Nel caso di che abbiamo gironi con numero pari di squadre, esiste un numero identico di gare in CASA e in TRASFERTA (FUORI) ed una sola volta succede una doppia gara in CASA o una doppia gara FUORI (ad un ritmo costante). Mentre nel caso di gironi con numero dispari di squadre non viene utilizzato l'ultimo numero – Squadra RIPOSO.
Il rapporto delle concomitanze e alternanze fra gironi diversi si basa, sulla coincidenza dell’inizio, anche se un simile ragionamento si applica anche quando inizio dei campionati in abbinamento cade nelle giornate diverse.

LE SEQUENZE CON CODICE 0 e LE SEQUENZE CON CODICE 6 sono complementari tra loro.
CARATTERISTICHE delle cadenze del codice 6
La coppia di incontri in Casa e/o Fuori cade sempre in giornata pari/giornata dispari, meno che nella variazione apportata per non avere questa coppia di incontri nelle ultime due giornate.

Per il CODICE 6, Le squadre ospitanti hanno Numero di GRIGLIA BASSO e giocano in CASA (vale solo per la prima giornata del campionato)
Per il CODICE 6, Le squadre ospiti hanno Numero di GRIGLIA ALTO e giocano FUORI casa (vale solo per la prima giornata)


CARATTERISTICHE delle cadenze del codice 0
La coppia di incontri in Casa e/o Fuori cade sempre in giornata dispari /giornata pari, meno che nella variazione apportata per non avere questa coppia di incontri nelle ultime due giornate.

Per il CODICE 6, Le squadre ospitanti hanno Numero di GRIGLIA ALTO e giocano in CASA (vale solo per la prima giornata del campionato)
Per il CODICE 6, Le squadre ospiti hanno Numero di GRIGLIA BASSO e giocano FUORI casa (vale solo per la prima giornata)


ROUND ROBIN
l'algoritmo per la costruzione del calendario del campionato

 ESIGENZA APPLICATIVA

L’esigenza applicativa del algoritmo si può definire con queste quattro regole:

1) Tutti contro tutti
Ogni squadra deve incontrare esattamente una volta, e una volta sola, le altre squadre del girone. Se il girone è composto da
n squadre, il campionato si svolge nelle n-1 giornate.

2) Alternanze CASA/FUORI
Per ogni
squadra nel girone alla quale corrisponde esattamente un numero griglie, la sequenza di alternanze CASA/FUORI ovvero il ritmo di alternanze per qualsiasi numero di squadre nel girone dovrebbe essere possibilmente mantenuto, ed al massimo una sola volta nella sequenza delle gare consecutive, succede una doppia gara in CASA C C o una doppia gara FUORI F F (ad un ritmo costante).

3) La regola del ultimo numero
La squadra con più alto numero di griglia deve essere sempre inserita nell'ultima riga, per ogni successiva iterazione alternativamente: sinistra(casa) e destra-(fuori casa).

4) CC e FF non terminali e non iniziali
La cadenza CC o FF non deve accadere mai al inizio oppure nella fine della cadenza dei incontri per nessuna squadra / griglia.

ALGORITMO

L’algoritmo che soddisfa il punto (1) si ottiene con un semplice algoritmo Round Robin: dove ogni successiva giornata se ottiene dalla giornata precedente applicando ad essa una rotazione a “circuito in senso antiorario".

Per soddisfare anche il punto (2) occorre “migliorare”, bilanciale semplice algoritmo Round Robin effettuando anzi che una rotazione tra le due giornate successive come nel semplice algoritmo Round Robin, Il numero delle rotazioni necessario è (n/2 -1) rotazione, per ottiene che nelle due giornata successive quasi tutte le squadre che giocano in casa nella precedente giornata, giochino fuori casa nella giornata successiva, per ottenere bilanciati incontri casa e fuori, per ogni squadra. – BALANCED ROUND ROBIN

Il sistema utilizzato per comporre il calendario del campionato è “circuito in senso antiorario". Nella costruzione delle partite di una giornata del campionato, di un girone con un numero pari di squadre, NON occorre considerare nella elaborazione il numero dell'ultima squadra (eventuale Riposo): questa verrà inserita alternativamente(casa/fuori) nell'ultima copia della giornata – regola 3.

 


PRIMA GIORNATA CODICE 6 (Inizializzazione – iteration 0)

Si inizia riportando le squadre in ordine, in circuito in senso antiorario, iniziando dall'alto verso il basso per fare così il calendario della prima giornata di gara.

Nel sopra riportato girone di esempio abbiamo 8 squadre, ed il campionato si svolge in 7 giornate di gara. In ogni giornata di gara si svolgono 4 partite, dove le 4 squadre giocano in case e 4 fuori.
Casa : Fuori

01:07
02:06
03:05
04
:08

Nel calendario della prima giornata del campionato le squadre in colonna sinistra: 01,02,03 e 04 giocano in CASA, contro le squadre nella colona destra: 05, 06, 07 e 08, che giocano in trasferta (FUORI casa).

La regola della ultimo numero

La squadra con più alto numero di griglia deve essere sempre inserita nell'ultima riga, per ogni successiva iterazione (giornata), alternativamente: sinistra(casa) e destra-(fuori casa).

SECONDA E LE SUCCESSIVE GIORNATE (successive Iterazioni)

Le griglie del calendario della successiva giornata si costruiscono partendo dalla giornata precedente (attuale). Per la successiva giornata portare in basso (nell'ultima riga) il primo numero e quindi di seguito, sempre in ciclo antiorario, disporre gli altri numeri, (rispettando sempre la regola del ultimo numero).

Ovvero, esprimendo si col linguaggio formale: effettuare la rotazione antioraria per n/2-1 volte (dove n è numero di squadre nel girone), e quindi inserire il numero dell'ultima squadra nel anello.  Per le successive giornate ripetere la stessa iterazione.







DATA STRUCTURE

n_teams: NUMERO_DI_SQUADRE_NEL_GIRONE: (6,8,..,20)
n_rounds: Numero di giornate della gara di (andata/ritorno) = n_teams -1;

Ring – Circuit / ANELLO in italiano

Ring is such data structure, i.e. a particular type of sequence where are performable and formally algorithmically defined: operation of (anti-clockwise) ROTATION among ring elements and the operation INSERT_LAST_TEAM, The ring content defines all matches (gare) for the each particular round, i.e. calendar day (giornata).

Ring.Length is an even number equal to n=NUMERO_DI_SQUADRE_NEL_GIRONE

Left_ring subsequence: The Ring subsequence with elements from 1 to n/2.
Right_ring subsequence: Ring subsequence with elements from n/2+1 to n.
Match [i] = Ring_element [ i ] : Ring_element [ n – i + 1 ]; where i = 1 to n/2

The MATCH is an ordered pair composed of two TEAMS, (Home_team : Away_team).
To each Home_team corresponds exactly one Away_team.


Next_Iteration

a)   perform (n/2 – 1) times * ANTI CLOCKWISE ROTATIONs
b)
     INSERT_LAST_TEAM (Insert_Last_Element_into_ Ring_onLeft (n) or Insert_Last_Element_into_Ring_onRight(n), alternatively)

c) Last Line LeftRight redundant inversion ROULE / CODE ZERO & SIX

if ( (($iteration == 1) &&($codice == 0)) || #CODE ZERO
(($iteration == ($n_squadre_girone -3)) &&($codice == 6)) ) { #CODE SIX

if ($position eq "right") {$position = "left"} else {$position = "right"};

};

An Example:

If we start from the SECOND ROUND

05 04

06 03

07 02

08 01




After we perform THREE Anti-clockwise rotations, (n =8, 3 = 8/2 -1) we will get the situation like this:

02 01

03 08

04 07

05 06


When we apply the LAST SQUADRA ROULE-shift upwards, the right column elements (07,08) below last squadra (08) will be shifted upwards

02 01

03

04 07

05 06



And now we will apply the LAST SQUADRA ROULE-bottom right, we will get the situation which describes the THIRD ROUND: (08 must be moved to the bottom right position)

02: 01

03 :07

04 :06

05 :08


Now it will be checked if for this iteration number (i.e. giornata) – depending on CODE SIX orf ZERO Algorithm, we have to change Left/Right alternation redundantly,


And at the end will apply the LAST SQUADRA ROULE-alternate left & right elements, if in the previous iteration last squadra was positioned on the right in this iteration it will be positioned on the left bottom position, and the last line elements will be swapped, else do nothing.

02 :01

03 07

04 06

05 08



CODICE 6

La disposizione del numero di griglie della PRIMA GIORNATA, per il CODICE 6


01: 07

02: 06

03: 05

04: 08

Nel calendario della prima giornata di gara le squadre in colonna sinistra: 01,02,03 e 04 giocano in CASA, contro le squadre nella colona destra: 05, 06, 07 e 08, che giocano in trasferta (FUORI casa).

Esempio di compilazione di una griglia ad 8 squadre SchemaCodice: I6


I6= GRIGLIA PER 7/8 SQUADRE

1A

2A

3A

4A

5A

6A

7A


ALTERN.

01 07

02 06

03 05

04 08



05 04

06 03

07 02

08 01


02 01

03 07

04 06

05 08


06 05

07 04

01 03

08 02


03 02

04 01

05 07

06 08


07 06

01 05

02 04

03 08


04 03

05 02

06 01

08 07



01 – 05

02 – 06

03 – 08

04 – 07


ALTERNANZE: 01-05 02-06 03-08 04-07

DERBY: 6A 1A 6A 4R


GRIGLIA I6

1A

2A

3A

4A

5A

6A

7A


I6 SQ.01

C

F

F

C

F

C

F


I6 SQ.02

C

F

C

F

F

C

F


I6 SQ.03

C

F

C

F

C

C

F


I6 SQ.04

C

F

C

F

C

F

C


I6 SQ.05

F

C

C

F

C

F

C


I6 SQ.06

F

C

F

C

C

F

C


I6 SQ.07

F

C

F

C

F

C

F


I6 SQ.08

F

C

F

C

F

F

C



Griglie su sfondo grigio che non devono avere abbinamento con nessuna squadra, ovvero devono essere nonvincolate. Le cadenze con gray highlight C e F di alternanze CASA/FUORI non mantengono il ritmo.

Appunti

Il metodo adottato ha come caratteristica una sequenza di alternanze CASA/FUORI e il vantaggio di mantenere questo ritmo di alternanze per qualsiasi numero di squadre nel girone. Nel caso di che abbiamo gironi con numero pari di squadre, esiste un numero identico di gare in CASA e in TRASFERTA (FUORI) ed una sola volta succede una doppia gara in CASA o una doppia gara FUORI (ad un ritmo costante). Mentre nel caso di gironi con numero dispari di squadre non viene utilizzato l'ultimo numero – Squadra RIPOSO.

Il rapporto delle concomitanze e alternanze fra gironi diversi si basa, sulla coincidenza dell’inizio, anche se un simile ragionamento si applica anche quando inizio dei campionati in abbinamento cade nelle giornate diverse.
LE SEQUENZE CON CODICE 0 e LE SEQUENZE CON CODICE 6 sono complementari tra loro.

CARATTERISTICHE delle cadenze del codice 6

La coppia di incontri in Casa e/o Fuori cade sempre in giornata pari/giornata dispari, meno che nella variazione apportata per non avere questa coppia di incontri nelle ultime due giornate.

Per il CODICE 6, Le squadre ospitanti hanno Numero di GRIGLIA BASSO e giocano in CASA (vale solo per la prima giornata del campionato)

Per il CODICE 6, Le squadre ospiti hanno Numero di GRIGLIA ALTO e giocano FUORI casa (vale solo per la prima giornata)



CARATTERISTICHE delle cadenze del codice 0

La coppia di incontri in Casa e/o Fuori cade sempre in giornata dispari /giornata pari, meno che nella variazione apportata per non avere questa coppia di incontri nelle ultime due giornate.

Per il CODICE 6, Le squadre ospitanti hanno Numero di GRIGLIA ALTO e giocano in CASA (vale solo per la prima giornata del campionato)

Per il CODICE 6, Le squadre ospiti hanno Numero di GRIGLIA BASSO e giocano FUORI casa (vale solo per la prima giornata)


GRIGLIE CODICE 0




I0= GRIGLIA PER 7/8 SQUADRE

1A

2A

3A

4A

5A

6A

7A


ALTERN.


04 03

05 02

06 01

07 08

01 07

02 06

03 05

08 04



05 04

06 03

07 02

08 01


02 01

03 07

04 06

05 08


06 05

07 04

01 03

08 02


03 02

04 01

05 07

06 08


07 06

01 05

02 04

08 03



01 – 05

02 – 06

03 – 07

04 - 08

ALTERNANZE: 01-05 02-06 03-07 04-08

DERBY: 7A 2A 4A 2R


GRIGLIA I0

1A

2A

3A

4A

5A

6A

7A











I0 SQ.01

F

C

F

F

C

F

C











I0 SQ.02

F

C

F

C

F

F

C











I0 SQ.03

F

C

F

C

F

C

F











I0 SQ.04

C

F

F

C

F

C

F











I0 SQ.05

C

F

C

C

F

C

F











I0 SQ.06

C

F

C

F

C

C

F











I0 SQ.07

C

F

C

F

C

F

C











I0 SQ.08

F

C

C

F

C

F

C












ADDENDUM


INIZIO è una funzione di due variabili: NUMERO GRIGLIA e SCHEMA CODICE

Quindi, se si conosce il NUMERO DI GRIGLIA e la SCHEMA CODICE, univocamente si può determinare il valore di INIZIO (CASA, FUORI casa). Ovvero si può dire che l’INIZIO è una funzione di due variabili: il NUMERO DI GRIGLIA e la SCHEMA CODICE.


INIZIO in CASA / FUORI casa

Se ad esempio il numero di squadre in un girone di un particolare campionato è 16 (n), esistono 8 (n/2) squadre ospitanti e 8 (n/2) ospitate in una qualsiasi giornata di gara.

Le squadre ospitanti giocano in CASA, mentre quelle ospitate FUORI casa, ovvero in TRASFERTA.


Prima giornata I0


04 03

05 02

06 01
07 08


Prima giornata A0


05 04

06 03

07 02

08 01

09 10


Prima giornata C0


06 05

07 04

08 03

09 02

10 01

11 12

Prima giornata E0
07 06

08 05

09 04

10 03

11 02

12 01

13 14


Prima giornata I6


01 07

02 06

03 05

04 08


Prima giornata A6


01 09

02 08

03 07

04 06

05 10


Prima giornata C6


01 11

02 10

03 09

04 08

05 07

06 12


Prima giornata E6


01 13

02 12

03 11

04 10

05 09

06 08

07 14

Initial Circuit code zero

Ring.Length is equal to n = NUMERO_DI_SQUADRE_NEL_GIRONE
Left_ring: Ring subsequence with elements from 0 to n/2-1.
Right_ring: Ring subsequence with elements from n/2 to n-1.
Match [i] = Ring [ i -1 ] : Ring [ n – i ]; where i = 0 to n/2-1

[0] [n-1]
[1] [n-2]
….
….
[
n/2-1] [n/2]


Examplefor I6

By performing thisgenerativeloop we obtain @Ring initial setup for CODE6

For ($i=0;$i<$n_half ; $i++) {

@Ring[$i] =$i+1; # home, left_halfring element
@Ring[$n - $i - 1] = $n -$i; #away, left_halfring element

}

Casa: Fuori

01:08
02
:07
03
:06
04
:05


Examplefor I0

By performing this generative loop we will obtain @Ring initial setup for CODEZero

For ($i=0;$i<$n_half ; $i++) {

@Ring[$i] =$n_half+ $i; # home, left_halfring element
@Ring[$n - $i - 1] = $n_half - $i - 1; #away, left_halfring element

}

Casa: Fuori

04:03

05:02

06:01
07:
08





By executing theLastTeamRoule,we will get the situation which describes the INITIAL ROUND fordesiredSchemaCodice setting.ShiftUp - LastTeamRoule

#shiftupwards,the right column elements below last_team will be shifted upwards
for($i=$n; $i>$n_half; $i--) {
if(@Ring[$i] == $n) {@Ring[$i] =0;}; # empty
LASTTEAM slot,i.e. set to zero

#shift upward
if(@Ring[$i] == 0) {
@Ring[$i] = @Ring[$i-1];
@Ring[$i-1] = 0; #
setto zero
};
}


EXPLANATION:the right column elements (07,06) below last team (08)will be shifted upwards GRADUALLY.

$i=8


02:01

03 - 08 is reset to 0

04:07

05:06


02:01

03:07 - shift upward

04 - set to zero

05:06



Thisloop will be processed for ($i=8; $i>4; $i--) times, and at theend if the loop allelements below last team(06,07) will be shifted upwards.



#
alternate left & right elements,if in the previous iteration last TEAM was positioned on the right in this iteration it will be positioned on the left bottom position,and the last line elements will be swapped,else do nothing.
if($position eq “right”) {@Ring[$n_half] = $n} ;
if ($positioneq “left”) {
@Ring[$n_half] = @Ring[$n_half - 1];
@Ring[$n_half - 1] = $n ;

} ;

EXAMPLE:if we have an initial situation before applyingshift upwards ROULE

02:01

03:08

04:07

05:06


Whenwe apply the LASTTEAM ROULE,the right column elements (07,06)below last team (08)will be shifted upwards

02:01

03

04:07

05:06



Andnow we will apply the LASTTEAM ROULE-bottom right,we will get the situation which describes the THIRD ROUND: (08must be moved to the bottomrightposition)