You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							114 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							114 lines
						
					
					
						
							3.2 KiB
						
					
					
				| /* JSSP, Job-Shop Scheduling Problem */ | |
| 
 | |
| /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ | |
| 
 | |
| /* The Job-Shop Scheduling Problem (JSSP) is to schedule a set of jobs | |
|    on a set of machines, subject to the constraint that each machine can | |
|    handle at most one job at a time and the fact that each job has a | |
|    specified processing order through the machines. The objective is to | |
|    schedule the jobs so as to minimize the maximum of their completion | |
|    times. | |
| 
 | |
|    Reference: | |
|    D. Applegate and W. Cook, "A Computational Study of the Job-Shop | |
|    Scheduling Problem", ORSA J. On Comput., Vol. 3, No. 2, Spring 1991, | |
|    pp. 149-156. */ | |
| 
 | |
| param n, integer, > 0; | |
| /* number of jobs */ | |
| 
 | |
| param m, integer, > 0; | |
| /* number of machines */ | |
| 
 | |
| set J := 1..n; | |
| /* set of jobs */ | |
| 
 | |
| set M := 1..m; | |
| /* set of machines */ | |
| 
 | |
| param sigma{j in J, t in 1..m}, in M; | |
| /* permutation of the machines, which represents the processing order | |
|    of j through the machines: j must be processed first on sigma[j,1], | |
|    then on sigma[j,2], etc. */ | |
| 
 | |
| check{j in J, t1 in 1..m, t2 in 1..m: t1 <> t2}: | |
|       sigma[j,t1] != sigma[j,t2]; | |
| /* sigma must be permutation */ | |
| 
 | |
| param p{j in J, a in M}, >= 0; | |
| /* processing time of j on a */ | |
| 
 | |
| var x{j in J, a in M}, >= 0; | |
| /* starting time of j on a */ | |
| 
 | |
| s.t. ord{j in J, t in 2..m}: | |
|       x[j, sigma[j,t]] >= x[j, sigma[j,t-1]] + p[j, sigma[j,t-1]]; | |
| /* j can be processed on sigma[j,t] only after it has been completely | |
|    processed on sigma[j,t-1] */ | |
| 
 | |
| /* The disjunctive condition that each machine can handle at most one | |
|    job at a time is the following: | |
| 
 | |
|       x[i,a] >= x[j,a] + p[j,a]  or  x[j,a] >= x[i,a] + p[i,a] | |
| 
 | |
|    for all i, j in J, a in M. This condition is modeled through binary | |
|    variables Y as shown below. */ | |
| 
 | |
| var Y{i in J, j in J, a in M}, binary; | |
| /* Y[i,j,a] is 1 if i scheduled before j on machine a, and 0 if j is | |
|    scheduled before i */ | |
| 
 | |
| param K := sum{j in J, a in M} p[j,a]; | |
| /* some large constant */ | |
| 
 | |
| display K; | |
| 
 | |
| s.t. phi{i in J, j in J, a in M: i <> j}: | |
|       x[i,a] >= x[j,a] + p[j,a] - K * Y[i,j,a]; | |
| /* x[i,a] >= x[j,a] + p[j,a] iff Y[i,j,a] is 0 */ | |
| 
 | |
| s.t. psi{i in J, j in J, a in M: i <> j}: | |
|       x[j,a] >= x[i,a] + p[i,a] - K * (1 - Y[i,j,a]); | |
| /* x[j,a] >= x[i,a] + p[i,a] iff Y[i,j,a] is 1 */ | |
| 
 | |
| var z; | |
| /* so-called makespan */ | |
| 
 | |
| s.t. fin{j in J}: z >= x[j, sigma[j,m]] + p[j, sigma[j,m]]; | |
| /* which is the maximum of the completion times of all the jobs */ | |
| 
 | |
| minimize obj: z; | |
| /* the objective is to make z as small as possible */ | |
| 
 | |
| data; | |
| 
 | |
| /* These data correspond to the instance ft06 (mt06) from: | |
| 
 | |
|    H. Fisher, G.L. Thompson (1963), Probabilistic learning combinations | |
|    of local job-shop scheduling rules, J.F. Muth, G.L. Thompson (eds.), | |
|    Industrial Scheduling, Prentice Hall, Englewood Cliffs, New Jersey, | |
|    225-251 */ | |
| 
 | |
| /* The optimal solution is 55 */ | |
| 
 | |
| param n := 6; | |
| 
 | |
| param m := 6; | |
| 
 | |
| param sigma :  1  2  3  4  5  6 := | |
|           1    3  1  2  4  6  5 | |
|           2    2  3  5  6  1  4 | |
|           3    3  4  6  1  2  5 | |
|           4    2  1  3  4  5  6 | |
|           5    3  2  5  6  1  4 | |
|           6    2  4  6  1  5  3 ; | |
| 
 | |
| param p     :  1  2  3  4  5  6 := | |
|           1    3  6  1  7  6  3 | |
|           2   10  8  5  4 10 10 | |
|           3    9  1  5  4  7  8 | |
|           4    5  5  5  3  8  9 | |
|           5    3  3  9  1  5  4 | |
|           6   10  3  1  3  4  9 ; | |
| 
 | |
| end;
 |