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.
		
		
		
		
		
			
		
			
				
					
					
						
							244 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							244 lines
						
					
					
						
							10 KiB
						
					
					
				| /* File: shiftcover.mod */ | |
| 
 | |
| /* WORKFORCE SHIFT COVERAGE assignment problem */ | |
| 
 | |
| /* Written by Larry D'Agostino <larrydag -at- sbcglobal -dot- com> | |
|       | |
|      Maximize Productivity with Industrial Engineer and Operations Research Tools | |
|      http://industrialengineertools.blogspot.com | |
| 
 | |
| 
 | |
| /* The WORKFORCE SHIFT COVERAGE is an assigment problem that determines | |
|    the schedule of crew given available time and shifts.   | |
|     | |
|    The objective is to cover the available time given hourly demand with the minimum  | |
|     number of crew members. | |
|     | |
|     This is a set covering problem that is very common among finding crew | |
|      and shift allocations.  Notice in the data section the workforce shift allocation | |
|      per day of the week.*/ | |
| 
 | |
| 
 | |
| /* ----- Model PARAMTERS and SETS -----*/ | |
| 
 | |
| param numhrs; | |
| /* number of hours of operations in a given day */ | |
| 
 | |
| param dys; | |
| /* number of days in a week */ | |
| 
 | |
| set S; | |
| /* set of crew shifts */ | |
| 
 | |
| set H := 1..numhrs; | |
| /* set of hours of a day*/ | |
| 
 | |
| set D; | |
| /* set of days of a week*/ | |
| 
 | |
| param dmnd{h in H, d in D}; | |
| /* demand for crew members given h hour and d day */ | |
| 
 | |
| param shifts{d in D, h in H, s in S}; | |
| /* shifts to assign to crew members given d day, h hour, and s shift schedule | |
| 
 | |
| /*----- Model VARIABLES -----*/ | |
| 
 | |
| var crew{s in S}, integer, >=0; | |
| /*  number of crew assigned to shift S */ | |
| 
 | |
| 
 | |
| /*----- Model CONSTRAINTS -----*/ | |
| 
 | |
| s.t. Coverage{h in H, d in D}: sum{s in S} crew[s]*shifts[d,h,s] >= dmnd[h,d]; | |
| /* number of crew to cover with a shift  given hourly demand and day */ | |
| 
 | |
| 
 | |
| /*----- Model OBJECTIVE -----*/ | |
| 
 | |
| minimize obj: sum{s in S} crew[s]; | |
| /* minimize number of crew to cover demand*/ | |
| 
 | |
| solve; | |
| display crew; | |
| 
 | |
| printf "\n"; | |
| printf "Total Crew: %3d\n\n", sum{s in S} crew[s]; | |
| 
 | |
| 
 | |
| 
 | |
| printf "\n\n"; | |
| printf "Weekly Crew Schedule\n\n"; | |
| printf "Hour "; | |
| printf{d in D} "  %s  ", d; | |
| printf "\n"; | |
| for {h in H} { | |
|   printf " %2s  ",h; | |
|   printf{d in D} " %3d   ", sum{s in S} crew[s]*shifts[d,h,s]; | |
|   printf "\n"; | |
| } | |
| printf"\n"; | |
| 
 | |
| 
 | |
| 
 | |
| data; | |
| 
 | |
| param numhrs := 16; | |
| 
 | |
| set D := SUN, MON, TUE, WED, THU, FRI, SAT; | |
| 
 | |
| set S := Sh1, Sh2, Sh3, Sh4, Sh5, Sh6, Sh7, Sh8, Sh9; | |
| 
 | |
| param dmnd :   SUN  MON     TUE     WED     THU     FRI     SAT := | |
| 1               0   3       3       4       3       2       0 | |
| 2               0   14      14      16      14      12      12 | |
| 3               0   24      24      27      24      20      15 | |
| 4               0   28      28      32      28      23      15 | |
| 5               0   33      33      37      33      24      16 | |
| 6               0   34      34      38      34      24      15 | |
| 7               0   35      35      39      35      25      11 | |
| 8               0   35      35      40      35      27      0 | |
| 9               0   34      34      39      34      25      0 | |
| 10              0   31      31      35      31      24      0 | |
| 11              2   24      24      27      24      25      0 | |
| 12              3   19      19      21      19      21      0 | |
| 13              2   24      24      27      24      13      0 | |
| 14              2   16      16      18      16      0       0 | |
| 15              0   7       7       7       7       0       0 | |
| 16              0   5       5       5       5       0       0; | |
| 
 | |
| 
 | |
| param shifts :=  | |
| ['SUN',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   0    0    0    0    0    0    0    0    0 | |
| 2                   0    0    0    0    0    0    0    0    0 | |
| 3                   0    0    0    0    0    0    0    0    0 | |
| 4                   0    0    0    0    0    0    0    0    0 | |
| 5                   0    0    0    0    0    0    0    0    0 | |
| 6                   0    0    0    0    0    0    0    0    0 | |
| 7                   0    0    0    0    0    0    0    0    0 | |
| 8                   0    0    0    0    0    0    0    0    0 | |
| 9                   0    0    0    0    0    0    0    0    0 | |
| 10                  0    0    0    0    0    0    0    0    0 | |
| 11                  0    0    0    0    0    0    0    0    1 | |
| 12                  0    0    0    0    0    0    0    0    1 | |
| 13                  0    0    0    0    0    0    0    0    1 | |
| 14                  0    0    0    0    0    0    0    0    1 | |
| 15                  0    0    0    0    0    0    0    0    0 | |
| 16                  0    0    0    0    0    0    0    0    0 | |
| 
 | |
| 
 | |
| ['MON',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   1    0    0    0    0    0    0    0    0 | |
| 2                   1    1    0    0    0    0    0    0    0 | |
| 3                   1    1    1    0    0    0    0    0    0 | |
| 4                   1    1    1    1    0    0    0    0    0 | |
| 5                   0    1    1    1    1    0    0    0    0 | |
| 6                   1    0    1    1    1    1    0    0    1 | |
| 7                   1    1    0    1    1    1    1    0    1 | |
| 8                   1    1    1    0    1    1    1    1    1 | |
| 9                   1    1    1    1    0    1    1    1    1 | |
| 10                  0    1    1    1    1    0    1    1    1 | |
| 11                  0    0    1    1    1    1    0    1    0 | |
| 12                  0    0    0    1    1    1    1    0    1 | |
| 13                  0    0    0    0    1    1    1    1    1 | |
| 14                  0    0    0    0    0    1    1    1    1 | |
| 15                  0    0    0    0    0    0    1    1    1 | |
| 16                  0    0    0    0    0    0    0    1    1 | |
| 
 | |
| ['TUE',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   1    0    0    0    0    0    0    0    0 | |
| 2                   1    1    0    0    0    0    0    0    0 | |
| 3                   1    1    1    0    0    0    0    0    0 | |
| 4                   1    1    1    1    0    0    0    0    0 | |
| 5                   0    1    1    1    1    0    0    0    0 | |
| 6                   1    0    1    1    1    1    0    0    1 | |
| 7                   1    1    0    1    1    1    1    0    1 | |
| 8                   1    1    1    0    1    1    1    1    1 | |
| 9                   1    1    1    1    0    1    1    1    1 | |
| 10                  0    1    1    1    1    0    1    1    1 | |
| 11                  0    0    1    1    1    1    0    1    0 | |
| 12                  0    0    0    1    1    1    1    0    1 | |
| 13                  0    0    0    0    1    1    1    1    1 | |
| 14                  0    0    0    0    0    1    1    1    1 | |
| 15                  0    0    0    0    0    0    1    1    1 | |
| 16                  0    0    0    0    0    0    0    1    1 | |
| 
 | |
| ['WED',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   1    0    0    0    0    0    0    0    0 | |
| 2                   1    1    0    0    0    0    0    0    0 | |
| 3                   1    1    1    0    0    0    0    0    0 | |
| 4                   1    1    1    1    0    0    0    0    0 | |
| 5                   0    1    1    1    1    0    0    0    0 | |
| 6                   1    0    1    1    1    1    0    0    1 | |
| 7                   1    1    0    1    1    1    1    0    1 | |
| 8                   1    1    1    0    1    1    1    1    1 | |
| 9                   1    1    1    1    0    1    1    1    1 | |
| 10                  0    1    1    1    1    0    1    1    1 | |
| 11                  0    0    1    1    1    1    0    1    0 | |
| 12                  0    0    0    1    1    1    1    0    1 | |
| 13                  0    0    0    0    1    1    1    1    1 | |
| 14                  0    0    0    0    0    1    1    1    1 | |
| 15                  0    0    0    0    0    0    1    1    1 | |
| 16                  0    0    0    0    0    0    0    1    1 | |
| 
 | |
| ['THU',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   1    0    0    0    0    0    0    0    0 | |
| 2                   1    1    0    0    0    0    0    0    0 | |
| 3                   1    1    1    0    0    0    0    0    0 | |
| 4                   1    1    1    1    0    0    0    0    0 | |
| 5                   0    1    1    1    1    0    0    0    0 | |
| 6                   1    0    1    1    1    1    0    0    0 | |
| 7                   1    1    0    1    1    1    1    0    0 | |
| 8                   1    1    1    0    1    1    1    1    0 | |
| 9                   1    1    1    1    0    1    1    1    0 | |
| 10                  0    1    1    1    1    0    1    1    0 | |
| 11                  0    0    1    1    1    1    0    1    0 | |
| 12                  0    0    0    1    1    1    1    0    0 | |
| 13                  0    0    0    0    1    1    1    1    0 | |
| 14                  0    0    0    0    0    1    1    1    0 | |
| 15                  0    0    0    0    0    0    1    1    0 | |
| 16                  0    0    0    0    0    0    0    1    0 | |
| 
 | |
| ['FRI',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   1    0    0    0    0    0    0    0    0 | |
| 2                   1    1    0    0    0    0    0    0    0 | |
| 3                   1    1    1    0    0    0    0    0    0 | |
| 4                   1    1    1    1    0    0    0    0    0 | |
| 5                   0    1    1    1    1    0    0    0    0 | |
| 6                   1    0    1    1    1    1    0    0    0 | |
| 7                   1    1    0    1    1    1    1    0    0 | |
| 8                   1    1    1    0    1    1    1    1    0 | |
| 9                   1    1    1    1    0    1    1    1    0 | |
| 10                  0    1    1    1    1    0    1    1    0 | |
| 11                  0    0    1    1    1    1    0    1    0 | |
| 12                  0    0    0    1    1    1    1    0    0 | |
| 13                  0    0    0    0    1    1    1    1    0 | |
| 14                  0    0    0    0    0    1    1    1    0 | |
| 15                  0    0    0    0    0    0    1    1    0 | |
| 16                  0    0    0    0    0    0    0    1    0 | |
| 
 | |
| ['SAT',*,*]: | |
|                    Sh1  Sh2  Sh3  Sh4  Sh5  Sh6  Sh7  Sh8  Sh9 := | |
| 1                   0    0    0    0    0    0    0    0    0 | |
| 2                   0    0    0    0    0    0    0    0    1 | |
| 3                   0    0    0    0    0    0    0    0    1 | |
| 4                   0    0    0    0    0    0    0    0    1 | |
| 5                   0    0    0    0    0    0    0    0    1 | |
| 6                   0    0    0    0    0    0    0    0    1 | |
| 7                   0    0    0    0    0    0    0    0    1 | |
| 8                   0    0    0    0    0    0    0    0    0 | |
| 9                   0    0    0    0    0    0    0    0    0 | |
| 10                  0    0    0    0    0    0    0    0    0 | |
| 11                  0    0    0    0    0    0    0    0    0 | |
| 12                  0    0    0    0    0    0    0    0    0 | |
| 13                  0    0    0    0    0    0    0    0    0 | |
| 14                  0    0    0    0    0    0    0    0    0 | |
| 15                  0    0    0    0    0    0    0    0    0 | |
| 16                  0    0    0    0    0    0    0    0    0;
 |