Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 定义路径大小的随机路径生成算法_C#_Algorithm_Matrix_Random - Fatal编程技术网

C# 定义路径大小的随机路径生成算法

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

我试图在一个矩阵中生成一条路径,在拾取的路径中定义了元素的计数

我可以使用以下方法从点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] -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,我明白你的意思了。这对我来说似乎是有效的。你能在回答中给我一些提示让我接受吗?不要让它递归,而是从单个步骤返回处理过的数据。然后运行函数所需的时间