2

PSO アルゴリズムを実装しています。私はこのデータ構造を使用します:

typedef struct {
  float x;
  float y;
} C_struct_Class2D;

typedef struct {
  C_struct_Class2D *pos;
  C_struct_Class2D *best_pos;
  C_struct_Class2D *vel;
} C_struct_Particle;

typedef struct { <br>
  C_struct_Particle **particles;
  C_struct_Particle *g;
} C_struct_Swarm;

C++ ではなく、C で作業する必要があります。そのため、クラスの代わりに構造体を使用しています。

構造体の説明:

複数の Particles(**particles) と最適な Particles(*g) で構成される Swarm(C_struct_Swarm) があります。各パーティクルには、タイプ「C_struct_Class2D」の位置、最適位置、および速度があります。

いくつかの方法では、各データにメモリ空間を割り当てて初期化します。しかし、データ構造全体がメモリ内で連続しているのが好きです。すべての構造体がアドレス空間で互いに後ろにあるようにします。

メモリは次のようになります。

C_struct_Swarm
粒子[0]
粒子[0]->位置
粒子[0]->最高の位置
粒子[0]->ベル
粒子[1]
粒子[1]->pos
パーティクル[1]->best_pos
粒子[1]->ベル
...
...
...
...
粒子[n]
粒子[n]->pos
パーティクル[n]->best_pos
粒子[n]->vel
g->pos
g->best_pos
g->vel

どうすればこれを達成できますか?

よろしく

4

3 に答える 3

2

値でメンバーを構成する

C_struct_Particle内の値によってC_struct_Class2Dを含めます。

typedef struct {
    C_struct_Class2D pos; 
    C_struct_Class2D best_pos; 
    C_struct_Class2D vel; 
} C_struct_Particle;

これにより、これらのメンバーの順序が保証されます(posはbest_posの前にあります)。

アイテムへのポインタの配列ではなく、アイテムの配列を割り当てます

typedef struct {
    C_struct_Particle *particles;
    int num_particles;
    C_struct_Particle g;
} C_struct_Swarm;

ここで、パーティクルが指すデータは他のメンバーと隣接していないため、gを常に最初のパーティクルに設定する、つまり粒子「配列」。

パディングに注意してください

パディングを気にしない場合(そしてコード例では気にしないように見えます)、これをスキップしてください。それ以外の場合は、プラットフォーム/コンパイラ固有です。たとえば、GCCでは、packed属性を使用できます。

struct __attribute__ ((__packed__)) my_packed_struct
{
    char c;
    int  i;
};
于 2013-02-06T12:09:09.967 に答える
0

gcc を使用している場合は、静的オブジェクトを試すことができます__attribute__...詳細はこちらhttp://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html

例としてのソースコード

于 2013-02-06T12:31:05.317 に答える
0

あなたが説明した方法ではできません。メモリの連続ブロックが必要な場合、唯一の解決策は(私が知る限り)バッファを使用することです(実装方法については、私の同様の回答を参照してください)。

于 2013-02-06T12:02:58.130 に答える