C# 定义路径大小的随机路径生成算法
我试图在一个矩阵中生成一条路径,在拾取的路径中定义了元素的计数 我可以使用以下方法从点A创建到点B,没有任何问题:C# 定义路径大小的随机路径生成算法,c#,algorithm,matrix,random,C#,Algorithm,Matrix,Random,我试图在一个矩阵中生成一条路径,在拾取的路径中定义了元素的计数 我可以使用以下方法从点A创建到点B,没有任何问题: step(int[] s, int[] e) //start - end { int d = delta(s, e); if (d > 1) { //spread around List<int[]> pts = new List<int[]>(); pts.Add(new int[2] { s[0
step(int[] s, int[] e) //start - end
{
int d = delta(s, e);
if (d > 1)
{
//spread around
List<int[]> pts = new List<int[]>();
pts.Add(new int[2] { s[0] -1, s[1] }); //left
pts.Add(new int[2] { s[0] +1, s[1] }); //right
pts.Add(new int[2] { s[0] , s[1] +1 }); //top
pts.Add(new int[2] { s[0] , s[1] -1 }); //bot
//remove out of bounds points
List<int[]> goodPoints = new List<int[]>();
foreach (var p in pts)
{
if (checkValidBoundries(p))
{
goodPoints.Add(p);
}
}
//calculate lowest deltas
int lowestDelta = int.MaxValue;
int[] bestFit = new int[2];
foreach (var p in goodPoints)
{
int localDelta = delta(p, e);
if (localDelta == lowestDelta) //local shuffle
{
if (await coinFlip())
{
bestFit = p;
}
}
else if (localDelta < lowestDelta)
{
lowestDelta = localDelta;
bestFit = p;
}
}
matrix.setValue(bestFit[0], bestFit[1]);
step(bestFit, e);
}
}
步骤(int[]s,int[]e)//开始-结束
{
int d=δ(s,e);
如果(d>1)
{
//散布
List pts=新列表();
pts.Add(新int[2]{s[0]-1,s[1]});//左
pts.Add(新int[2]{s[0]+1,s[1]});//右
pts.Add(新int[2]{s[0],s[1]+1});//top
pts.Add(新int[2]{s[0],s[1]-1});//bot
//删除越界点
List goodPoints=新列表();
foreach(pts中的var p)
{
if(检查有效边界(p))
{
添加(p);
}
}
//计算最小三角洲
int lowestDelta=int.MaxValue;
int[]最佳拟合=新int[2];
foreach(goodPoints中的var p)
{
int localDelta=delta(p,e);
if(localDelta==lowestDelta)//局部随机
{
if(等待coinFlip())
{
最佳拟合=p;
}
}
else if(本地增量<最低位增量)
{
lowestDelta=localDelta;
最佳拟合=p;
}
}
矩阵设置值(最佳拟合[0],最佳拟合[1]);
步骤(最佳拟合,e);
}
}
此代码将递归迭代,直到路径结束。
这是我得到最短路径的方法
所以我的问题是:如何定义路径中的许多元素
例如:从A到B这个算法给我6个元素,无论路径如何,它总是使用点之间的最小增量。但是如果我想让这条路径有7,8个元素长
我试着每次从路径中选择一个元素,然后锁定它,这样它就不会认为它是有效的,但是它一直出错。
新路径可以是随机的,没问题,我只是想控制“最佳路径”中元素的数量
有什么帮助吗?提前感谢您似乎希望在网格中找到两点A和B之间没有障碍物的最近路径。运动必须在四个基本方向之一。然后,您需要延长此路径,使其具有一定的长度 首先,如果没有障碍物,你就不需要四处探索。例如,如果B在A以东4步,在A以北2步,只需从{E,E,E,N,N}中随机选取步数(或洗牌数组),直到到达 A和B之间的最短距离d*是曼哈顿辐射: d*=| A.x-B.x |+| A.y-B.y| 如果你想象网格的颜色像一个棋盘,那么a和B之间的距离是偶数,如果两者颜色相同,则是奇数。这不仅适用于最短距离,也适用于A和B之间任何有效路径的距离。因此,只能得到d*+2·k的距离 通过在理想路径上添加小“弯路”,您可以走更长的路径:
· · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · B · · · · · · · B · · · · · · · B ·
· · · · ┌───┘ · · u · · ┌───┘ · · · · · ┌───┘ ·
· · · · │ · · · · ╒═╕ · └─╖ · · · · · ╔═╡ · · ·
· ┌─────┘ · · · · │ └─────╜ v · · ┌───╜ ╧ w · ·
· A · · · · · · · A · · · · · · · A · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · ·
每个“凹痕”u和v向路径添加两段。当你们做凹痕的时候,注意不要做凹痕,因为已经有一段路径了:凹痕w有一段路径折叠起来,所以有一条死胡同。您可以删除死端,但路径的长度将与以前相同
如何实现这一切留给读者作为练习<代码>:)您似乎希望在网格中找到两点A和B之间没有障碍物的最近路径。运动必须在四个基本方向之一。然后,您需要延长此路径,使其具有一定的长度 首先,如果没有障碍物,你就不需要四处探索。例如,如果B在A以东4步,在A以北2步,只需从{E,E,E,N,N}中随机选取步数(或洗牌数组),直到到达 A和B之间的最短距离d*是曼哈顿辐射: d*=| A.x-B.x |+| A.y-B.y| 如果你想象网格的颜色像一个棋盘,那么a和B之间的距离是偶数,如果两者颜色相同,则是奇数。这不仅适用于最短距离,也适用于A和B之间任何有效路径的距离。因此,只能得到d*+2·k的距离 通过在理想路径上添加小“弯路”,您可以走更长的路径:
· · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · B · · · · · · · B · · · · · · · B ·
· · · · ┌───┘ · · u · · ┌───┘ · · · · · ┌───┘ ·
· · · · │ · · · · ╒═╕ · └─╖ · · · · · ╔═╡ · · ·
· ┌─────┘ · · · · │ └─────╜ v · · ┌───╜ ╧ w · ·
· A · · · · · · · A · · · · · · · A · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · ·
每个“凹痕”u和v向路径添加两段。当你们做凹痕的时候,注意不要做凹痕,因为已经有一段路径了:凹痕w有一段路径折叠起来,所以有一条死胡同。您可以删除死端,但路径的长度将与以前相同
如何实现这一切留给读者作为练习<代码>:)不进行递归,而是从单个步骤返回已处理的数据。然后使用循环运行函数所需的次数,您将得到结果。您好,但我如何保持它继续运行并获得相同的点a->B?这是我遇到麻烦的部分。我有最短的路径,但在我的跑步中,我应该在哪里做这样的移动:while(路径大小不等于定义的路径大小),所以随机走动并连接到点B?我不认为你可以在矩阵中实现任意长度的路径,当你只能向上、向下、向左和向右移动时。最短距离d*是点之间的曼哈顿距离。只有通过添加两个垂直的“杆”,将直线段变成U,才能使路径变长,因此路径的长度只能为d*+2·k。(但是如果你注意不要把路径折叠到自己身上,你可以使用制造U形凹痕的策略使你的路径更长。)为什么有人反对我的问题?嗨@MOehm,我明白你的意思了。这对我来说似乎是有效的。你能在回答中给我一些提示让我接受吗?不要让它递归,而是从单个步骤返回处理过的数据。然后运行函数所需的时间