diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d526e5 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +This library implements a simple eDSL for linear programming and a simple +wrapper around lp_solve (potentially other solvers can also be plugged in +easily). Here's how to solve the farmer example from the lp_solve +documentation: + +> Suppose a farmer has 75 acres on which to plant two crops: wheat and barley. +> To produce these crops, it costs the farmer (for seed, fertilizer, etc.) $120 +> per acre for the wheat and $210 per acre for the barley. The farmer has +> $15000 available for expenses. But after the harvest, the farmer must store +> the crops while awaiting favourable market conditions. The farmer has storage +> space for 4000 bushels. Each acre yields an average of 110 bushels of wheat +> or 30 bushels of barley. If the net profit per bushel of wheat (after all +> expenses have been subtracted) is $1.30 and for barley is $2.00, how should +> the farmer plant the 75 acres to maximize profit? + + import Control.Monad + import Math.LinProg.LPSolve + import Math.LinProg.Types + + data Crop = Wheat | Barley + deriving (Eq, Show, Ord) + + lp :: LinProg Double Crop () + lp = do + let vs@[w, b] = map var [Wheat, Barley] + obj $ negate $ 110 * 1.3 * w + 30 * 2 * b + 120 * w + 210 * b <: 15000 + 110 * w + 30 * b <: 4000 + w + b <: 75 + + main :: IO () + main = do + sol <- solve lp + print sol + +This outputs the solution: Right [(Wheat,21.875),(Barley,53.12499999999999)]. +Due to the monadic structure one can build up LPs using the usual monadic +controls such as mapM/forM etc, making it quite easy to specify constraints. |