YEARLY TIME TABLE FOR DART COMPETITION

Recently I got an interesting question with Wisfaq, about a yearly time table for a dart competition. This sort of questions are often posed.
A fellow consultant placed the following comment next the question: 'let's earn money with this'. But there are already teams of mathematical engineers that sell the answers.

The question was:

Dear Wisfaq consultant.
I am a member of a dart club. The club organises a competition. The club has 24 players and 8 dart boards. So we have to form eight groups of three players.
However, the problem is we often play against the same player, and seldom against an other player. I tried to find a solution for this, but without success.
Do you have a good system for this, or mathematical software to solve the question?
Best regards, Alexander.

My answer:

Hello, Alexander. Apply computer force, as follows:

Declare in Pascal: group=array[1..40,1..24] of 1..8 {group[k,n] is the group number of player number n on evening number k}.

You have to carefully type the following program, using the Pascal editor (or use the copy functions).

Compile it. If you have made a little typing error, you get the opportunity to correct it.

Save the program under the name competition.pas .

Finally, run it. The output appears on the screen (make the screen wide enough).

The complete program is:

program competition;

var minimum,k,l,m,n,p,k1,k2,n1,n2:integer; group:array[1..40,1..24] of 0..8;

begin

minimum:=10000;{initialisation}

repeat

for k:=1 to 40 do

begin

for n:=1 to 24 do group[k,n]:=0;{initialisation}

for l:=1 to 8 do for m:=1 to 3 do

begin repeat n:=1+random(24) until group[k,n]=0; group[k,n]:=l end

end;

p:=0;{counts the doubles}

for k1:=1 to 40 do for k2:=k1+1 to 40 do

for n1:=1 to 24 do for n2:=n1+1 to 24 do

if ((group[k1,n1]=group[k1,n2]) and (group[k2,n1]=group[k2,n2]))

then p:=p+1;

if not p ≥ minimum then begin

minimum:=p;

writeln;writeln(p:7);

for k:=1 to 40 do

begin

writeln('avond',k:3);write('***');

for n:=1 to 24 do write(n:3,group[k,n]:2,'*');

writeln

end

end

until false

end.

Now patiently wait until a yearly time table appears which you are happy with.

(After a few hours' run we get a time table with 1452 doubles.

Since, for each week, we draw twenty-four pairs (k1,k2) with k1 smaller than k2 where k1 and k2 sit in the same group, and for each other week the probability that k2 sits in the same group as k1
is 1/8, the expected number of doubles is 24*(1/8)*40*39/2 = 2340.

So by using the program we get a reduction of the number of doubles with 38 percent with respect to the expected number. If you don't use the program, you easily have twice the number of
doubles you have when you use it.)