0

これが私がやりたいことです:私はサイズNのdouble []を持っています(Nは500より大きくはありませんが、このプログラムの異なるアプリケーションは異なるNを持ちます)。ここで、特定の平均を達成できる組み合わせを調べたいと思います。例えば:

私が探している数は3です。double配列には2つの項目しかありません{6,2}

プログラムはループして、1x[0]と3x[1] = 6 + 2 + 2 + 2/4=3がこれに到達する最も簡単な方法であることを教えてくれるはずです。また、これらの要素を最大で10,000に制限したいと思います(つまり、最大10,000 [0] +10,000 [1]にすることができます)。

ネストされたwhileループを試していましたが、機能させることができませんでした。ジャンプスタートしてください?

ありがとう

編集:これが私がこれまでに持っているものです。これは、指定された2つの組み合わせで機能しますが、各要素に1つの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;
            }
        }

    }



}

}

プログラムは正常に「13」を出力します。

たとえば、10個の異なるリターンの配列を使用してプログラムを機能させるにはどうすればよいですか?

4

1 に答える 1

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になります。

それを解決する数学的な方法があるはずだと感じています(私はそうは思いませんが)。

ブルートフォースは遅すぎるでしょう。それぞれ10000回までの500種類の場合、500 ^ 10000について話しますが、これは...多くのことです。

CSP山登り法を考えています。

山登り法は簡単に実装できます。基本的には、ランダムに選択した要素から始めて、要素を追加および削除してターゲットに近づけます。

整数計画法に関するwikiページには、少し役立つ情報があります。

于 2013-01-22T22:29:40.143 に答える