packages feed

limp-cbc-0.3.2.1: examples/Simple.hs

module Simple (simple) where

import Base
import Numeric.Limp.Rep
import Numeric.Limp.Program

-- Minimise     a + b
-- Subject to   a + 2b >= 3
-- Where        0 <= a <= 10 :: Z
--              0 <= b <= 10 :: R
problem1 :: Direction -> Program String String IntDouble
problem1 dir
 = program dir
           (z1 "a" .+. r1 "b" )
           (z1 "a" .+. r "b" 2 :>= con 3)
           [ lowerUpperZ 0 "a" 10
           , lowerUpperR 0 "b" 10 ]

-- As above, but swap coefficients on >= 3 constraint.
--
-- Minimise     a + b
-- Subject to   2a + b >= 3
-- Where        0 <= a <= 10 :: Z
--              0 <= b <= 10 :: R
problem2 :: Direction -> Program String String IntDouble
problem2 dir
 = program dir
           (z1 "a" .+. r1 "b" )
           (z "a" 2 .+. r1 "b" :>= con 3)
           [ lowerUpperZ 0 "a" 10
           , lowerUpperR 0 "b" 10 ]


-- Leave out the bounds on variables
--
-- Minimise     a + b
-- Subject to   a >= b
--              b >= a
--              a >= 3
--              b <= 10
-- Where        a :: Z
--              b :: R
problem3 :: Direction -> Program String String IntDouble
problem3 dir
 = program dir
           (z1 "a" .+. r1 "b")
           (   z1 "a" :>= r1 "b"
           :&& r1 "b" :>= z1 "a"
           :&& z1 "a" :>= con 3
           :&& r1 "b" :<= con 10)
           [ ]


simple :: IO ()
simple
 = do   solve_problem problem1
        solve_problem problem2
        solve_problem problem3