如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

发布于 2024-12-22 07:15:08 字数 179 浏览 2 评论 0原文

我使用的是 QuickGraph 3.6 版,我找到了函数 SetRootVertex,但没有 SetTagretVertex。我需要这个,因为我正在巨大的图中搜索短路径,这会大大加快程序速度。

有问题的类是 DijkstraShortestPathAlgorithm 和 AStarShortestPathAlgorithm。

I am using QuickGraph version 3.6 and I found function SetRootVertex, but no SetTagretVertex. I need this because I am searching short paths in huge graph and this would speed up program a lot.

Clases in question are DijkstraShortestPathAlgorithm and AStarShortestPathAlgorithm.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

十六岁半 2024-12-29 07:15:08

我认为不使用事件就没有办法做到这一点。

您可以将必要的代码包装在一个扩展方法中,使事情变得清晰,例如:

public static class Extensions
{
    class AStarWrapper<TVertex, TEdge>
    where TEdge : IEdge<TVertex>
    {
        private TVertex target;
        private AStarShortestPathAlgorithm<TVertex, TEdge> innerAlgorithm;
        public AStarWrapper(AStarShortestPathAlgorithm<TVertex, TEdge> innerAlgo, TVertex root, TVertex target)
        {
            innerAlgorithm = innerAlgo;
            this.innerAlgorithm.SetRootVertex(root);
            this.target = target;
            this.innerAlgorithm.FinishVertex += new VertexAction<TVertex>(innerAlgorithm_FinishVertex);
        }
        void innerAlgorithm_FinishVertex(TVertex vertex)
        {
            if (object.Equals(vertex, target))
                this.innerAlgorithm.Abort();
        }
        public double Compute()
        {
            this.innerAlgorithm.Compute();
            return this.innerAlgorithm.Distances[target];
        }
    }

    public static double ComputeDistanceBetween<TVertex, TEdge>(this AStarShortestPathAlgorithm<TVertex, TEdge> algo, TVertex start, TVertex end)
        where TEdge : IEdge<TVertex>
    {
        var wrap = new AStarWrapper<TVertex, TEdge>(algo, start, end);
        return wrap.Compute();
    }
}

用法:

var g = new BidirectionalGraph<int, IEdge<int>>();

g.AddVerticesAndEdge(new Edge<int>(1, 2));
g.AddVerticesAndEdge(new Edge<int>(2, 3));
g.AddVerticesAndEdge(new Edge<int>(3, 4));
g.AddVerticesAndEdge(new Edge<int>(2, 4));

var astar =new AStarShortestPathAlgorithm<int,IEdge<int>>(g, x => 1.0, x => 0.0);
var dist = astar.ComputeDistanceBetween(2, 4);

I don't think there is a way to this without using events.

You could wrap the necessary code in one extension method, making things clear, e.g.:

public static class Extensions
{
    class AStarWrapper<TVertex, TEdge>
    where TEdge : IEdge<TVertex>
    {
        private TVertex target;
        private AStarShortestPathAlgorithm<TVertex, TEdge> innerAlgorithm;
        public AStarWrapper(AStarShortestPathAlgorithm<TVertex, TEdge> innerAlgo, TVertex root, TVertex target)
        {
            innerAlgorithm = innerAlgo;
            this.innerAlgorithm.SetRootVertex(root);
            this.target = target;
            this.innerAlgorithm.FinishVertex += new VertexAction<TVertex>(innerAlgorithm_FinishVertex);
        }
        void innerAlgorithm_FinishVertex(TVertex vertex)
        {
            if (object.Equals(vertex, target))
                this.innerAlgorithm.Abort();
        }
        public double Compute()
        {
            this.innerAlgorithm.Compute();
            return this.innerAlgorithm.Distances[target];
        }
    }

    public static double ComputeDistanceBetween<TVertex, TEdge>(this AStarShortestPathAlgorithm<TVertex, TEdge> algo, TVertex start, TVertex end)
        where TEdge : IEdge<TVertex>
    {
        var wrap = new AStarWrapper<TVertex, TEdge>(algo, start, end);
        return wrap.Compute();
    }
}

Usage:

var g = new BidirectionalGraph<int, IEdge<int>>();

g.AddVerticesAndEdge(new Edge<int>(1, 2));
g.AddVerticesAndEdge(new Edge<int>(2, 3));
g.AddVerticesAndEdge(new Edge<int>(3, 4));
g.AddVerticesAndEdge(new Edge<int>(2, 4));

var astar =new AStarShortestPathAlgorithm<int,IEdge<int>>(g, x => 1.0, x => 0.0);
var dist = astar.ComputeDistanceBetween(2, 4);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文