Prolog是解决这类问题的最佳语言吗?

时间:2010-03-19 03:59:42

标签: prolog

我有这个问题包含一些不公平和要求最小化一个值。在对互联网进行一些研究之后,我得出结论,使用Prolog可能是解决它的最简单方法。但是,我之前从未使用过Prolog,我不想浪费时间学习它,只是发现它不适合这项工作。

如果你知道Prolog,请看一下这个问题并告诉我Prolog是否是正确的。或者,如果你知道其他一些非常适合这种语言的语言。

a + b + c >= 100
d + e + f >= 50
g + h     >= 30

if (8b + 2e + 7h > 620) then y = 0.8 else y = 1.0
if (d > 35)             then x = 0.9 else x = 1.0

5xa + 8yb + 5c + 3xd + 2ye + 2f + 6xg + 7yh = w.

我需要找到最小化w的a,b,c,d,e,f,g和h的值。

请注意,以上只是一个例子。在实际程序中,我将使用多达10000个变量和最多20个if..then子句。这排除了线性编程作为一种替代技术,因为它需要大量的RAM和时间来测试所有LP问题。

我并不是真的要求代码,虽然如果Prolog真的很好,我会很感激如何解决这个问题。感谢。

3 个答案:

答案 0 :(得分:4)

您可以查看约束逻辑编程,CLP(R),CLP(Q)或CLP(FD)。 您的问题可以编码为CLP(R),如下所示(我认为):

:- use_module(library(clpr)).

test(sol([A,B,C,D,E,F,G,H], [X,Y,W])) :-
    {A >=0, B >=0, C>=0, D>=0, E>=0, F>=0, G>=0, H>=0},
    {A + B + C >= 100},
    {D + E + F >= 50},
    {G + H     >= 30},
    {5*X*A + 8*Y*B + 5*C + 3*X*D + 2*Y*E + 2*F + 6*X*G  + 7*Y*H = W},
    (({8*B + 2*E + 7*H > 620},{Y=0.8}) ; ({8*B + 2*E + 7*H =35},{X=0.9}) ; ({D=

Using SICStus Prolog, I get the following answer:

| ?- test(A). A = sol([_A,0.0,_B,0.0,_C,_D,30.0,0.0],[1.0,1.0,780.0]), {_A=100.0-_B}, {_C=50.0-_D}, {_B==0.0}, {_D>=0.0} ? ; no

答案 1 :(得分:3)

您可以使用linear programming(LP)解决此问题,但问题需要进行一些修改才能将其放入LP求解器中。 LP问题基本上涉及在给定某些约束的情况下最大化或最小化函数。

首先,将问题分解为两个问题(因为LP不支持您拥有的两个if条件):

Constraints:
a + b + c >= 100
d + e + f >= 50
g + h     >= 30
8b + 2e + 7h > 620

Linear function:
5 * 0.8a + 8 * 1.0b + 5c + 3 * 0.8d + 2 * 1.0e + 2f + 6 * 0.8g + 7 * 1.0h = w

Constraints:
a + b + c >= 100
d + e + f >= 50
g + h     >= 30
d > 35

Linear function:
5 * 1.0a + 8 * 0.9b + 5c + 3 * 1.0d + 2 * 0.9e + 2f + 6 * 1.0g + 7 * 0.9h = w

在LP求解器分别运行两者之后,解决方案将出现a,b,c,d,e,f,g,h和w的值。选择较小的w值和a,b,c,d,e,f,g,h的相应值。

这是如何运作的?

两个if条件实际上与列出的其他约束相似,只是它们需要不同的x和y值。由于这两个条件是互斥的(假设两者都不能满足,因为x和y因此具有不同的值),您可以将它们分成两个单独的LP问题。因此,您可以单独解决LP问题,因此您将达到最小值w。

对于LP解算器,请转到上面链接的线性编程维基百科文章。有像Excel和其他一些更容易使用的工具,但如果你想要一个程序,那么有一些擅长的数字语言,或像C这样的通用语言可以用像glpk这样的库来实现。

希望这有帮助!

答案 2 :(得分:1)

我以前没有遇到过类似的问题,所以我不能给你任何直接的建议。但是,我不会使用Prolog。 Prolog非常适合处理符号问题(一个典型的例子是Einstein puzzle),但它的数学支持非常尴尬;感觉就像数学被认为是事后的想法。