c++ - 如何正确组织共享类(class)成员?

标签 c++

假设我有一个 n 个变量 x[0]..x[n-1] 的函数 y:

y = 1 + a[0][0]*x[0] + a[1][0]*x[0]^2 + a[0][1]*x[1] + a[1][1]*x[1]^2 + ...

我想找到使 y 最小化的变量 x[0]..x[n-1] 的值。该优化任务将由遗传算法执行。算法的基本步骤是:

  1. 生成随机解 x[0]..x[n-1](也称为染色体)的池(种群)
  2. 评估这些随机解 y = F(x[0],..,x[n-1])
  3. 将池中的解决方案分成两组:y 值较低的组(最佳解决方案)和 y 值较高的组(较差的解决方案)。
  4. 通过交叉(交换不同解决方案的单个元素 x[j]),丢弃较差的解决方案并培育出最好的解决方案。
  5. 通过向选定元素 x[j] 添加随机值来变异新的解决方案。我们得到了一个新的解决方案池。
  6. 重复 2-5 直到满足停止条件。

下面是实现上述算法的两个类的代码:

  • 解决方案类,它描述了一个单独的解决方案 x[0]..x[n-1]、与此解决方案关联的 y 值,以及函数 y = F(x[0],. .,x[n-1]).

  • 类Pool,描述了不同解的池,以及选择、育种和变异的功能。

代码如下:

class Solution
{
    double *x;
    double y;
    double **a; // the same for all instances
    int n; // the same for all instances
public:
    Solution(int,double*);
    ~Solution();
    double yFunc();
}

class Pool
{
    vector<Solution> sols;
    int poolSize;
    // other private members
public:
    Pool(int,int,double*);
    ~Pool();
    // other public functions
}

// construct Solution
Solution::Solution(int numX,double **coef)
{
    n=numX;
    // allocate memory for coefficients
    a = new double*[2];
    for(int i=0;i<2;i++) a[i] = new double[n];
    // assign coefficients
    for(int i=0;i<2;i++) 
        for(int j=0;j<n;j++)
            a[i][j] = coef[i][j];
    // generate a random solution in [-1,+1] range
    srand(time(0));
    for(int j=0;j<n;j++)
        x[j] = 2.0*(rand()/(double)RAND_MAX-0.5);
}

// destroy Solution
Solution::~Solution()
{
    delete[] x;
    for(int i=0;i<2;i++) delete[] a[i];
    delete[] a;
}

// define optimized function
double Solution::yFunc()
{
    double sum=1.0;
    for(int j=0;j<n;j++)
        sum += a[0][j]*x[j]+a[1][j]*x[j]*x[j];
    return sum;
}

// construct Pool
Pool::Pool(int numSols, int numX, double **coef)
{
    poolSize = numSols;
    for(int i=0;i<poolSize;i++)
    {
        Solution sol = new Solution (numX,coef);
        sols.push_back(sol);
    }
}

我只有一个问题:

当我构建解决方案池时,我创建了许多类 Solution 的实例,它们具有各自的 vector x[0]..x[n-1] 和相应的函数值 y。但是,函数 y = F(x[0],..,x[n-1]) 的 a[][] 系数和函数本身也会获得实例化 poolSize 次,即使它们对于所有解 vector 都是相同的.

如何修改代码,以便只创建 a[][]、F(x[0]、..、x[n-1]) 和 n 的单个实例?我听说过静态成员,但据我了解,不允许用户通过外部函数调用为其分配值。这些静态成员只能在类或不排除任何参数的静态 Solution() 函数中初始化。

即使有办法用外部用户提供的值初始化这些静态成员,它们也不是多线程安全的。因此,我正在寻找一种方法将 Solution 类的共享成员与单个成员分开,以避免共享成员 poolSize 次实例化。

最佳答案

您对静力学的理解似乎有点偏差。静态变量只是一个被类的所有实例共享的变量。您可以像访问任何非静态变量一样访问它,但您也可以在没有类实例的情况下访问它。

对于 SO 答案而言,该主题可能有点宽泛,最好通过一本优秀的 C++ 教科书来解决 - 您使用的是哪一本?也许如果您尝试修改代码以使用静态,然后发布有关您遇到的问题的问题,我们可以提供更多帮助。

关于c++ - 如何正确组织共享类(class)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1089005/

相关文章:

c++ - 如何创建 Qt 组合框

c++ - __int128_t 模棱两可的 std::ostream 重载(从命名空间调用时)

c++ - 运算符重载关联性编译器优化

c++ - 我们可以使用minizip为zip文件设置密码吗

c++ - 错误 : Storage class specifiers invalid for parameter declarations

C++ 删除循环问题中的 std::list 元素

c++ - 尽管包含在 catch 语句中,但未捕获到异常

C++ 将用户输入的字符串句子存储到 vector 中

c++ - 如何确定 C++ 中标准库字符串或其他非基本数据类型的内存大小?

c++ - Gnu Make 的递归性和 friend