prolog - Prolog是解决此类问题的最佳语言吗?

标签 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 子句。这排除了线性编程作为替代技术的可能性,因为测试所有 LP 问题需要大量的 RAM 和时间。

我并不是真的要求代码,尽管如果 Prolog 真的很适合的话,我会很感激一些如何解决这个问题的提示。谢谢。

最佳答案

您可以看看约束逻辑编程,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

关于prolog - Prolog是解决此类问题的最佳语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2474912/

相关文章:

Prolog查询:- true,失败;不真实,不失败;真实,不失败

序言挑战

prolog - 序言中的保护条款?

prolog - 在 Prolog 中处理用户输入到 "phrase/3"方法

recursion - GNU Prolog - 递归问题(简单?)

prolog - 如何在prolog中模拟嵌套循环?

prolog - 有没有办法在谓词参数内进行操作?

prolog - Prolog中从列表前面取出n个元素

prolog - 在 Prolog 中制表,什么时候存储值?

prolog - Prolog 程序出现错误 : >/2: Arguments are not sufficiently instantiated