如何从此数据结构创建图表?

时间:2010-12-31 02:08:34

标签: c# algorithm data-structures a-star

我从这个A* tutorial

中获取了这个数据结构
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#添加类似以下无向图的内容:

alt text

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

我正在寻找更像的东西:

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  

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

那是事情。 没有 a&#34;这是为A *&#34;而建的。 Path类是泛型,就像它说:

  

由于我们不知道节点究竟是什么样子,所以让我们通用:

您可以使用您喜欢的任何Node类,只要它与图中的每个节点相同即可。关于Node课程如何运作的代码并不关心,因为它没有使用您的Node界面< / em>的。它只是存储Paths,即Node的(引用)序列。 (具体来说,它是通过构建一个侵入式链接列表来实现的,但它也可以随时增加路径成本。)您创建一个新的Path,然后使用AddStep添加Node转到路径,然后您可以将Path用作IEnumerable

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