3.4 Combining Both Models

Combining both models is simply done by adding the finite domain model without distribution to the linear programming model. The propagator {RI.intBounds F I} is used to connect real-interval constraints with finite domain constraints. It constrains F and I to denote the same integer either as float or as integer, respectively.

declare 
fun {KnapsackFDLP Problem}
   NumProducts = {Length Problem.profit}
   Resources   = Problem.resources
in 
   proc {$ Sol}
      sol(maxprofit: FDMaxProfit = {FD.decl}
          products: FDProducts = {FD.list NumProducts 0#FD.sup})
      = Sol
 
      ObjFn Constraints
      MaxProfit = {RI.var.decl}
      Products  = {MakeList NumProducts}
   in 
      % 
      % finite domain constraints part
      % 
      FDMaxProfit = {FD.sumC Problem.profit FDProducts '=:'}
 
      {ForAll {Arity Resources}
       proc {$ ResourceName}
          Resource = Resources.ResourceName
       in 
          {FD.sumC Resource.npp FDProducts '=<:' Resource.ta}
       end}
 
      %% 
      %% linear programming part
      %% 
      {ForAll Products
       proc {$ V} {RI.var.bounds 0.0 RI.sup V} end}
 
      ObjFn = objfn(row: {Map Problem.profit {IntToFloat I}}
                    opt: max)
 
      Constraints =  
      {Map {Arity Resources}
        fun {$ ResourceName}
          Resource = Resources.ResourceName
       in 
          constr(row: {Map Resource.npp IntToFloat}
                 type: '=<' 
                 rhs: {IntToFloat Resource.ta})
       end}
 
      %% 
      %% connecting both constraint systems
      %% 
      {RI.intBounds MaxProfit FDMaxProfit}
      {Map Products
       proc {$ R D} {RI.intBounds R D} end FDProducts}
 
       
      {DistributeKnapSackLP Products ObjFn Constraints
       MaxProfit}
   end 
end 

The Oz Explorer produces the following search tree by calling

{ExploreBest {KnapsackFDLP Problem}  
             proc {$ O N} O.maxprofit <: N.maxprofit end}

.


Tobias Müller
Version 1.4.0 (20080702)