我从这个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);
答案 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
。