【问题标题】:Optimisation in swi prologswi prolog 中的优化
【发布时间】:2016-09-05 15:22:24
【问题描述】:

假设我想找到 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.

【问题讨论】:

    标签: prolog swi-prolog quadratic-programming


    【解决方案1】:

    这里有几个问题。首先,只是为了解决这个问题:library(simplex) 只能处理 linear 约束。所以是的,它不能——至少不能直接——用来解决你的实际问题。

    library(simplex) 无论如何都经常有用,所以我想快速指出以下几点:

    1. variable_value/3 仅适用于 已解决 画面。这意味着您必须首先调用maximize/3

      例如:

      ?- my_constraints(S), maximize([x,y], S, Max), variable_value(Max, x, X).
      S = ...,
      Max = ...,
      X = 0.
      
    2. 请注意,您必须将my_constraint/1 的最终目标更改为constraint([-1*x, -1*y,z] = 0, S5, S),以符合此库要求的语法。

    话虽如此,现在让我们进入问题的核心:有众所周知的方法可以迭代解决二次优化问题,使用一系列线性程序和关于梯度的推理以更接近解决方案。因此,library(simplex) 仍然可以间接用于解决您的问题。

    特别是查看miscellaneous programs 提供的最陡上升方法。它包括一个用 Prolog 编写的小型符号导数计算器。是的,它是“象征性的”;-)

    插入你的任务,我得到:

    ?- 最大化(- 0.5*(20*x​​(1)^2 + 32*x(1)*x(2) + 16*x(2)^2) + 2*x(1) + 2*x( 2), [[-1,0,0], [0,-1,0], [0,0,-1], [-1,-1,1], [1,1,-1]], [0,0,0,0,0], [0,0,0],最大值)。 最大值 = [4.298588509886033e-17, 0.125, 0.12500000000000006] ; 错误的。

    我希望你可以使用它,直到浮点运算令人难以忍受的肮脏。

    【讨论】:

    • 谢谢,我对输入矩阵有点困惑。这是约束吗?第一行 [-1,0,0] 是否对应于下一个参数的第一个元素,也就是说 x(1) >=0?在这种情况下,为什么我们有 [-1,-1,1] 和 [1,1,-1]] ?
    • 用不等式表示等式约束 ;-)
    • 对不起,我还是一头雾水。如果我有 6 个需要求和为零的未知数而不是三个未知数,我会放什么我在矩阵中仍然只有两行彼此相对?
    • 因为每一行都是不等式>=或者是=
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2016-01-16
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多