0

これは単純な問題ですが、解決方法の提案をお願いします。私はPolicyコンストラクタを持つクラスを持っていPolicy::Policy(const int& mode)ます。

の値に応じてmodePolicyオブジェクトは異なる動作と特性を持つことができます。たとえば、 、 、および に対応するmode=1、プログラムを実行する 3 つの可能なモードがあるとします。さて、異なるモード値を持つオブジェクトが存在することは決してありません。mode=2mode=3Policy

static int Policy::MODEしたがって、すべてのPolicyオブジェクトがどのモードで実行する必要があるかを知るために、変数が存在することは理にかなっています。最初にPolicy作成されたオブジェクトは、そのコンストラクターにこの静的クラス変数の値を設定します。次に、別の値の を使用して他のPolicyオブジェクトを作成しようとすると、インスタンス化はエラーで終了します (これは発生してはならないためです)。mode

この問題を解決する方法について何か提案はありますか?

[コメントのリクエストに応えて、以下に追加説明を追加しました。]

このプログラムは、疾病スクリーニング ポリシーを最適化するためのものです。各Policyオブジェクトはスクリーニング ポリシーを表し、母集団でそのポリシーを実践することの影響を反映する統計を追跡するために必要な多くの機能を備えています。最適化の用語では、各スクリーニング ポリシーは決定変数のベクトルであり、目的関数は、疾患の自然史モデルを使用してポリシーをシミュレートすることによって推定されます。

オブジェクトは、Policy複数の複雑な最適化フレームワークにシームレスに適合できる必要があります。疾患スクリーニング ポリシーだけでなく、最適化アルゴリズムが適切に機能しているかどうかをテストするために使用できる任意の数の標準的なテスト問題も表すことができる必要があります。MODEクラスの値に基づいて変化する機能/特性Policyは、(1) ポリシーの評価に使用されるシミュレーション モデル、(2) 決定変数ベクトルの長さなどを設定するコンストラクター内のコードです。 、および (3) 特定のポリシーとその推定パフォーマンスに関する情報を表示するために使用されるコード。

特定のシミュレーション モデル (つまり、目的関数) には、シミュレーション モデルに必要なポリシー表現にデコードできる複数の "ポリシー表現" (つまり、決定変数のベクトル) があります。したがって、各「モード」は、スクリーニング ポリシーを表現する方法と、そのポリシーを評価するための特定のシミュレーション モデルとの組み合わせを表します。

関係のない多くのものを除外すると、2 つの異なる実行モードがある場合のクラスの構造は次のようになります。

class Policy {
public:

    vector<double> x; // encoded representation of a policy (decision variables)

    explicit Policy(const int& mode) {

        // set Policy::MODE if not already set (code not shown)

        switch(MODE) {
        case 1:
            // code...
            break;
        case 2:
            // code...
            break;
        }
    }

    void simulate() {

        switch(MODE) {
        case 1:
            // code...
            break;
        case 2:
            // code...
            break;
        }
    }

    void displayInfo() {

        switch(MODE) {
        case 1:
            // code...
            break;
        case 2:
            // code...
            break;
        }
    }

private:
    static int MODE;
};

大まかに言うと、各モード値は解と推定量の組み合わせを表していると言えます。

4

1 に答える 1

1

あなたはそのようなことを求めていますか:

static int Policy::MODE=-1;
Policy::Policy(const int& mode) {
  if (MODE==-1) {
    MODE=mode;
  }
  else {
    if (mode!=MODE) {
      cout <<"mode mismatch "<<...<<endl;
      exit (1); // or throw something, set some flags, depending on your needs
    }
  }
}
于 2013-01-13T16:31:57.970 に答える