我有这个问题,其中包含一些不等式和最小化值的要求。在网上做了一些研究后,我得出的结论是,使用 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.
Run Code Online (Sandbox Code Playgroud)
我需要找到使 w 最小化的 a、b、c、d、e、f、g 和 h 的值。
请注意,以上只是一个例子。在实际程序中,我会使用多达 10000 个变量和多达 20 个 if..then 子句。这排除了线性规划作为替代技术的可能性,因为测试所有 LP 问题需要大量的 RAM 和时间。
我并不是真的要代码,尽管如果 Prolog 真的很好,我会很感激一些提示如何解决这个问题。谢谢。
小智 5
您可以查看约束逻辑编程,CLP(R)、CLP(Q) 或 CLP(FD)。您的问题可以编码为 CLP(R) 如下(我认为):
:- use_module(library(clpr))。
测试(溶胶([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=
使用 SICStus Prolog,我得到以下答案:
| ?- 测试(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} ? ;
不