需要用于在四面体晶格上生成自避免随机游走的软件

计算科学 C++ C 软件推荐 随机游走
2021-12-23 07:10:56

我正在寻找可以在四面体晶格上生成自我避免随机游走轨迹的 FOSS 代码。练习的目的是创建模型聚合物链的随机构象,作为模拟协议的输入。如果代码满足以下条件,那就太好了:

  • 以 C++ 或 C 或 Fortran 实现的源代码可在合理的 FOSS 许可下获得;
  • 代码应具有合理的可移植性(不依赖于例如 GCC 扩展);
  • 作为输入,它应该采用步行的长度(链长度)和晶格边缘的长度(“键长”)并返回一个(或多个)3D 坐标数组;
  • 性能应该足以达到大约 1000 步,我不需要很长的轨迹/链条;
  • 推荐它的人已成功使用它:-)

我已经完成了我的谷歌搜索作业,并在 GitHub 上找到了一个软件。然而,它已经 5 年没有被触及,并且不能再用现代编译器(GCC 10)编译。

对于所有提示,指针等,我将不胜感激。谢谢!

2个回答

我修复了你提到的 Roulattice 包中的编译问题,它现在可以编译并且似乎可以做一些事情。大多数问题都很容易解决,但如果您不使用该-torsion标志,则会出现未初始化的内存错误。像下面这样运行它。

./roulattice -tetra_saw1 50 -num 1000 -torsion

更新后的 repo 可以在我的 Github 上找到:https ://github.com/r-barnes/Roulattice 。截至 2021 年 7 月 25 日,这些更改也可在 Roulattice/master 中获得,网址为https://github.com/Roulattice/Roulattice

我会评论说代码内部有点混乱并且不包括单元测试,所以我建议尝试做一些事情来验证它的输出;我不相信作者做对了。

也许我误解了目标,但这似乎很简单,不需要专门的库(除此之外首先要创建网格)。这是我使用 boost 图形库制作的递归版本,它与网格的结构无关。

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, 
int, boost::no_property, boost::no_property, boost::vecS> myGraph;

typedef boost::graph_traits<myGraph>::adjacency_iterator adj_iter;

void GetPaths(const myGraph& g, int max_size, const std::vector<int>& path, std::vector<std::vector<int>>& paths)
{
    //for each adjacent vertex to the last vertex in 'path'
    for (std::pair<adj_iter, adj_iter> ap = boost::adjacent_vertices(path.back(), g); ap.first != ap.second; ++ap.first)
    {
        //if the path contains the vertex, continue to the next adjacent vertex
        if (std::find(path.begin(), path.end(), g[*ap.first]) != path.end()) { continue; }
        //otherwise, make a copy of the path with space for an extra vertex (you may need 'path' for the other adjacent vertices
        std::vector<int> new_path(path.size() + 1);
        std::copy(path.begin(), path.end(), new_path.begin());
        new_path.back() = g[*ap.first];
        //whatever your termination conditions are
        if (new_path.size() == max_size)
        {
            paths.push_back(new_path);
        }
        //otherwise, go deeper
        else
        {
            GetPaths(g, max_size, new_path, paths);
        }
    }
}

为了适应您的问题,我建议将std::pair<std::vector<int>,double>其用作路径/长度对象。对于图形的边缘属性,您将有一个双重表示距离。终止条件将是最大步数或路径的累积长度。

您可以通过为不完整路径创建一个容器,甚至可能是一个 tbb::concurrent_vector 来使其成为非递归的,这样您就可以对其进行并行化。