{A}{A2}{S0}简介
这是anbsp;算法训练样本应用程序,多线程,多语言,GDI,解析,文件IO,...背景
在迷宫中发现的最佳路径的多线程算法。使用代码
quot; Kernel.Enginequot;类和quot; FindInputAndOutputPoints / FindNextPoint / AsyncStartquot;方法是主类/算法处理的方法。FindInputAndOutputPoints方法//-----Top search ...
pt.Row = 0;
for (pt.Column = (byte)(matrix.m_Size.Column - 2); pt.Column > 0; --pt.Column)
{
if (matrix.m_Buffer[pt.Row, pt.Column] == CellType.None)
{
switch (++iFindCount)
{
case 1:
inside1 = value1 = pt;
++inside1.Row;
break;
case 2:
inside2 = value2 = pt;
++inside2.Row;
break;
default:
return false;
}
}
}
//-----Right search ...
pt.Column = (byte)(matrix.m_Size.Column - (byte)1);
for (pt.Row = (byte)(matrix.m_Size.Row - 2); pt.Row > 0; --pt.Row)
{
if (matrix.m_Buffer[pt.Row, pt.Column] == CellType.None)
{
switch (++iFindCount)
{
case 1:
inside1 = value1 = pt;
--inside1.Column;
break;
case 2:
inside2 = value2 = pt;
--inside2.Column;
break;
default:
return false;
}
}
}
//-----Bottom search ...
pt.Row = (byte)(matrix.m_Size.Row - (byte)1);
for (pt.Column = (byte)(matrix.m_Size.Column - 2); pt.Column > 0; --pt.Column)
{
if (matrix.m_Buffer[pt.Row, pt.Column] == CellType.None)
{
switch (++iFindCount)
{
case 1:
inside1 = value1 = pt;
--inside1.Row;
break;
case 2:
inside2 = value2 = pt;
--inside2.Row;
break;
default:
return false;
}
}
}
//-----Left search ...
pt.Column = 0;
for (pt.Row = (byte)(matrix.m_Size.Row - 2); pt.Row > 0; --pt.Row)
{
if (matrix.m_Buffer[pt.Row, pt.Column] == CellType.None)
{
switch (++iFindCount)
{
case 1:
inside1 = value1 = pt;
++inside1.Column;
break;
case 2:
inside2 = value2 = pt;
++inside2.Column;
break;
default:
return false;
}
}
}
"FindInputAndOutputPointsquot;方法发现在基质中的起点和终点。
如果只有两个空白点(孔)存在矩阵的边界上,这种方法工程成功并返回一个quot; truequot;价值。
因此,矩阵,在其边界较少或更多的空白点(孔),都是无效的,并没有处理。FindNextPoint方法{C}
"FindNextPointquot方法选择路径的下一个点。
矩阵中的每个点,有四个方面...
顶,右,下,左(时钟工作[连续])。
quot; sidequot;变种指定的方向进行扫描和处理下一个点开始。
"; firstquot;参数指定当前点(其下一个点,应选择)...
是一个新的点
...
是否返回?算法这一点?[第一==真实]
如果这一点是一个新的起点... ...
,所以方法将确保这一点是不相邻的其他点在当前路径(因为,它不能成为会员的最短路径! )
[第一==虚假]side = Top = first direction. (clock work[CW])
如果这一点是不是一个新的点...
所以,"sidequot;变种,计算和设置在最后进点考虑(当前点)
最后,"whilequot;循环考虑到quot; sidequot;和时钟工作(上,右,下,左)选择新的下一个点。
如果"; leftquot;方向已经过测试,是不是有效...
因此,测试是在四个方向处理,并没有一个良好的响应,该算法应该回到一个点。AsyncStart//-----Find start and end point ...
Point ptStart, ptEnd;
Point ptStartInside, ptEndInside; //For speed.
if (!FindInputAndOutputPoints
(this.m_Matrix, out ptStart, out ptStartInside, out ptEnd, out ptEndInside)) return;
//-----Initialize ....
pathMin = new PointSpeedBuffer((this.m_Matrix.m_Size.Column - 2) *
(this.m_Matrix.m_Size.Row - 2));
if ((ptStart == ptEndInside) || (ptStartInside == ptEnd))
{
pathMin.m_Buffer[pathMin.m_Count++] = ptStart;
pathMin.m_Buffer[pathMin.m_Count++] = ptEnd;
return;
}
var matrix = new Matrix(this.m_Matrix);
matrix.ClearWay();
//-----Remove close points. Only for speed and performance.
RemoveClosePoints_Pass1(matrix);
RemoveClosePoints_Pass2(matrix);
if (
(matrix.m_Buffer[ptStartInside.Row, ptStartInside.Column] == CellType.Fix) ||
(matrix.m_Buffer[ptEndInside.Row, ptEndInside.Column] == CellType.Fix)
)
{
pathMin = null;
return;
}
//-----
var pathCur = new PointSpeedBuffer((this.m_Matrix.m_Size.Column - 2) *
(this.m_Matrix.m_Size.Row - 2));
pathMin.m_Count = int.MaxValue;
pathCur.m_Buffer[pathCur.m_Count++] = ptStart;
pathCur.m_Buffer[pathCur.m_Count++] = ptStartInside;
//-----Start ....
--pathCur.m_Count;
int iFront = 1;
while (true)
{
if (this.m_Version != version) return;
if (this.m_DebugMode)
{
this.OnResult(new ResultEventArgs(pathCur, false));
System.Threading.Thread.Sleep(SLEEPINDEBUGMODE);
}
if (iFront > 0)
{
++pathCur.m_Count;
}
else
{
pathCur.m_Count += iFront;
if (pathCur.m_Count <= 1) break;
}
iFront = FindNextPoint
(matrix, pathCur, ptEndInside, pathCur.m_Count - 1, iFront > 0);
if (iFront > 0)
{
if (pathCur.m_Buffer[pathCur.m_Count] == ptEndInside) //Found a true path?
{
if (pathCur.m_Count < (pathCur.m_Capacity - 2))
{
++pathCur.m_Count;
pathCur.m_Buffer[pathCur.m_Count++] = ptEnd;
if (pathCur.m_Count < pathMin.m_Count)
{
pathMin.Fill(pathCur);
this.OnResult(new ResultEventArgs(pathMin, false));
}
if (pathCur.m_Count <= 5) break;
iFront = -3;
}
else
{
iFront = -1;
}
}
else
{
iFront = +1;
}
}
else if (pathCur.m_Count <= 2)
{
break;
}
}
"AsyncStartquot;方法不一般的算法处理。
此方法将过程中的所有路径。
每当它发现一个较小的方法,它是复制在quot; pathMinquot变种,并提出了quot; Resultquot UI更新事件。
最后,当所有案件进行了处理
,该算法回去连续
,当算法的启动点,加工成品
,所有个案处理
最短路径,已发现在quot; pathMinquot;变种。使用演示
要使用的演示程序的例子,请注意,矩阵应该只和只有两个空白点(孔)
(有关详细信息,请审查描述为quot; FindInputAndOutputPointsquot;方法。)在其边界。兴趣点保存/载入*. txt或*. map文件中的迷宫和路径调试和跟踪模式多线程处理多国语言历史7月18日,2010年:战后初期,2010年7月20日:新增的解释加入'Debug和Trace模式"增加了速度和性能的RemoveClosePoints_Pass1新增IMatrixSerializer2010年7月21日:在"Debug和Trace模式解决"停止错误
感谢!