Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何以编程方式求解y=(a1*x1)和#x2B;(a2*x2)和#x2B+;(a28*x28)其中y和a1,a2…a28已知?_Algorithm_Math - Fatal编程技术网

Algorithm 如何以编程方式求解y=(a1*x1)和#x2B;(a2*x2)和#x2B+;(a28*x28)其中y和a1,a2…a28已知?

Algorithm 如何以编程方式求解y=(a1*x1)和#x2B;(a2*x2)和#x2B+;(a28*x28)其中y和a1,a2…a28已知?,algorithm,math,Algorithm,Math,我试图用28个变量来解这个方程: y=(a1*x1)+(a2*x2)+..+(a28*x28) 1) y是已知的,a1,a2一直到a28也是已知的 2) x1,x2。。。。。x28是未知变量,它们在[-4,4]范围内,增量为0.1 有人能告诉我在这里使用什么算法最有效吗?这相当于整数线性规划,不过因为只有一个方程有28个简单约束(边界,而不是方程组),你可能会做得更好。一般来说,这将是NP难的(请参阅),但您可能可以使用几个实现(例如,请参阅)这相当于整数线性规划,尽管由于只有一个方程具有28个

我试图用28个变量来解这个方程:

y=(a1*x1)+(a2*x2)+..+(a28*x28)

1) y是已知的,a1,a2一直到a28也是已知的

2) x1,x2。。。。。x28是未知变量,它们在[-4,4]范围内,增量为0.1


有人能告诉我在这里使用什么算法最有效吗?

这相当于整数线性规划,不过因为只有一个方程有28个简单约束(边界,而不是方程组),你可能会做得更好。一般来说,这将是NP难的(请参阅),但您可能可以使用几个实现(例如,请参阅)

这相当于整数线性规划,尽管由于只有一个方程具有28个简单约束(边界,而不是方程组),您可能可以做得更好。一般来说,这将是NP难的(请参阅),但您可能可以使用几个实现(例如,请参阅)

首先,将所有值乘以10,这样您就可以继续使用整数数学。另外,将总和(40*a_)添加到两侧,会将x_i的范围更改为[0,80]

其次,答案的数量可能是指数级的,因此您的算法必须花费指数级的时间

考虑到有80^28(大约2^177)个可能的答案,这在一般情况下是不可能的

现在如果x_i的范围是[0,1](而不是[0,80]),我们再加上一个等于y的额外项(并将y改为0),那么问题就变成了找到一组整数的子集,这些整数加起来等于零。这是一个众所周知的NP完全问题,它似乎比你的更容易(尽管我没有一个明确的简化)

可能有动态规划解决方案,但可能太慢:

set<float> X;

X.insert(0)

for i = 1 to 28
    for f = -4.0 to 4.0 step 0.1
        for x in X
            X.insert(x + a_i * f)

for x in X
    if (x == y)
        return true;

return false;
set X;
X.插入(0)
对于i=1到28
对于f=-4.0到4.0步骤0.1
对于x中的x
插入(X+a_i*f)
对于x中的x
如果(x==y)
返回true;
返回false;

你可以通过传回可行范围(y+a_i*(-4.0),y+a_i*4.0)并修剪那些边界之外的不可行部分解来做得更好。

首先,将所有值乘以10,这样你就可以保持整数数学。另外,将总和(40*a_)添加到两侧,会将x_i的范围更改为[0,80]

其次,答案的数量可能是指数级的,因此您的算法必须花费指数级的时间

考虑到有80^28(大约2^177)个可能的答案,这在一般情况下是不可能的

现在如果x_i的范围是[0,1](而不是[0,80]),我们再加上一个等于y的额外项(并将y改为0),那么问题就变成了找到一组整数的子集,这些整数加起来等于零。这是一个众所周知的NP完全问题,它似乎比你的更容易(尽管我没有一个明确的简化)

可能有动态规划解决方案,但可能太慢:

set<float> X;

X.insert(0)

for i = 1 to 28
    for f = -4.0 to 4.0 step 0.1
        for x in X
            X.insert(x + a_i * f)

for x in X
    if (x == y)
        return true;

return false;
set X;
X.插入(0)
对于i=1到28
对于f=-4.0到4.0步骤0.1
对于x中的x
插入(X+a_i*f)
对于x中的x
如果(x==y)
返回true;
返回false;

通过传回可行范围(y+a_i*(-4.0),y+a_i*4.0)并删减那些边界之外不可行的部分解,可以做得更好。

可以在prolog中编程(SICStus prolog引擎,例如Eclipse上的SPIDER IDE)。这个问题就是状态空间搜索问题。并使用clpfd库(有限域上的约束逻辑编程)。然后只做一个约束,X1到X28将是域变量,并且给定约束y#=a1*X1+…+a28*X28。还有一些方法可以优化状态空间的搜索

/编辑:
或者你可以尝试用任何命令式语言。还可以使用一些启发式方法-例如,选择一些执行点,在那里可以检查当前结果(例如,您有一些tmp.sum,并且您已经用28个值中的15个进行计数。如果y减去temp sum小于MIN_VARIABLE_VALUE*i,其中i是索引,x_i属于剩余变量,您可以安全地决定,您不会继续,bcs。您无法获得相等)这个启发首先出现在我的脑海中。Use也可以在这方面使用一些替代。但是应该对一些测试数据进行“研究”,看看它的效率有多高。

你可以用prolog(SICStus prolog engine,例如Eclipse上的SPIDER IDE)对它进行编程。这个问题是状态空间搜索问题。使用clpfd库(有限域上的约束逻辑编程)。然后只需执行一个约束,X1到X28将是域变量,并给定约束y#=a1*X1+…+a28*X28。也有一些方法可以优化状态空间的搜索

/编辑:
或者你可以尝试用任何命令式语言来做。也可以使用一些启发式方法——例如,选择一些执行点,在那里你可以检查当前的结果(例如,您有一些tmp.sum,并且您已经用28个值中的15个进行计数。如果y减去temp sum小于MIN_VARIABLE_VALUE*i,其中i是索引,x_i属于剩余变量,您可以安全地决定,您不会继续,bcs。您无法获得相等)。这个启发首先出现在我的脑海中。Use也可以在这方面使用一些替代。但是应该对一些测试数据进行“研究”,看看它的效率有多高。

x1…x28都是不同的值吗?因为在这种情况下,如果我没有弄错的话,将会有非常大量的有效解决方案。你所说的
范围[-4,4]是什么意思使用0.1增量
?@irrelephant我猜它们是-4或-3.9或….3.9或4在至少一个场景中,将有439804651104000000000000个解决方案。
a和
y是实数、有理数还是整数?x1…x28都是不同的值吗?因为在这种情况下,将有一个非常非常非常的l