model Lesson6_SolvingTimes
  options noimplicit
  uses "mmxprs", "mmsystem"

  parameters
    numOfStudents=6
    numOfProblems=20
  end-parameters

  declarations
    STUDENTS=1..numOfStudents
    PROBLEMS=1..numOfProblems
    lengths: array(PROBLEMS) of real

    solve: array(STUDENTS,PROBLEMS) of mpvar
    t: mpvar

    OBJ:linctr
    startTime:time
    endTime:time
  end-declarations

  startTime:=time(SYS_NOW)

  lengths::[0.23,0.25,0.27,0.31,0.35,0.4,0.52,0.75,0.79,0.89,0.94,1,1.09,1.11,1.32,1.55,1.7,1.96,2.03,2.12]

  forall(s in STUDENTS, p in PROBLEMS) solve(s,p) is_binary

  ! All problems have to be solved by someone:
  forall(p in PROBLEMS) do
    sum(s in STUDENTS) solve(s,p) = 1
  end-do

  ! This is what we're linearizing:
  ! OBJ:= max(sum(p in PROBLEMS) solve(s,p)*lengths(p))

  ! Linearization
  forall(s in STUDENTS) do
    t >= sum(p in PROBLEMS) solve(s,p)*lengths(p)
  end-do

  OBJ:=t
  minimise(OBJ)

  endTime:=time(SYS_NOW)

  writeln("Total time spent solving the problems: ", getobjval)
  writeln("")

  forall(s in STUDENTS) do
    writeln("STUDENT ", s, " solved:")
    forall(p in PROBLEMS) do
      if(getsol(solve(s,p))=1) then
        writeln(p, " in ", lengths(p), " time")
      end-if
    end-do
    writeln("With a total time of: ", sum(p in PROBLEMS) getsol(solve(s,p))*lengths(p))
    writeln("")
  end-do
  writeln("")

  writeln("Time elapsed: ", time(endTime-startTime))

end-model

