gpt4 book ai didi

prolog - swi prolog 中的优化

转载 作者:行者123 更新时间:2023-12-04 19:43:57 24 4
gpt4 key购买 nike

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

最佳答案

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

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

  • variable_value/3仅适用于 已解决 画面。这意味着您必须调用 maximize/3第一的。

    例如:
    ?- my_constraints(S), maximize([x,y], S, Max), variable_value(Max, x, X).
    S = ...,
    Max = ...,
    X = 0.
  • 请注意,您必须更改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] ;
    错误的。

    也就是说,直到浮点运算令人无法忍受的肮脏,我希望你可以使用它。

    关于prolog - swi prolog 中的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142066/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com