用Prolog解决线性规划问题

时间:2016-07-28 13:19:37

标签: prolog linear-programming instantiation-error

我正在尝试解决http://www.zweigmedia.com/RealWorld/tutorialsf4/framesLinProGr.html上的第一个线性规划问题示例。 X和Y为零或正数,它们的总和可以达到50,2X + Y可以达到60.函数X + 3Y必须最大化。

我正在使用以下代码:

mysol2(X,Y,Z):-
    X in 0..sup,  % Error: Syntax error: Operator expected
    Y in 0..sup,
    X + Y =< 50,
    2 * X + Y =< 60,
    Z is max(X + 3*Y).

但是,它甚至没有加载(错误如上所示)。

使用以下代码:

mysol2(X,Y,Z):-
    X >= 0,
    Y >= 0,
    X + Y =< 50,
    2 * X + Y =< 60,
    Z is max(X + 3*Y).

程序加载,但在运行时:

ERROR: >=/2: Arguments are not sufficiently instantiated

如何更正这些错误?

1 个答案:

答案 0 :(得分:3)

(>=)/2(is)/2非常低级别的谓词。您只能在非常特殊的情况下使用它们。在大多数情况下,这些谓词会导致实例化错误,因为一个或两个参数没有充分实例化。

在这种情况下,

约束是一种声明性解决方案,在所有情况下都能正常工作。

例如,您可以使用SICStus Prolog中提供的 CLP(Q),只需对代码进行最少的修改:

:- use_module(library(clpq)).

solution(X, Y) :-
    { X >= 0,
      Y >= 0,
      X + Y =< 50,
      2*X + Y =< 60 }.

示例查询和结果:

| ?- solutionX, Y), maximize(X+3*Y).
X = 0,
Y = 50  ? ;
no

最广泛使用的Prolog和Prolog类系统(SICStus,ECLiPSe等)都附带强大的约束库,这些库在推理整数和有理数时非常有用。