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|
wrtx
的导数是x/|x|
A*x^n
wrtx
的导数是A*n*(x^(n-1))
(A
是常数)
你们可以通过微积分,计算上述方程的导数,找到临界点,在方程中插入临界点,然后你们就得到了你们的解。比如,你们可以看到。而且,因为你们必须使用两个变量。使用这个备忘单
|x|
wrtx
的导数是x/|x|
A*x^n
wrtx
的导数是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一样,现在也一样吗??