2013-02-12 3 views
5

私は混合整数最適化の問題を解決するLPSolveというプログラムを持っています。問題は、繰り返し中に制約を動的に追加することができないことです。だから、LPSolveを使用してリラクゼーションを解決し、そのソリューションに基づいていくつかの追加の制約を推論するHaskellプログラムを作成します。問題の構造を利用する制約。Haskell/Linearプログラミングパッケージで他のプログラムを実行する

実行可能ファイルをHaskellで実行し、端末に送信された出力を取得することはできますか?

線形プログラミングの問題を解決するHaskellパッケージが存在しますか? runInteractiveProcess

答えて

5

することができます標準入力/標準出力を経由してのexternプロセスに「話」

+0

これは私が必要とするものです。ありがとうございました :) – Undreren

3

あなたはGLPKを使用して作成し、Haskellのコードに問題を実行することができます

-- Usando GLPK, http://www.gnu.org/software/glpk/ 
import Data.List 
import Data.Maybe 
import Control.Monad 
import Data.LinearProgram 
import Data.LinearProgram.GLPK 
import qualified Data.Map as M 

-- Sólo por dar nombre a las varibles 
x e = "X" ++ show e 

-- Resuelve el problema de elegir el menor número de empleados 
solveEmployees :: [(Int, Int)] -> LP String Int 
solveEmployees es = execLPM $ do setDirection Min 
            setObjective $ linCombination $ map (\e -> (1, x e)) emps 
            mapM_ (\(a, b) -> geqTo (varSum [x a, x b]) 1) es 
            mapM_ (\n -> setVarKind (x n) BinVar) emps 
            where emps = nub $ map fst es ++ map snd es 

-- Wrapper suponiendo que siempre hay solución (aquí siempre) 
getEmployees :: [(Int, Int)] -> IO [Int] 
getEmployees es = do 
    (_, Just (_, m)) <- glpSolveVars mipDefaults $ solveEmployees es 
    return $ map (read.tail.fst). M.toList. M.filter (==1) $ m 

-- Tráfico de influencias, intentaremos que el empleado 'e' vaya a la playa 
--  (da igual que sea de Estocolmo o de Londres) 
getEmployees' :: Int -> [(Int, Int)] -> IO [Int] 
getEmployees' e es = do 
    r <- getEmployees es 
    r' <- getEmployees $ filter (\(a, b) -> a /= e && b /= e) es 
    return $ if length r == 1 + length r' then e: r' else r 

-- Test 
main = do 
    putStrLn $ "Input: " ++ show test2 
    putStrLn "Testing: solveEmployees" 
    r1 <- getEmployees test2 
    putStrLn $ show r1 
    putStrLn "Testing: solveEmployees' 2001" 
    r2 <- getEmployees' 2001 test2 
    putStrLn $ show r2 

test1 :: [(Int, Int)] 
test1 = [(1009, 2011), (1017, 2011)] 

test2 :: [(Int, Int)] 
test2 = [(1009, 2000), (1009, 2001), (1008, 2000), (1008, 2001)] 
4

Shelly packageいくつかの素晴らしいライブラリのメソッドを持っています外部プロセスを実行するため。 Haskellでシェルスクリプトを書くことを目的としていますが、アプリケーションでそれを使用できない理由はありません。シェルスクリプトのタスクでは、標準のライブラリメソッドよりもずっと便利です。

関連する問題