linear programming

profilemini me
solve3.docx

set period;

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;