科学的応用 (細胞核内を移動する染色体のシミュレーション) を開発しています。染色体は、4x4 回転行列を使用してランダムな軸を中心に回転する小さな断片に分割されます。
問題は、シミュレーションが数千億回の回転を実行するため、浮動小数点の丸め誤差が積み重なって指数関数的に大きくなるため、時間の経過とともにフラグメントが「浮動」して染色体の残りの部分から切り離される傾向があることです。
C++ で倍精度を使用します。ソフトは今のところ CPU で実行されますが、CUDA に移植され、シミュレーションは最大で 1 か月持続します。
すべてのフラグメントが連鎖しているため(二重リンクリストとして表示できます)、どうにかして染色体を再正規化する方法はわかりませんが、可能であればそれが最善のアイデアだと思います。
何か提案はありますか ?少し損した気分です。
どうもありがとうございました、
H.
編集: 簡略化されたサンプル コードを追加しました。すべての行列演算は古典的な実装であると想定できます。
// Rotate 1000000 times
for (int i = 0; i < 1000000; ++i)
{
// Pick a random section start
int istart = rand() % chromosome->length;
// Pick the end 20 segments further (cyclic)
int iend = (istart + 20) % chromosome->length;
// Build rotation axis
Vector4 axis = chromosome->segments[istart].position - chromosome->segments[iend].position;
axis.normalize();
// Build rotation matrix and translation vector
Matrix4 rotm(axis, rand() / float(RAND_MAX));
Vector4 oldpos = chromosome->segments[istart].position;
// Rotate each segment between istart and iend using rotm
for (int j = (istart + 1) % chromosome->length; j != iend; ++j, j %= chromosome->length)
{
chromosome->segments[j].position -= oldpos;
chromosome->segments[j].position.transform(rotm);
chromosome->segments[j].position += oldpos;
}
}