text: 
  MAIN MODEL Main_FurnitureMoving
  
    DECLARATION SECTION 
  
      SET:
         identifier   :  ii
         subset of    :  Integers
         index        :  i
         definition   :  {1..N} ;
  
      SET:
         identifier   :  Jobs
         subset of    :  Integers
         index        :  j
         definition   :  {1..UpperLimit2} ;
  
      PARAMETER:
         identifier   :  N
         definition   :  4 ;
  
      PARAMETER:
         identifier   :  LowerLimit
         initial data :  0 ;
  
      PARAMETER:
         identifier   :  UpperLimit
         initial data :  4 ;
  
      PARAMETER:
         identifier   :  UpperLimit2
         initial data :  120 ;
  
      PARAMETER:
         identifier   :  Durations
         index domain :  i ;
  
      PARAMETER:
         identifier   :  Resources
         index domain :  (i) ;
  
      VARIABLE:
         identifier   :  JobStart
         index domain :  (i)
         range        :  {0..UpperLimit2} ;
  
      VARIABLE:
         identifier   :  JobEnd
         index domain :  (i)
         range        :  {0..UpperLimit2} ;
  
      CONSTRAINT:
         identifier   :  Cumulative
         definition   :  cp::ParallelSchedule(UpperLimit,
                                              j, /* i */
                                              JobStart(j),
                                              Durations(j),
                                              JobEnd(j),
                                              Resources(j)) ;
  
      MATHEMATICAL PROGRAM:
         identifier   :  FurnitureMovingPlan
         objective    :  MaxEndTime
         direction    :  minimize
         constraints  :  AllConstraints
         variables    :  AllVariables
         type         :  Automatic ;
  
      VARIABLE:
         identifier   :  MaxEndTime
         range        :  free
         comment      :  "The latest JobEnd. To be minimized." ;
  
      CONSTRAINT:
         identifier   :  GetMaxEndTime
         definition   :  MaxEndTime = Max(i, JobEnd(i)) ;
  
    ENDSECTION  ;
  
    PROCEDURE
      identifier :  MainInitialization
  
    ENDPROCEDURE  ;
  
    PROCEDURE
      identifier :  MainExecution
      body       :  
        ShowProgressWindow;
        solve FurnitureMovingPlan;
        
        if (FurnitureMovingPlan.ProgramStatus <> 'Optimal') then
             empty JobStart, JobEnd;
        endif;
        
        DialogMessage(GMP::Solution::Count('FurnitureMovingPlan'));
  
    ENDPROCEDURE  ;
  
    PROCEDURE
      identifier :  MainTermination
      body       :  
        if ( CaseSaveAll( confirm:2 ) = 1 ) then
            return 1;
        else
            return 0;
        endif ;
  
    ENDPROCEDURE  ;
  
  ENDMODEL Main_FurnitureMoving ;
  