You are here

Industrial Modelling Competition

NEWS FLASH 3!

The customer has queried the quality of the results. How good are your solutions really? Can you show how far you are from the optimal value (makespan only), or can you prove that your solution is optimal? How much have your solutions improved during the week?

NEWS FLASH 2!

The customer has released a new set of large instances: Download test instance set 2.

NEWS FLASH!

The customer has changed his mind: Instead of minimising the makespan alone, you should minimise the sum of the solving time and the makespan of the solution you produce. This is motivated by the usage scenario. The customer creates the test sets very often, and wants to run them as quickly as possible, once they are ready. For this, you can spend time on finding a very good solution, or spend less time for a slower schedule you can start sooner. What counts is the time from receiving the data, and starting the solver,  to the time the last test has finished.

Please report the solving time (in seconds) together with your makespan in the title of the email submission after the name of the instance. The duration of the tests is given in seconds as well. The sum of the two number is the objective value. You may want to re-evaluate your solver, to see if a shorter solving time leads to a better overall value.

Of course, we can not check the execution time you submit, we trust you on this!

Leaderboard (updated 2015-10-05 16:23)

Overall (incl. time)
  Team Score
1 Philippe Laborie 0.000
2 Pierre Schaus 1.320
3 Thorsten Winterer 2.592
4 Mohamed Siala 18.233
5 Jean-Noel Monette 40.114
6 Nicolas Beldiceanu 51.000
t40m10r3-2 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.003
3 Thorsten Winterer 0.008
4 Jean-Noel Monette 0.098
5 Mohamed Siala 1.000
6 Nicolas Beldiceanu 5.000
t50m10r3-9 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.023
3 Mohamed Siala 0.233
4 Thorsten Winterer 0.698
5 Jean-Noel Monette 1.000
6 Nicolas Beldiceanu 5.000
t100m50r10-11 (incl. time)
1 Philippe Laborie 0.000
2 Mohamed Siala 0.000
3 Thorsten Winterer 0.001
4 Pierre Schaus 0.002
5 Jean-Noel Monette 0.007
6 Nicolas Beldiceanu 1.000
t500m50r5-5 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.001
3 Pierre Schaus 0.002
4 Jean-Noel Monette 0.008
5 Nicolas Beldiceanu 1.000
6 Mohamed Siala 5.000
t500m100r10-1 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.412
3 Thorsten Winterer 1.000
4 Nicolas Beldiceanu 3.000
4 Mohamed Siala 3.000
4 Jean-Noel Monette 3.000
t500m100r10-2 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.059
3 Pierre Schaus 0.083
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-3 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.162
3 Pierre Schaus 0.257
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-4 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.036
3 Thorsten Winterer 0.166
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-5 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.087
3 Thorsten Winterer 0.111
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-6 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.032
3 Pierre Schaus 0.042
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-7 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.059
3 Pierre Schaus 0.095
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-8 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.097
3 Thorsten Winterer 0.149
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-9 (incl. time)
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.113
3 Pierre Schaus 0.175
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000
t500m100r10-10 (incl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.006
3 Thorsten Winterer 0.033
4 Mohamed Siala 1.000
5 Nicolas Beldiceanu 4.000
5 Jean-Noel Monette 4.000

 

Overall (excl. time)
  Team Score
1 Philippe Laborie 0.000
2 Chris Mears 1.920
3 Pierre Schaus 2.236
4 Thorsten Winterer 3.236
5 Jean-Noel Monette 5.857
6 Mohamed Siala 22.000
7 Barry Hurley 59.107
8 Nicolas Beldiceanu 62.003
9 Ingmar Dasseville 66.102
t40m10r3-2 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.002
3 Nicolas Beldiceanu 0.003
3 Thorsten Winterer 0.003
4 Chris Mears 0.008
5 Jean-Noel Monette 0.009
6 Barry Hurley 0.044
7 Ingmar Dasseville 0.102
8 Mohamed Siala 1.000
t50m10r3-9 (excl. time)
1 Mohamed Siala 0.000
1 Barry Hurley 0.000
1 Chris Mears 0.000
1 Philippe Laborie 0.000
1 Ingmar Dasseville 0.000
1 Thorsten Winterer 0.000
1 Pierre Schaus 0.000
1 Jean-Noel Monette 0.000
2 Nicolas Beldiceanu 1.000
t100m50r10-11 (excl. time)
1 Mohamed Siala 0.000
1 Barry Hurley 0.000
1 Chris Mears 0.000
1 Philippe Laborie 0.000
1 Ingmar Dasseville 0.000
1 Thorsten Winterer 0.000
1 Pierre Schaus 0.000
1 Jean-Noel Monette 0.000
2 Nicolas Beldiceanu 1.000
t500m50r5-5 (excl. time)
1 Chris Mears 0.000
1 Philippe Laborie 0.000
2 Thorsten Winterer 0.003
3 Pierre Schaus 0.003
4 Jean-Noel Monette 0.003
5 Barry Hurley 0.064
6 Nicolas Beldiceanu 1.000
7 Mohamed Siala 7.000
7 Ingmar Dasseville 7.000
t500m100r10-1 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.331
3 Chris Mears 0.429
4 Thorsten Winterer 0.774
5 Jean-Noel Monette 1.000
6 Nicolas Beldiceanu 5.000
6 Mohamed Siala 5.000
6 Barry Hurley 5.000
6 Ingmar Dasseville 5.000
t500m100r10-2 (excl. time)
1 Philippe Laborie 0.000
2 Chris Mears 0.199
3 Pierre Schaus 0.271
4 Thorsten Winterer 0.282
5 Jean-Noel Monette 0.534
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-3 (excl. time)
1 Philippe Laborie 0.000
2 Chris Mears 0.162
3 Thorsten Winterer 0.298
4 Pierre Schaus 0.433
5 Jean-Noel Monette 0.767
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-4 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.137
3 Chris Mears 0.149
4 Thorsten Winterer 0.349
5 Jean-Noel Monette 0.432
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-5 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.159
3 Chris Mears 0.211
4 Thorsten Winterer 0.357
5 Jean-Noel Monette 0.785
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-6 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.027
3 Chris Mears 0.087
4 Thorsten Winterer 0.104
5 Jean-Noel Monette 0.271
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-7 (excl. time)
1 Philippe Laborie 0.000
2 Chris Mears 0.071
3 Thorsten Winterer 0.138
4 Pierre Schaus 0.165
5 Jean-Noel Monette 0.493
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-8 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.195
3 Chris Mears 0.204
4 Thorsten Winterer 0.356
5 Jean-Noel Monette 0.443
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-9 (excl. time)
1 Philippe Laborie 0.000
2 Chris Mears 0.275
3 Thorsten Winterer 0.429
4 Pierre Schaus 0.467
5 Jean-Noel Monette 0.766
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000
t500m100r10-10 (excl. time)
1 Philippe Laborie 0.000
2 Pierre Schaus 0.047
3 Chris Mears 0.125
4 Thorsten Winterer 0.142
5 Jean-Noel Monette 0.354
6 Mohamed Siala 1.000
7 Nicolas Beldiceanu 6.000
7 Barry Hurley 6.000
7 Ingmar Dasseville 6.000

Problem Description

The problem has kindly been provided by Morten Mossige from ABB in Norway.

As part of Industrial Day on Thursday, we propose a modelling competition for the participants of CP2015 and ICLP2015. We will have a session on Thursday afternoon (13:45-15:00 in room G08) to discuss progress, and will add the problems and suggested models to the CSPLib on Saturday in the CSPLib sprint event.

The problem arises in the context of a testing facility. A number of tests have to be performed in minimal time. Each test has a given duration and needs to run on one machine. While the test is running on a machine, no other test can use that machine. Some tests can only be assigned to a subset of the machines, for others you can use any available machine.  For some tests, additional, possibly more than one, global resources are needed. While those resources are used for a test, no other test can use the resource. The objective is to finish the set of all tests as quickly as possible, i.e. all start times should be non-negative, and makespan should be minimized. The makespan is the difference between the start of the earliest test, and the end of the latest finishing test.

To participate

Submission is by email, send result files to cpmodellingcomp@gmail.com with the problem name as the subject. Any solver is allowed, teams of up to three participants are allowed to work together. Nobody should participate in more than one team.

Submissions are now closed.

Details of format

The input data is given as a set of Prolog facts. An example is shown below:

%% ****  Testsuite  ****
% Number of tests                  : 40
% Number of machines               : 10
% Number of resources              : 3
% Number of families               : 1
% Prob that a test use a resource  : 30%
% Minimum test duration            : 1
% Maximim test duration            : 800
% MPri                             : 40%

test( 't1', 568, [], [], 'fam1', 1 ).
test( 't2', 669, [], ['r3'], 'fam1', 1 ).
test( 't3', 688, [], [], 'fam1', 1 ).
test( 't4', 709, ['m7'], [], 'fam1', 1 ).
test( 't5', 505, ['m3'], [], 'fam1', 1 ).
test( 't6', 683, [], [], 'fam1', 1 ).
test( 't7', 20, [], [], 'fam1', 1 ).
test( 't8', 250, ['m6'], [], 'fam1', 1 ).
test( 't9', 235, [], [], 'fam1', 1 ).
test( 't10', 651, [], [], 'fam1', 1 ).
test( 't11', 477, ['m10'], [], 'fam1', 1 ).
test( 't12', 227, [], [], 'fam1', 1 ).
test( 't13', 464, [], [], 'fam1', 1 ).
test( 't14', 257, [], [], 'fam1', 1 ).
test( 't15', 80, ['m2'], [], 'fam1', 1 ).
test( 't16', 592, [], [], 'fam1', 1 ).
test( 't17', 376, ['m9'], [], 'fam1', 1 ).
test( 't18', 541, [], [], 'fam1', 1 ).
test( 't19', 215, [], [], 'fam1', 1 ).
test( 't20', 645, [], [], 'fam1', 1 ).
test( 't21', 624, [], ['r2'], 'fam1', 1 ).
test( 't22', 463, ['m1'], [], 'fam1', 1 ).
test( 't23', 549, [], [], 'fam1', 1 ).
test( 't24', 647, [], ['r1'], 'fam1', 1 ).
test( 't25', 361, [], [], 'fam1', 1 ).
test( 't26', 57, [], ['r3'], 'fam1', 1 ).
test( 't27', 422, [], [], 'fam1', 1 ).
test( 't28', 530, ['m1'], [], 'fam1', 1 ).
test( 't29', 492, [], ['r2'], 'fam1', 1 ).
test( 't30', 306, ['m9','m4','m8'], ['r3'], 'fam1', 1 ).
test( 't31', 519, [], [], 'fam1', 1 ).
test( 't32', 176, [], [], 'fam1', 1 ).
test( 't33', 354, [], ['r1','r2','r3'], 'fam1', 1 ).
test( 't34', 682, [], [], 'fam1', 1 ).
test( 't35', 428, [], [], 'fam1', 1 ).
test( 't36', 340, [], [], 'fam1', 1 ).
test( 't37', 119, ['m1','m6','m4'], ['r3','r2'], 'fam1', 1 ).
test( 't38', 791, [], [], 'fam1', 1 ).
test( 't39', 167, ['m4','m1','m9'], [], 'fam1', 1 ).
test( 't40', 363, [], [], 'fam1', 1 ).

embedded_board( 'm1').
embedded_board( 'm2').
embedded_board( 'm3').
embedded_board( 'm4').
embedded_board( 'm5').
embedded_board( 'm6').
embedded_board( 'm7').
embedded_board( 'm8').
embedded_board( 'm9').
embedded_board( 'm10').

testsetup( 'fam1', 0 ).

resource( 'r1', 1).
resource( 'r2', 1).
resource( 'r3', 1).

 

The format is the following:

Comment lines starting with % are ignored.

Naming convention of a test suite (the files): t<number of test cases>m<number of machines>r<number of resources>-<instance no>.pl

e.g. t20m10r3-18.pl  20 test case, 10 machines, 3 resources, instance number 18

 

Each test suite is currently encoded as Prolog predicates as:

A test case:

test(<name>, <duration>,
        <possible machine (empty list = all machines)> ,
        <requested resources>,
        <family of test case (not used)>, 
        <priority(not used)>).

e.g. test( 't13', 537, [], ['r2','r1'], 'fam1', 1 ).

Name:t13, duration 537, executable on any machine, requesting resource r2 and r1

An empty list for the machine indicates any machine can be used, an empty list for the resources indicates that no additional resources are required.

A machine:

embedded_board( <name of machine> ).

e.g. embedded_board( 'm8').

A resource:

resource(<name>,<capacity>).

e.g. resource( 'r1', 1).

Name: r1, capacity: 1 (currently we only use 1 as capacity, to be changed in future.)

The results should be given in the form:

result(<name>,<start>,<machine>).

e.g. result('t1',0,'m1').

Task t1 starts at time 0 on machine m1.

Example

An example problem and its solution is shown in the following Figure:

Scoring

Teams are ranked based on the relative quality of the makespan across all instances. If no team provides a solution to an instance, that instance is not considered for scoring. If a team fails to solve an instance but other teams do, it is given a score equal to the number of teams that did solve the instance. This penalises teams relative to the difficulty of the instance. If only one team solves an instance, it is given a score of zero. Lower is better in this scoring system.

In the case where multiple teams solve an instance, their relative scores are computed as follows. Let \(S\) be the set of solutions for the instance, where \(s_i \in S\) is the makespan of team \(i\). If all objective values are equivalent, then each solver scores zero, otherwise let \(\\alpha = \min_{s_j \in S}{s_j}\) be the best, and \(\\beta = \max_{s_j \in S}{s_j}\) be the worst makespan across any team. Then, the relative score achieved by team \(i\) for the instance is given as: \[ \\text{score}_i = {{s_i - \\alpha} \over {\\beta - \\alpha}} \]

Instances

Download test instance set 1

Download test instance set 2

Download the above problem description as a pdf

Checker script to verify instances and makespan: checker.py