JobShopScheduling/inputdata/jobshop2.txt

442 lines
14 KiB
Plaintext
Raw Normal View History

This file contains procedures and data to create a set of 80 JSP test
instances proposed by
E. Taillard (1993),
Benchmarks for basic scheduling problems,
European Journal of Operational Research 64, 278-285.
Contributed by
Dirk C. Mattfeld (email dirk@uni-bremen.de) and
Rob J.M. Vaessens (email robv@win.tue.nl).
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
In order to obtain the 80 instances ta01-ta80 choose one of the three
different ways described below:
o Connect to Taillard's WWW home page directly. His address is:
http://www.idsia.ch/~eric/
The contents of files are self-explaining, although you may have to
convert them into a machine-readable format. Obtaining the data may
be a tedious work. You will find lower- and upper bounds for the
problems at Taillard's WWW page too.
o Write a PASCAL program using the procedures and seeds below. The procedures
are taken from the paper "Benchmarks for Basic Scheduling Problems" directly.
You have to add a main-procedure as well as a file-generation procedure
yourself.
************* procedures **************
function unif(var seed : integer; low, high : integer): integer;
(* generate a random number uniformly between low and high *)
const
m = 2147483647;
a = 16807;
b = 127773;
c = 2836;
var
k : integer;
value_0_1 : double; (* floating point coded on 64 bits *)
begin
k := seed div b ;
seed := a * (seed mod b) - k * c;
if seed < 0 then seed := seed + m ;
value_0_1 := seed / m ;
unif := low + trunc(value_0_1 * (high - low + 1))
end;
procedure generate_job_shop(var time_seed, machine_seed : integer;
nb_jobs, nb_machines : integer;
var d, M : matrix);
(* type matrix = array[1..20, 1..100] of integer; must be declared above *)
(* generate processing times d[i,j] and machines M[i, j] *)
(* of the ith operation of job j *)
var i, j : integer;
procedure swap(var a, b : integer);
var temp : integer;
begin
temp := a; a := b; b := temp
end;
begin
for j := 1 to nb_jobs do
for i := 1 to nb_machines do
d[i, j] := unif(time_seed, 1, 99);
for j := 1 to nb_jobs do
for i := 1 to nb_machines do
M[i, j] := i;
for j := 1 to nb_jobs do
for i := 1 to nb_machines do
swap(M[i, j], M[unif(machine_seed, i, nb_machines), j])
end;
********** data **********
Time seed, Machine seed, instance
15 jobs 15 machines
840612802 398197754 ta01
1314640371 386720536 ta02
1227221349 316176388 ta03
342269428 1806358582 ta04
1603221416 1501949241 ta05
1357584978 1734077082 ta06
44531661 1374316395 ta07
302545136 2092186050 ta08
1153780144 1393392374 ta09
73896786 1544979948 ta10
20 jobs 15 machines
533484900 317419073 ta11
1894307698 1474268163 ta12
874340513 509669280 ta13
1124986343 1209573668 ta14
1463788335 529048107 ta15
1056908795 25321885 ta16
195672285 1717580117 ta17
961965583 1353003786 ta18
1610169733 1734469503 ta19
532794656 998486810 ta20
20 jobs 20 machines
1035939303 773961798 ta21
5997802 1872541150 ta22
1357503601 722225039 ta23
806159563 1166962073 ta24
1902815253 1879990068 ta25
1503184031 1850351876 ta26
1032645967 99711329 ta27
229894219 1158117804 ta28
823349822 108033225 ta29
1297900341 489486403 ta30
30 jobs 15 machines
98640593 1981283465 ta31
1839268120 248890888 ta32
573875290 2081512253 ta33
1670898570 788294565 ta34
1118914567 1074349202 ta35
178750207 294279708 ta36
1549372605 596993084 ta37
798174738 151685779 ta38
553410952 1329272528 ta39
1661531649 1173386294 ta40
30 jobs 20 machines
1841414609 1357882888 ta41
2116959593 1546338557 ta4@
796392706 1230864158 ta43
532496463 254174057 ta44
2020525633 978943053 ta45
524444252 185526083 ta46
1569394691 487269855 ta47
1460267840 1631446539 ta48
198324822 1937476577 ta49
38071822 1541985579 ta50
50 jobs 15 machines
17271 718939 ta51
660481279 449650254 ta52
352229765 949737911 ta53
1197518780 166840558 ta54
1376020303 483922052 ta55
2106639239 955932362 ta56
1765352082 1209982549 ta57
1105092880 1349003108 ta58
907248070 919544535 ta59
2011630757 1845447001 ta60
50 jobs 20 machines
8493988 2738939 ta61
1991925010 709517751 ta62
342093237 786960785 ta63
1634043183 973178279 ta64
341706507 286513148 ta65
320167954 1411193018 ta66
1089696753 298068750 ta67
433032965 1589656152 ta68
615974477 331205412 ta69
236150141 592292984 ta70
100 jobs 20 machines
302034063 1203569070 ta71
1437643198 1692025209 ta72
1792475497 1039908559 ta73
1647273132 1012841433 ta74
696480901 1689682358 ta75
1785569423 1092647459 ta76
117806902 739059626 ta77
1639154709 1319962509 ta78
2007423389 749368241 ta79
682761130 262763021 ta80
********** verification **********
generate_job_shop(time_seed, machine_seed, 4, 4, d, M) should
provide, with time_seed = 1166510396 and machine_seed = 164000672
initially :
(d(i,j])= (M[i,j])=
54 9 38 95 3 4 1 1
34 15 19 34 1 1 2 3
61 89 28 7 4 2 3 2
2 70 87 29 2 3 4 4
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
o Use the C program below. It generates all 80 instance-files in one
run. The first line of each instance contains the number of jobs and
the number of machines. The remaining lines contain one job each,
listing the machine number and processing time for each step of the
job. You may choose whether the machine indices start with 0 or 1.
/*
Program to generate the 80 job shop instances proposed by
Taillard, E. D.: "Benchmarks for basic scheduling problems",
EJOR vol. 64, pp. 278-285, 1993
Originaly written by Taillard in PASCAL, re-written in C by
Dirk C. Mattfeld, University of Bremen <dirk@uni-bremen.de> and
Rob J.M. Vaessens, Eindhoven University of Technology <robv@win.tue.nl>.
Last update : 2/7/1996.
UNIX compile: cc -o jsp_gen jsp_gen.c -lm
Tested on the machines/systems/compilers listed below.
DEC 5000 Ultrix 4.2 cc
SUN 10 Solaris 2 cc
IBM 6000 AIX 3.x xlc
Atari ST TOS pure c
IBM-PC DOS 6.2 MS-C
IBM-PC Linux gcc
Care should be taken on 64 bit machines (e.g. Cray). There,
'long' and 'double' contain 128 bit. In this case replace all
'long' and 'double' with the appropriate 64 bit type.
Verification file 'ta01' (if VERIFY == 1 and FIRMACIND == 1)
4 4
3 54 1 34 4 61 2 2
4 9 1 15 2 89 3 70
1 38 2 19 3 28 4 87
1 95 3 34 2 7 4 29
*/
#define ANSI_C 0 /* 0: K&R function style convention */
#define VERIFY 0 /* 1: produce the verification file */
#define FIRMACIND 0 /* 0,1: first machine index */
#include <stdio.h>
#include <math.h>
struct problem {
long rand_time; /* random seed for jobs */
long rand_mach; /* random seed for mach */
short num_jobs; /* number of jobs */
short num_mach; /* number of machines */
};
#if VERIFY == 1
struct problem S[] = {
{ 0, 0, 0, 0},
{1166510396, 164000672, 4, 4},
{ 0, 0, 0, 0}};
#else /* VERIFY */
struct problem S[] = {
{ 0, 0, 0, 0}, /* 15 jobs 15 machines */
{ 840612802, 398197754, 15, 15 },
{ 1314640371, 386720536, 15, 15 },
{ 1227221349, 316176388, 15, 15 },
{ 342269428, 1806358582, 15, 15 },
{ 1603221416, 1501949241, 15, 15 },
{ 1357584978, 1734077082, 15, 15 },
{ 44531661, 1374316395, 15, 15 },
{ 302545136, 2092186050, 15, 15 },
{ 1153780144, 1393392374, 15, 15 },
{ 73896786, 1544979948, 15, 15 },
/* 20 jobs 15 machines */
{ 533484900, 317419073, 20, 15 },
{ 1894307698, 1474268163, 20, 15 },
{ 874340513, 509669280, 20, 15 },
{ 1124986343, 1209573668, 20, 15 },
{ 1463788335, 529048107, 20, 15 },
{ 1056908795, 25321885, 20, 15 },
{ 195672285, 1717580117, 20, 15 },
{ 961965583, 1353003786, 20, 15 },
{ 1610169733, 1734469503, 20, 15 },
{ 532794656, 998486810, 20, 15 },
/* 20 jobs 20 machines */
{ 1035939303, 773961798, 20, 20 },
{ 5997802, 1872541150, 20, 20 },
{ 1357503601, 722225039, 20, 20 },
{ 806159563, 1166962073, 20, 20 },
{ 1902815253, 1879990068, 20, 20 },
{ 1503184031, 1850351876, 20, 20 },
{ 1032645967, 99711329, 20, 20 },
{ 229894219, 1158117804, 20, 20 },
{ 823349822, 108033225, 20, 20 },
{ 1297900341, 489486403, 20, 20 },
/* 30 jobs 15 machines */
{ 98640593, 1981283465, 30, 15 },
{ 1839268120, 248890888, 30, 15 },
{ 573875290, 2081512253, 30, 15 },
{ 1670898570, 788294565, 30, 15 },
{ 1118914567, 1074349202, 30, 15 },
{ 178750207, 294279708, 30, 15 },
{ 1549372605, 596993084, 30, 15 },
{ 798174738, 151685779, 30, 15 },
{ 553410952, 1329272528, 30, 15 },
{ 1661531649, 1173386294, 30, 15 },
/* 30 jobs 20 machines */
{ 1841414609, 1357882888, 30, 20 },
{ 2116959593, 1546338557, 30, 20 },
{ 796392706, 1230864158, 30, 20 },
{ 532496463, 254174057, 30, 20 },
{ 2020525633, 978943053, 30, 20 },
{ 524444252, 185526083, 30, 20 },
{ 1569394691, 487269855, 30, 20 },
{ 1460267840, 1631446539, 30, 20 },
{ 198324822, 1937476577, 30, 20 },
{ 38071822, 1541985579, 30, 20 },
/* 50 jobs 15 machines */
{ 17271, 718939, 50, 15 },
{ 660481279, 449650254, 50, 15 },
{ 352229765, 949737911, 50, 15 },
{ 1197518780, 166840558, 50, 15 },
{ 1376020303, 483922052, 50, 15 },
{ 2106639239, 955932362, 50, 15 },
{ 1765352082, 1209982549, 50, 15 },
{ 1105092880, 1349003108, 50, 15 },
{ 907248070, 919544535, 50, 15 },
{ 2011630757, 1845447001, 50, 15 },
/* 50 jobs 20 machines */
{ 8493988, 2738939, 50, 20 },
{ 1991925010, 709517751, 50, 20 },
{ 342093237, 786960785, 50, 20 },
{ 1634043183, 973178279, 50, 20 },
{ 341706507, 286513148, 50, 20 },
{ 320167954, 1411193018, 50, 20 },
{ 1089696753, 298068750, 50, 20 },
{ 433032965, 1589656152, 50, 20 },
{ 615974477, 331205412, 50, 20 },
{ 236150141, 592292984, 50, 20 },
/* 100 jobs 20 machines */
{ 302034063, 1203569070, 100, 20 },
{ 1437643198, 1692025209, 100, 20 },
{ 1792475497, 1039908559, 100, 20 },
{ 1647273132, 1012841433, 100, 20 },
{ 696480901, 1689682358, 100, 20 },
{ 1785569423, 1092647459, 100, 20 },
{ 117806902, 739059626, 100, 20 },
{ 1639154709, 1319962509, 100, 20 },
{ 2007423389, 749368241, 100, 20 },
{ 682761130, 262763021, 100, 20 },
{ 0, 0, 0, 0 }};
#endif /* VERIFY */
/* generate a random number uniformly between low and high */
#if ANSI_C == 1
short unif (long *seed, short low, short high)
#else
short unif (seed, low, high)
long *seed; short low, high;
#endif
{
static long m = 2147483647, a = 16807, b = 127773, c = 2836;
double value_0_1;
long k = *seed / b;
*seed = a * (*seed % b) - k * c;
if(*seed < 0) *seed = *seed + m;
value_0_1 = *seed / (double) m;
return low + floor(value_0_1 * (high - low + 1));
}
/* Maximal 100 jobs and 20 machines are provided. */
/* For larger problems extend array sizes. */
short d[101][21]; /* duration */
short M[101][21]; /* machine */
#if ANSI_C == 1
void generate_job_shop(short p) /* Fill d and M according to S[p] */
#else
void generate_job_shop(p)
short p;
#endif
{
short i, j;
long time_seed = S[p].rand_time;
long machine_seed = S[p].rand_mach;
for(i = 0; i < S[p].num_jobs; ++i) /* determine a random duration */
for (j = 0; j < S[p].num_mach; ++j) /* for all operations */
d[i][j] = unif(&time_seed, 1, 99); /* 99 = max. duration of op. */
for(i = 0; i < S[p].num_jobs; ++i) /* determine a machine */
for (j = 0; j < S[p].num_mach; ++j) /* for all operations */
M[i][j] = j; /* assign the machine j */
for(i = 0; i < S[p].num_jobs; ++i) { /* for all jobs */
for (j = 0; j < S[p].num_mach; ++j) { /* for all machines*/
int k = unif(&machine_seed, j, S[p].num_mach-1); /* get rand index */
short t = M[i][j]; /* swap positions j and k */
M[i][j] = M[i][k];
M[i][k] = t;
}
}
}
#if ANSI_C == 1
void write_problem(short p) /* write out problem */
#else
void write_problem(p)
short p;
#endif
{
short i, j;
FILE *f = NULL;
char name[5];
sprintf(name,"ta%02d", p); /* file name construction */
if(!(f = fopen(name,"w"))) { /* open file for writing */
fprintf(stderr,"file %s error\n", name);
return;
}
fprintf(f,"%d %d\n", S[p].num_jobs, S[p].num_mach); /* write header line */
for(i = 0; i < S[p].num_jobs; ++i) {
for(j = 0; j < S[p].num_mach; ++j) {
fprintf(f,"%2d %2d ", M[i][j]+FIRMACIND, d[i][j]); /* write machine and job */
}
fprintf(f,"\n"); /* newline == End of job */
}
fclose(f); /* close file */
}
int main()
{
short i = 1;
while(S[i].rand_time) { /* for i == 1 up to NULL entry */
generate_job_shop(i); /* generate problem i */
write_problem(i); /* write out problem i */
++i; /* increment i */
}
return 0;
}
+++++++++++++++++++ EOF ++++++++++++++++++++++++++++++++++++