假设我想找到 argmax(x,y,z) -1/2(20x^2+32xy +16y^2)+2x+2y。
服从:x>=0, y>=0,z>=0 和 -x-y+z =0。
我知道设置为 0 的偏导数是:
-20x-16y+2=0 和 -16x-16y+2=0
所以我们可以有 x= 0 和 y =1/8 和 z=1/8。
我将如何在 Swi-prolog 中执行此操作?我看到有用于线性求解的库单纯形,但这是一个二次问题,但偏导数不是。(我有一点疑惑!)
这就是我所拥有的:
:- use_module(library(simplex)).
my_constraints(S):-
gen_state(S0),
constraint([-20*x, -16*y] = 0, S0, S1),
constraint([-16*x,-16*y] = 0, S1,S2),
constraint([x] >= 0,S2,S3),
constraint([y] >= 0,S3,S4),
constraint([z] >= 0,S4,S5),
constraint([-x-y+z] = 0,S5,S).
?- my_constraints(S), variable_value(S,x,Val1),variable_value(S,y,Val2).
false.