平均计算中的近似因子

时间:2013-01-21 18:24:13

标签: java algorithm math weighted-average

这是我想要做的: 我有一个大小为N的双[](N不会大于500,但该程序的不同应用程序将具有不同的Ns)。我现在想知道我可以达到给定平均值的组合。例如:

我寻找的数字是3.双数组中只有2个项目{6,2}

程序应循环并告诉我1x [0]和3x [1] = 6 + 2 + 2 + 2/4 = 3是最简单的方法。我还想将这些因素限制在最大值10,000(即最大值为10,000 [0] +10,000 [1])

我正在试验嵌套的while循环,但无法让它工作。请快点开始吧?

感谢

编辑:这是我到目前为止所拥有的。它适用于两个给定的组合,但由于每个因素都需要一个for循环,所以实施起来会令人费解。

public class Test {
public static void main(String[] args) {
    double[] returns = {6,2};
    double givenReturn = 3;
    double maxStock = 5000;
    double calcReturn = 0;


    for (int a = 0; a < maxStock && (givenReturn != calcReturn); a++) {//first level

        for (int b = 0; b < maxStock && (givenReturn != calcReturn); b++) {//second level

            calcReturn = (a*returns[0]+b*returns[1])/(a+b);
            if(calcReturn == givenReturn){
                System.out.println(a+" "+b);
                break;
            }
        }

    }



}

}

程序成功打印:“1 3”。

如何使用十个不同的返回数组来使程序工作?

1 个答案:

答案 0 :(得分:0)

为了便于参考,您的问题以数学方式进行:

Given an integer T and a vector c (|c| <= 500), solve for vector a and integer b:
(all numbers are non-negative integers)
a0.c0 + a1.c1 + a2.c2 + ... = T.b
a0 + a1 + a2 + ... = b
each ai <= 10000
b > 0
Additional constraint: minimize b

对于你的例子:

c为{6,2},T为3,a为{1,3},b为4。

感觉应该有mathematical方法来解决它(尽管我怀疑有)。

蛮力太慢了。对于500种类型,每种情况最多10000次,我们说的是500 ^ 10000,这是......很多。

我在考虑CSPhill climbing

爬山很容易实现 - 你基本上只是从一些随机选择的元素开始,然后添加和删除元素以更接近目标。

The wiki page on integer programming有一些有用的信息。