# Multi scheduler internals

## Language
The program is written in JavaScript/jQuery and runs in a browser (Firefox, chrome, ...). 

## Computing the schedule, using a genetic algorithm
### The following numbers are defined:

* ND: the number of days the schedule is spanning
* NP: the total number of available players
* NDP: the number of players that are to play on a given day
* A,B: teams are named A, B, C, ... A team consists of one or two players.


### The chromosomes

A chromosome consists of an array with ND rows and NDP columns. 
A number of random chromosomes is created, taken in consideration:

* choose only players that can play on the given day
* schedule nothing on a 'free' day
* do not place players in the same team if that is not desired

An example (NP=6, NDP=4):

      3  4  1  5
      -1 0  3  2
      etc..

In this example, on the first day players 3 and 4 are scheduled in team A,
while players 1 and 5 are scheduled in team B. On the second day, apparently
there are not enough players available, so team A has only player 0, and 
team B has players 3 and 2.

### Combining chromosomes

An offspring of two chromosomes is computed by taking m rows of the first
chromosome adding ND-m rows of the second chromosome.

### Mutation

Mutation is accomplished by replacing a row of a chromosome with a new random 
row, taking into account the considerations above.

### Fitness function

The fitness function takes into consideration:

* Every player should play the same number of games in total
* The number of not-playing-days after each other should be minimized
* Teams should preferably consist of a male and a female
* Players should be distributed among teams as much as possible
* The teams that play against each other should be of equal strength


### Random numbers

The specifications of JavaScript do not specify how the function ```Math.random()```
computes random numbers. Moreover, one cannot set a seed for the random number 
generator. Therefore, using ```Math.random()``` would possibly yield different
results for different browsers and different results in the same browser because
of probably different starting points on each session. These problems are circumvented by using 
a random generator, written in JavaScript, equipped with a seed, so that
the generator can be started at a defined point. The algorithm is taken from the
article 
[Random number generators: good ones are hard to find](https://dl.acm.org/doi/pdf/10.1145/63039.63042).

### The machinery

During many iterations, two chromosomes are chosen at random  and combined at a random 
row. The offspring is sometimes mutated in a random row. From the three
chromosomes (the original two and the offspring), the one with the worst
fitness is removed. The algorithm ends, when all chromosomes seem to have the same
fitness, or when a number of iterations has been done.


