如何编程解决y =(a1 * x1)+(a2 * x2)+ .... +(a28 * x28)其中y和a1,a2 .... a28是已知的?

时间:2012-12-14 03:33:19

标签: algorithm math

我试图用28个变量来解决这个等式:

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

1)y是已知的,a1,a2也一直通过a28。

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

有人可以在我困惑的大脑上找到一些关于在这里使用哪种算法最有效的算法吗?

3 个答案:

答案 0 :(得分:2)

这相当于整数线性规划,但由于只有一个方程有28个简单约束(边界,而不是方程组),你可能会做得更好。一般来说,这将是NP难的(参见https://en.wikipedia.org/wiki/Linear_programming#Integer_unknowns),但您可以使用多种实现(例如参见How to choose an integer linear programming solver?

答案 1 :(得分:1)

首先将所有内容乘以10,这样你就可以保持整数数学。另外向两边添加sum(40 * a_u)会将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;

你可以通过传回可行范围([y + a_i *( - 4.0),y + a_i * 4.0])并在这些界限之外修剪不可行的部分解决方案来做得更好。

答案 2 :(得分:1)

您可以在prolog(SICStus prolog引擎和Eclipse上的SPIDER IDE)中对其进行编程。这个问题是状态空间搜索问题。并使用clpfd库(有限域上的约束逻辑编程)。然后你只做一个约束,X1到X28将是域变量并且给定约束y#= a1 * X1 + ... + a28 * X28。优化搜索状态空间的方法也很少。

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