C++ 通过选择2个随机值优化表达式

C++ 通过选择2个随机值优化表达式,c++,C++,我有一个表情 abs(z - x*a + y*b) 其中,z、a和b例如给出 如果z=2,a=1,b=2;然后我们的方程将看起来像abs(2-x*1+y*2)。因此,我们必须选择x和y值,以使表达式值最小化 我尝试了一种蛮力方法,即使用从-z到z的两个循环,并尝试下面提到的所有可能的值 int bestval(int a,int b,int m) { int ans=INT_MAX; for(int i=-m;i<=m;i++) { for(int

我有一个表情

abs(z - x*a + y*b)
其中,z、a和b例如给出

如果z=2,a=1,b=2;然后我们的方程将看起来像
abs(2-x*1+y*2)
。因此,我们必须选择x和y值,以使表达式值最小化

我尝试了一种蛮力方法,即使用从-z到z的两个循环,并尝试下面提到的所有可能的值

int bestval(int a,int b,int m)
{
    int ans=INT_MAX;
    for(int i=-m;i<=m;i++)
    {
        for(int j=-m;j<=m;j++)
        {
        ans=min(ans,abs(m-a*i+b*j));
        }
    }
    return ans;
}
intbestval(inta,intb,intm)
{
int ans=int_MAX;

对于(int i=-m;i你可以通过微积分来求解它,计算上述方程的导数,找到临界点,在方程中插入临界点,然后瞧,你就得到了你的解。例如,请看。此外,因为你必须使用两个变量。使用这个备忘单

  • |x|
    wrt
    x
    的导数是
    x/|x|
  • A*x^n
    wrt
    x
    的导数是
    A*n*(x^(n-1))
    A
    是常数)

  • 你们可以通过微积分,计算上述方程的导数,找到临界点,在方程中插入临界点,然后你们就得到了你们的解。比如,你们可以看到。而且,因为你们必须使用两个变量。使用这个备忘单

  • |x|
    wrt
    x
    的导数是
    x/|x|
  • A*x^n
    wrt
    x
    的导数是
    A*n*(x^(n-1))
    A
    是常数)

  • 有许多优化算法


    我建议您从开始。它不一定是最快的,但它通常是健壮的,不需要衍生工具。

    有许多优化算法


    我建议你从开始。它不一定是最快的,但它通常是健壮的,不需要导数。

    但是有两个未知变量,我应该从哪个方面推导表达式,但有两个未知变量,我应该从哪个方面推导表达式,在将wrt推导到eqn pow(m-ai+bj)的I之后,2)在推导wrtj时,
    abs(z-x*a+y*b)
    的最小值将是
    y*b-x*a=z
    y=(a/b)x+z/b
    (这是一行的方程式其中斜率
    m=a/b
    和y-截距
    b_yint=z/b
    。因此对于任何值
    x
    ,在满足直线方程的直线上有相应的
    y
    ,从而得到最小的
    abs(z-x*a+y*b)
    @DavidC.Rankin这真的是高质量的信息,所以你的意思是,不用使用两个循环,我可以将其简化为一个循环?但最终,x和y值应该知道如何满足该等式?是的。因为你知道线上的每个点都会满足制造
    abs(z-x*a+y*b)
    minimum您只需要循环一个变量就可以找到另一个变量。仔细想想。您所做的只是说您在
    abs(0)上有一个最小值
    。因此,任何非零的
    x
    y
    值都不是最小值。通过以这种方式接近它,并使用所有构成最小值的点位于一条线上的关系,可以有效地消除一个自变量,使一个自变量依赖于另一个。@DavidC.Rankin在一个变量上循环的范围正如我之前从-z到+z,它现在也会一样吗?在推导出等式pW(m-ai+bj)的wrt到i之后,2)我最终得到-2a*(m-ai+bj)=0,这意味着当推导出
    abs(z-x*a+y*b)的最小值时,m=ai bj和-2b*(m-ai+bj)
    将是
    y*b-x*a=z
    y=(a/b)x+z/b
    (这是一行的方程式
    y=mx+b\yint
    )其中斜率
    m=a/b
    和y-截距
    b_yint=z/b
    。因此对于任何值
    x
    ,在满足直线方程的直线上有相应的
    y
    ,从而得到最小的
    abs(z-x*a+y*b)
    @DavidC.Rankin这真的是高质量的信息,所以你的意思是,不用使用两个循环,我可以将其简化为一个循环?但最终,x和y值应该知道如何满足该等式?是的。因为你知道线上的每个点都会满足制造
    abs(z-x*a+y*b)
    minimum您只需要循环一个变量就可以找到另一个变量。仔细想想。您所做的只是说您在
    abs(0)上有一个最小值
    。因此,任何非零的
    x
    y
    值都不是最小值。通过以这种方式接近它,并使用所有构成最小值的点位于一条线上的关系,可以有效地消除一个自变量,使一个自变量依赖于另一个。@DavidC.Rankin循环一个变量的范围就像我之前从-z到+z一样,现在也一样吗??