【问题标题】:How do I create a graph from this datastructure?如何从此数据结构创建图表?
【发布时间】:2010-12-31 02:08:34
【问题描述】:

我从这个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# 添加类似于以下无向图的内容:

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

我正在寻找类似的东西:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我知道如何在 my node 数据结构中找到我的节点和相邻节点,但我不知道如何使用为 A* 构建的这个。
    • 我想我可以这样做:node.AddNeighbour(otherNode, distance)
    【解决方案2】:

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

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

    由于我们不确切知道节点的外观,让我们将其设为通用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2021-07-07
      • 1970-01-01
      • 2021-10-13
      相关资源
      最近更新 更多