1

我从这个A* 教程中获取了这个数据结构:

public interface IHasNeighbours<N>
{
    IEnumerable<N> Neighbours { get; }
}

public class Path<TNode> : IEnumerable<TNode>
{
    public TNode LastStep { get; private set; }
    public Path<TNode> PreviousSteps { get; private set; }
    public double TotalCost { get; private set; }
    private Path(TNode lastStep, Path<TNode> previousSteps, double totalCost)
    {
        LastStep = lastStep;
        PreviousSteps = previousSteps;
        TotalCost = totalCost;
    }
    public Path(TNode start) : this(start, null, 0) { }
    public Path<TNode> AddStep(TNode step, double stepCost)
    {
        return new Path<TNode>(step, this, TotalCost + stepCost);
    }
    public IEnumerator<TNode> GetEnumerator()
    {
        for (Path<TNode> p = this; p != null; p = p.PreviousSteps)
            yield return p.LastStep;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

}

我不知道如何创建一个简单的图表。

如何使用 C# 添加类似以下无向图的内容:

替代文字

基本上我想知道如何连接节点。我有自己的数据结构,我已经可以确定邻居和距离。我现在想把它转换成这个张贴的数据结构,这样我就可以通过 AStar 算法运行它。

我正在寻找更多类似的东西:

 Path<EdgeNode> startGraphNode = new Path<EdgeNode>(tempStartNode);
 startGraphNode.AddNeighbor(someOtherNode, distance);
4

2 回答 2

0

这是因为您使用了错误的结构来表示图形。A*(以及此处的路径)用于查找图中两个节点之间的路径。路径本质上是方向性的,可以展平为一条线。例如,在上面的图表中,通过所有节点的唯一可能路径从 3 开始并在 2 结束(请注意,后者将在您的路径中添加两次,天气与否这在很大程度上取决于您遇到的问题试图解决。

所以基本上你首先需要一个图形的表示,然后你可以通过它运行算法来解决特定的问题。

图的最基本形式基本上是一个具有相邻节点成员列表的节点。然后你可以试试A*。指定起始节点和结束节点并找到它们之间的路径

于 2010-12-31T02:39:22.873 回答
0

但我不知道如何使用为 A* 构建的这个。

就是这样。没有“为 A* 打造的这个”。Path 类是通用的,就像它说的那样:

而且由于我们不确切知道节点会是什么样子,所以让我们把它变成通用的:

你可以使用任何Node你喜欢的类,只要它对于图中的每个节点都是相同的。代码不关心你的Node类是如何工作的,因为它不使用你Node的 interface。它所做的只是 store Paths,即 (references to)Node的序列。(具体来说,它是通过构建一个侵入式链表来实现的,但它也会随着您的前进而增加路径成本。)您创建一个新的Path,并使用AddStepNodes 添加到路径中,然后您可以将Path用作IEnumerable.

您可以继续Node正常使用您的 s。您所需要的只是确保您的节点有某种方式来表示图中边的“成本”,以便您可以将该信息传递给AddStep.

于 2010-12-31T04:49:33.130 回答