2

私はOOプログラミングが初めてで、概念を使用するためのプログラムの設計に少し問題があります。チュートリアルを完了しましたが、まだ問題があります。

私はアイテムの値(この例では何でも、株)を取り、特定の値(このコードでは100)に等しくなるために必要なアイテムの数を計算する再帰を持っています。この部分は機能しますが、株式の加重がしきい値を超えているかどうかを知りたいです。もともと私は for ループを実行して値のリスト全体を計算する方法でこの問題に取り組みましたが、再帰のすべてのループでそれを行うため、これは非常に非効率的です。クラスを使用して状態情報を維持し、各ループで値をインクリメントするだけで、しきい値に達すると通知されるため、クラスを学習するのに良い時期だと思いました。

私はコードを持っていると思いますが、クラスでこの問題を設計する方法を完全には理解していません。これまでのところ、再帰の各ステップでループが実行されます。最初は私がそこのクラスだからです。これを設計するより良い方法はありますか?私の最終目標は、重み付けを超えたときに通知を受けることです(これはすでにある程度可能です)が、最小限のリソースを使用する方法で行いたいです(非効率的/不要な for ループを回避します)

コード (学習に使用したコード全体を次に示しますが、問題は Counter クラスとその findVariables メソッド内の場所にあります):

import java.util.Arrays;


public class LearningClassCounting {

    public static int[] stock_price = new int[]{ 20,5,20};
    public static int target = 100;

    public static void main(String[] args) {
        // takes items from the first list
        findVariables(stock_price, 100, new int[] {0,0,0}, 0, 0);
    }

    public static void findVariables(int[] constants, int sum, 
            int[] variables, int n, int result) {
        Counter Checker = new Counter(stock_price, variables);
        if (n == constants.length) { 
            if (result == sum) {
                System.out.println(Arrays.toString(variables));
            }
        } else if (result <= sum){ //keep going
            for (int i = 0; i <= 100; i++) {
                variables[n] = i;
                Checker.check_total_percent(n, i);
                findVariables(constants, sum, variables, n+1, result+constants[n]*i);
            }
        }
    }

}

class Counter {
    private int[] stock_price;
    private int[] variables;
    private int value_so_far;
    public Counter(int[] stock_price, int[] variables) {
        this.stock_price = stock_price;
        this.variables = variables; 
        for (int location = 0; location < variables.length; location++) {
            //System.out.println(variables[location]  + " * " + stock_price[location] + " = " + (variables[location] * stock_price[location]) );
            value_so_far = value_so_far + (variables[location] * stock_price[location]);
        }
        //System.out.println("Total value so far is " + value_so_far);
        //System.out.println("************");
    } 

    public  void check_total_percent(int current_location, int percent) {
        // Check to see if weight exceeds threshold
        //System.out.println("we are at " + current_location + " and " + percent + " and " + Arrays.toString(variables));
        //System.out.println("value is " + stock_price[current_location] * percent);
        //formula I think I need to use is:
        if (percent == 0) {
            return;
        }
        int current_value = (stock_price[current_location] * percent);
        int overall_percent = current_value/(value_so_far + current_value);
        if (overall_percent > 50 ) {
            System.out.println("item " + current_location + " is over 50%" );
        }
    }
}
4

1 に答える 1

0

あなたが説明しているのは、有名なナップザック問題の変種のように聞こえます。これらの問題には多くのアプローチがあり、それらは本質的に計算が困難です。

本質的に、「すべての組み合わせ」をチェックする必要があるかもしれません。いわゆる最適化は、特定の選択サブセットがすでに大きすぎる場合のバックトラックから発生します (たとえば、指定された 10 株が私の合計を超えている場合、他の組み合わせを探索する必要はありません)。さらに、特定のサブセットをキャッシュすることもできます (たとえば、XY と Z がある値 V になることがわかっている場合、その値を再利用できます)。この種の問題にアプローチする方法と、ソリューションを設計する方法について、多くの議論が見られるでしょう。

そうは言っても、私の見解では、この種のアルゴリズムの問​​題は、コードとデータ構造をプログラミングおよび構造化する方法を学習するためには重要かもしれませんが、オブジェクト指向の設計とモデリングを学習するには、一般的に非常に悪い選択です。

于 2012-04-25T16:00:36.543 に答える