0

这是一个简单的问题,但我想就如何解决它提出建议。我有一个Policy带构造函数的类Policy::Policy(const int& mode)

根据 的值modePolicy对象可以具有不同的行为和特征。例如,假设有 3 种可能的运行我的程序的模式,分别对应于mode=1mode=2mode=3。现在,任何时候都不会有Policy具有不同模式值的对象。

所以,对我来说,有一个变量是有道理的,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 回答