我已尝试在c#中实现深度优先搜索,但我不确定如何以分布式计算方式执行此操作。如果你们可以帮助我,我会非常感激:)你可以在下面找到我的DFS代码
public class DFS
{
static List<string> traversedList = new List<string>();
static List<string> parentList = new List<string>();
public static void Main(string[] args)
{
int N = 100;
int M = N * 4;
int P = N * 16;
Stack newstack = new Stack();
List<string> global_list=new List<string>();
StreamReader file = new StreamReader("my input file");
string text = file.ReadToEnd();
string[] lines = text.Split('\n');
string[][] array1 = new string[lines.Length][];
for (int i = 0; i < lines.Length; i++)
{
lines[i] = lines[i].Trim();
string[] words = lines[i].Split(' ');
array1[i] = new string[words.Length];
for (int j = 0; j < words.Length; j++)
{
array1[i][j] = words[j];
}
}
StreamWriter sr = new StreamWriter(args[0]);
for (int i = 0; i < array1.Length; i++)
{
for (int j = 0; j < array1[i].Length; j++)
{
if (j != 0 )
{
sr.Write(array1[i][0] + ":" + array1[i][j]);
Console.WriteLine(array1[i][0] + ":" + array1[i][j]);
sr.Write(sr.NewLine);
}
}
}
int start_no = Convert.ToInt32(args[args.Length-1]);
traversedList.Add(start_no.ToString());
parentList.Add("root");
dfs(array1, start_no);
for (int z = 0; z < traversedList.Count; z++)
{
Console.WriteLine(traversedList.ElementAt(z) + " "+parentList.ElementAt(z)+" "+(z+1));
}
Console.ReadLine();
}
private static void dfs(string[][] array, int point)
{
for (int z = 1; z < array[point].Length; z++)
{
if ((!traversedList.Contains(array[point][z])))
{
traversedList.Add(array[point][z]);
parentList.Add(point.ToString());
dfs(array, int.Parse(array[point][z]));
}
}
return;
}
}
答案 0 :(得分:1)
你应该从电脑棋(现在演变成世界冠军电脑游戏玩家)的世界中阅读文献。他们已经进行了大约30年的分布式深度优先搜索,并且有很多想法。要做到正确是很棘手的,因为你必须在不知道特定分支可能包含多少工作的情况下均匀地分配工作。
查看Monty Newborn或麦吉尔大学,这在大约10年前似乎是相当温床。
当然,GIYF:“分布式深度优先搜索”产生了对本文的引用:Distributed Algorithms for Depth-First Search。我猜它包含了许多来自计算机国际象棋界的想法。
*共享内存的问题“DFS有点困难;你不必向你的分布式助手发送消息,你可以简单地传递指针: - }它有助于提供一种语言,为你提供并行性和如果你的程序在每个分支上分叉,我可以管理爆炸性的并行增长。我提供了一个example 4x4 N-puzzle solver内置的并行编程语言。(这个例子是我最早的SO帖子之一!)。