2013-02-12 20 views
5

Tôi có một chương trình được gọi là LPSolve giải quyết các vấn đề tối ưu hóa số nguyên hỗn hợp. Vấn đề là tôi không thể tự động thêm các ràng buộc trong các lần lặp, vì vậy tôi mặc dù viết một chương trình Haskell sử dụng LPSolve để giải các thư giãn và sau đó suy ra một số ràng buộc bổ sung dựa trên các giải pháp. Các ràng buộc sử dụng cấu trúc bài toán.Chạy các chương trình khác trong gói lập trình Haskell/Linear

Có thể chạy tệp thực thi trong Haskell và truy xuất đầu ra được gửi tới thiết bị đầu cuối không?

Có tồn tại gói Haskell giải quyết các vấn đề lập trình tuyến tính không?

Trả lời

5

Với runInteractiveProcess bạn có thể 'nói chuyện' với một quá trình extern qua stdin/stdout

+0

Đó chính xác là những gì tôi cần. Cảm ơn bạn :) – Undreren

3

Bạn có thể sử dụng GLPK và tạo và chạy các vấn đề vào mã 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

Các Shelly package có một số phương pháp thư viện đẹp để chạy các quy trình bên ngoài. Nó nhằm mục đích viết kịch bản shell trong Haskell nhưng không có lý do gì bạn không thể sử dụng nó trong một ứng dụng. Tôi thấy nó thuận tiện hơn cho các tác vụ kịch bản lệnh shell so với các phương thức thư viện chuẩn.

Các vấn đề liên quan