我遇到的问题包含一些不等式和最小化值的要求。在网上做了一些研究后,我得出的结论是使用 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/