使用 Prolog 求解线性规划
Solving linear programming with Prolog
我正在尝试解决 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
如何更正这些错误?
(>=)/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 等)都附带强大的约束库,这些库主要用于对整数和有理数进行推理。
我正在尝试解决 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
如何更正这些错误?
(>=)/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 等)都附带强大的约束库,这些库主要用于对整数和有理数进行推理。