gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:30 25 4
gpt4 key购买 nike

假设我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com