返回首页

{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模式解决"停止错误
感谢!

回答

评论会员:约翰亚当斯 时间:2012/01/26
你已经全球化的应用程序,这是很好的。您还做得很好,一切隔离UI。您的应用程序有很多潜在的,我觉得你应该保持它的迭代。

这里有一个小的挑战。支持WinForms和WPF的UI ... 上周四,3月17日,2011 1:27
修改
评论会员:_H2_ 时间:2012/01/26
您好,
我WinApp和Web应用程序下工作多年,多语言编程... (最喜欢的人)

但是,我在WpfApp信息是unperfect
我想完成我的信息WPF /新华社/ MVC等..
致谢
评论会员:。_H2_ 时间:2012/01/26
我要感谢所有
对不起,
我试着写解释。
我必须非常小心,在写解释英语
评论会员:基督肯尼迪 时间:2012/01/26
我敢肯定,这是伟大的代码的,但没有交代,我不倾向于下载

一个伟大的文章是在交代。卖的想法!
你可以有一个伟大的文章与代码的方式,但你不能这样做反过来。

我们希望看到:
- 你为什么写这篇文章
? - 你解决什么问题
- 为什么我需要

如果拼写和语法是可怕的,有很多人在这里会很乐意帮助,但没有开始使用它,是有点问题。
如果你有知识,让别人在它自己的蜡烛光。
玛格丽特富勒(1810 - 1850)
A3
评论会员:戴夫Kreskowiak 时间:2012/01/26
迷宫拼写错误
{A4} - 1.0 RC 1 -
((λ(X)`(X',X))'(λ(X)`(X',X)))
!{A5}
评论会员:KenJohnson 时间:2012/01/26
,我可以说,约了很多东西,但,这是我本来希望了解的一件事。它会是不错的,如果你写了一些解释。
我的代码是完美的,直到我不找到一个bug ...