2013-02-12 11 views
5

मेरे पास LPSolve नामक एक प्रोग्राम है जो मिश्रित पूर्णांक अनुकूलन समस्याओं को हल करता है। समस्या यह है कि मैं गतिशील रूप से पुनरावृत्तियों के दौरान बाधाओं को जोड़ नहीं सकता, इसलिए मैं एक हास्केल प्रोग्राम लिखने के बारे में बताता हूं जो LPSolve का उपयोग विश्राम को हल करने के लिए करता है और फिर समाधानों के आधार पर कुछ अतिरिक्त बाधाओं का अनुमान लगाता है। समस्या संरचना का उपयोग करने वाली बाधाएं।हास्केल/रैखिक प्रोग्रामिंग पैकेज में अन्य प्रोग्राम चलाना

क्या हैस्केल में निष्पादन योग्य चलाने और टर्मिनल पर भेजे गए आउटपुट को पुनर्प्राप्त करना संभव है?

क्या कोई हास्केल पैकेज मौजूद है जो रैखिक प्रोग्रामिंग समस्याओं को हल करता है?

उत्तर

5
runInteractiveProcess साथ

आप कर सकते हैं stdin/stdout के माध्यम से एक निर्वासन की प्रक्रिया के लिए 'बात'

+0

यही वही है जो मुझे चाहिए। धन्यवाद :) – Undreren

3

आप GLPK का उपयोग करें और बना सकते हैं और हास्केल कोड में समस्याओं से चला सकते हैं

-- 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 कुछ अच्छा पुस्तकालय तरीकों है बाहरी प्रक्रियाओं को चलाने के लिए। इसका उद्देश्य हैस्केल में शैल स्क्रिप्ट लिखना है, लेकिन इसका कोई कारण नहीं है कि आप इसे एप्लिकेशन में इस्तेमाल नहीं कर पाएंगे। मुझे मानक लाइब्रेरी विधियों की तुलना में शैल स्क्रिप्टिंग कार्यों के लिए यह कहीं अधिक सुविधाजनक लगता है।

संबंधित मुद्दे