!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!
!     This is an example call of MIDACO 6.0
!     -------------------------------------
!
!     MIDACO solves Multi-Objective Mixed-Integer Non-Linear Problems:
!
!
!      Minimize     F_1(X),... F_O(X)  where X(1,...N-NI)   is CONTINUOUS
!                                      and   X(N-NI+1,...N) is DISCRETE
!
!      subject to   G_j(X)  =  0   (j=1,...ME)      equality constraints
!                   G_j(X) >=  0   (j=ME+1,...M)  inequality constraints
!
!      and bounds   XL <= X <= XU
!
!
!     The problem statement of this example is given below. You can use 
!     this example as template to run your own problem. To do so: Replace 
!     the objective functions 'F' (and in case the constraints 'G') given 
!     here with your own problem and follow the below instruction steps.
!
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCC   MAIN PROGRAM   CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      PROGRAM MAIN
      IMPLICIT NONE
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!     Dimensions of the optimization problem        
      INTEGER O, N, NI, M, ME
!     Lower and upper bounds ('XL' & 'XU') and optimization variable 'X'
      DOUBLE PRECISION XL(1000), XU(1000), X(1000)
!     Objectives 'F(X)' and constraints 'G(X)' 
      DOUBLE PRECISION F(10), G(1000)            
!     MIDACO information and stop flags
      INTEGER IFLAG, ISTOP
!     MIDACO parameter
      DOUBLE PRECISION PARAM(13)
!     MIDACO integer 'IW' and real'RW' workspace and pareto front 'PF'
      INTEGER LIW, LRW, LPF 
      PARAMETER (LIW = 5000, LRW = 20000, LPF = 20000)       
      INTEGER IW(LIW)
      DOUBLE PRECISION RW(LRW),PF(LPF)
!     Parameter for stopping criteria, printing and license
      INTEGER MAXTIME, MAXEVAL, PRINTEVAL, SAVE2FILE, I
      CHARACTER*60 KEY
      KEY='MIDACO_LIMITED_VERSION___[CREATIVE_COMMONS_BY-NC-ND_LICENSE]'
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CC Step 1: Problem definition     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!
!     Step 1.A : Problem dimensions
!     CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      O  = 1  ! Number of objectives
      N  = 4  ! Number of variables (in total)
      NI = 0  ! Number of integer variables (0 <= NI <= N)
      M  = 3  ! Number of constraints (in total)
      ME = 1  ! Number of equality constraints (0 <= ME <= M)
!
!     Step 1.B : Lower and upper bounds: 'XL' and 'XU'
!     CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      DO I = 1,N
         XL(I) = 1.0D0
         XU(I) = 4.0D0
      ENDDO
!         
!     Step 1.C : Starting point 'X'
!     CCCCCCCCCCCCCCCCCCCCCCCCCCCCC     
      DO I = 1,N          
          X(I) = XL(I) ! Here for example: starting point = lower bounds
      ENDDO
      
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CC Step 2: Choose stopping criteria and printing options    CCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!
!     Step 2.A : Stopping criteria
!     CCCCCCCCCCCCCCCCCCCCCCCCCCCC
      MAXEVAL = 10000    ! Maximum evaluation budget (e.g. 1000000)
      MAXTIME = 60*60*24 ! Maximum time limit (e.g. 60*60*24 = 1 Day)
!
!     Step 2.B : Printing options
!     CCCCCCCCCCCCCCCCCCCCCCCCCCC
      PRINTEVAL = 1000 ! Print-Frequency for current best solution (e.g. 1000)
      SAVE2FILE = 1    ! Save SCREEN and SOLUTION to TXT-files [0=NO/1=YES]
      
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CC Step 3: Choose MIDACO parameters (FOR ADVANCED USERS)    CCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

      PARAM( 1) = 0.0D0  ! ACCURACY
      PARAM( 2) = 0.0D0  ! SEED
      PARAM( 3) = 0.0D0  ! FSTOP
      PARAM( 4) = 0.0D0  ! ALGOSTOP
      PARAM( 5) = 0.0D0  ! EVALSTOP
      PARAM( 6) = 0.0D0  ! FOCUS
      PARAM( 7) = 0.0D0  ! ANTS
      PARAM( 8) = 0.0D0  ! KERNEL
      PARAM( 9) = 0.0D0  ! ORACLE
      PARAM(10) = 0.0D0  ! PARETOMAX
      PARAM(11) = 0.0D0  ! EPSILON  
      PARAM(12) = 0.0D0  ! BALANCE
      PARAM(13) = 0.0D0  ! CHARACTER 

!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!         
!       Call MIDACO by Reverse Communication
!      
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!     Print MIDACO headline with basic information
      CALL MIDACO_PRINT(1,PRINTEVAL,SAVE2FILE,IFLAG,ISTOP,F,G,X,XL, &
               XU,O,N,NI,M,ME,RW,PF,MAXEVAL,MAXTIME,PARAM,1,0,KEY)             
      DO WHILE(ISTOP.EQ.0) !~~~Start~of~reverse~communication~loop  

!       Evaluate Objective F(X) and constraints G(X)
        CALL PROBLEM_FUNCTION( F, G , X)   
        
!       Call MIDACO
        CALL MIDACO(1,O,N,NI,M,ME,X,F,G,XL,XU,IFLAG, &
                    ISTOP,PARAM,RW,LRW,IW,LIW,PF,LPF,KEY)            
!       Call MIDACO printing routine
        CALL MIDACO_PRINT(2,PRINTEVAL,SAVE2FILE,IFLAG,ISTOP,F,G,X, &
           XL,XU,O,N,NI,M,ME,RW,PF,MAXEVAL,MAXTIME,PARAM,1,0,KEY)     
      ENDDO !~~~~~~~~~~~~~~~~~~~~End~of~reverse~communication~loop  
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      ! PRINT*," Solution F(1) = ", F(1)
      ! PRINT*," Solution G(1) = ", G(1)
      ! PRINT*," Solution X(1) = ", X(1)            
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      END
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCC END OF MAIN CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC




!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCC   OPTIMIZATION PROBLEM   CCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      SUBROUTINE PROBLEM_FUNCTION(F,G,X)
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      IMPLICIT NONE
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      DOUBLE PRECISION F(*),G(*),X(*)
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

!     Objective functions F(X)
      F(1) = (X(1)-1.0D0)**2 &
           + (X(2)-2.0D0)**2 &
           + (X(3)-3.0D0)**2 &
           + (X(4)-4.0D0)**2 &
           + 1.23456789D0

!     Equality constraints G(X) = 0 MUST COME FIRST in G(1:ME) 
      G(1) = X(1) - 1.0D0
!     Inequality constraints G(X) >= 0 MUST COME SECOND in G(ME+1:M)
      G(2) = X(2) - 1.333333333D0
      G(3) = X(3) - 2.666666666D0

      END
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCC END OF FILE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
!CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

