param c{period};
param hour;
param hour1;
param break;
param cancels3=1; # =1: 1 Hr break, =0: 1/2 hr break
param start=16; #=16: 1 Hr break for shifts 4,5,and 6, =17: 1/2 Hr break
#--------------------------read c from spreadsheet excekCase15.xls----------
table cValues IN "ODBC" "excelCase15.xls":[period] IN, c;
read table cValues;
var x{j in 1..7}>=0, integer;
var y{i in 1..4,j in 1..7}>=0,integer;
var s2{k in 1..16}=sum{i in 1..k-6,j in 1..k-6:i+j=k-5 and i<=4 and j<=6}y[i,j];
var s3{k in 11..16}=cancels3*sum{i in 1..k-7,j in 1..k-7:i+j=k-6 and i<j and j>=4 and j<=6}y[i,j];
var s4{k in 20..30}=if (k<21 or k>24) then 0 else y[k-20,7];
var S{1..30}>=0;
minimize z: sum{j in 1..7}x[j];
subject to rest1{k in 1..10}: sum{j in 1..min(k,6)}x[j]-s2[k]-S[k]=c[k];
subject to rest2{k in 11..14}: sum{j in 1..min(k,6)}x[j]-s2[k]-s3[k]-S[k]=c[k];
subject to rest3{k in 15..16}: sum{j in 1..min(k,6)}x[j]-s2[k]-s3[k]-S[k]=c[k];#+x[7]-s2[k]-s3[k]-S[k]=c[k];
subject to rest4{k in 17..19}: sum{j in k-15..7}x[j]-S[k]=c[k];
subject to rest5{k in 20..22}: sum{j in k-start..7}x[j]-s4[k]-S[k]=c[k];
subject to rest6{k in 23..30}: x[7]-s4[k]-S[k]=c[k];
subject to rest7 {j in 1..7}: sum{i in 1..4}y[i,j]=x[j];
option solver cplex;
solve;
display S,c,x>file15.out;
print "HIRING SCHEDULE:">file15.out;
print "--------------------------------------">file15.out;
print " Shift starting time Shift size">file15.out;
print "--------------------------------------">file15.out;
for {j in 1..7}
{
if x[j]>0 then
{
let hour:=int((j-1)/2)+7;
if j=7 then let hour:=14;
if (j-1)/2.=int((j-1)/2) then #on the hour
printf "%12s%21i\n",hour & ":00",x[j]>file15.out;
else
printf "%12s%21i\n", hour & ":30",x[j]>file15.out;
}
}
print "--------------------------------------">file15.out;
print " Total = ",sum{j in 1..7}x[j]>file15.out;
print" ">file15.out;
print "BREAK SCHEDULE:">file15.out;
print "-------------------------------------------------------------------------------">file15.out;
print " Shift start time Number of operators Break start time break time (min)">file15.out;
print "-------------------------------------------------------------------------------">file15.out;
for {j in 1..7}
{
if (j>3 and j<7 and cancels3=1) then let break:=60; else let break:=30;
for {i in 1..4}
{
let hour:=7+int((j-1)/2);
let hour1:=7+int((6+j+i-2)/2);
if j=7 then {let hour:=14; let hour1:=17;}
if y[i,j]>0 then
{
if int((6+j+i-2)/2)=(6.0+j+i-2)/2. then #on the hour
{
if (j-1)/2.=int((j-1)/2) then
printf "%10s%19i%24s%21i\n",hour & ":00",y[i,j],hour1 & ":00",break>file15.out;
else
printf "%10s%19i%24s%21i\n",hour & ":30",y[i,j],hour1 & ":00",break>file15.out;
}
else #on the half-hour
{
if (j-1)/2.=int((j-1)/2) then
printf "%10s%19i%24s%21i\n",hour & ":00",y[i,j],hour1 & ":30",break>file15.out;
else
printf "%10s%19i%24s%21i\n",hour & ":30",y[i,j],hour1 & ":30",break>file15.out;
}
}
}
}
print "--------------------------------------------------------------------------------">file15.out;