基于A*算法的单AGV路径规划

基于A*算法的单AGV路径规划

基于曼哈顿距离权重的Astar算法的单AGV路径规划(C#版),并对Astar算法的运行时间进行可视化显示。
基于A*算法的单AGV路径规划
主界面.cs:

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows.Forms;  
using System.Threading;  
  
  
  
namespace AGVS  
{  
   
    public partial class 主界面 : Form  
    {  
        public class mybutton : Button  
        {  
            int x;  
            int y;  
            public int X  
            {  
                set { x = value; }  
                get { return x; }  
            }  
  
            public int Y  
            {  
                set { y = value; }  
                get { return y; }  
            }  
  
            private void InitializeComponent()  
            {  
                this.SuspendLayout();  
                this.ResumeLayout(false);  
  
            }  
        }  
        enum mycc   //定义枚举变量  
        {  
            wall,  
            start,  
            des  
        }  
        mycc mychoose = mycc.wall;  
        byte[,] R = new byte[10, 10] {     
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },    
          { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }    
              
          };  
  
        mybutton[,] mybut = new mybutton[21, 11];  
  
        byte[,] myR = new byte[21, 11];/////////////建立我的地图  
  
  
        MyPoint pa = new MyPoint();  
        MyPoint pb = new MyPoint();  
  
   
        public 主界面()  
        {  
            InitializeComponent();  
        }  
  
        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
  
        }  
  
        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)  
        {  
  
        }  
  
        private void 曲线显示ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
            Form ff = new 参数曲线();  
            ff.ShowDialog();  
        }  
  
        //private void 退出ToolStripMenuItem1_Click(object sender, EventArgs e)  
        //{  
        //    this.Close();  
        //}  
  
        private void label2_Click(object sender, EventArgs e)  
        {  
  
        }  
  
        private void chart1_Click(object sender, EventArgs e)  
        {  
  
        }  
  
        private void 主界面_Load(object sender, EventArgs e)  
        {  
//////////////////////////////场景地图建模  
            for (int i = 0; i < 21; i++)  
            {  
                for (int j = 0; j < 11; j++)  
                {  
                    mybut[i, j] = new mybutton();  
                    mybut[i, j].X = i;  
                    mybut[i, j].Y = j;  
                    mybut[i, j].Size = new Size(40, 40);  
                    mybut[i, j].Location = new Point(100+i * 40, 100+j * 40); ////////定位起点450 100  
                    this.Controls.Add(mybut[i, j]);  
                    myR[i, j] = 1;                                          //////表示当前单元格空闲  
                    mybut[i, j].MouseDown += 主界面_MouseDown;  
  
                }  
            }   
        }  
        void 主界面_MouseDown(object sender, MouseEventArgs e)  
        {  
            mybutton myb = (mybutton)sender;  
            int x = myb.X;  
            int y = myb.Y;  
            if (mychoose == mycc.wall)  
            {  
                mybut[x, y].BackColor = Color.Black;  
                myR[y, x] = 0;  
            }  
  
            if (mychoose == mycc.start)  
            {  
                mybut[x, y].BackColor = Color.Green;  
                //  myR[x, y] = 1;    
                pa.x = x;  
                pa.y = y;  
            }  
  
            if (mychoose == mycc.des)  
            {  
                mybut[x, y].BackColor = Color.Red;  
                //  myR[x, y] = 1;    
                pb.x = x;  
                pb.y = y;  
            }  
        }  
        private void 任务下达ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
            mychoose = mycc.start;  
        }  
  
        private void 设置终点ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
            mychoose = mycc.des;  
        }  
  
        private void 生成地图ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
            System.Diagnostics.Stopwatch myWatch = new System.Diagnostics.Stopwatch();  
            myWatch.Start();                       
            AxingTest ax = new AxingTest(myR);  
            List<MyPoint> myp = new List<MyPoint>();  
            myp = ax.FindeWay(pa, pb);  
            myWatch.Stop();  
            long myUseTime = myWatch.ElapsedMilliseconds;  
            搜路时间.Text = myUseTime.ToString() + " ms";  
                foreach (MyPoint p in myp)  
                {  
                    mybut[p.x, p.y].BackColor = Color.Yellow;  
                }  
                mybut[pb.x, pb.y].BackColor = Color.Red;  
        }  
  
        private void 障碍点ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
            mychoose = mycc.wall;  
        }  
  
        private void 任务管理ToolStripMenuItem_Click(object sender, EventArgs e)  
        {  
  
        }  
  
  
    }  
}  
class AxingTest  
{  
    List<MyPoint> Open_List = new List<MyPoint>();  
    List<MyPoint> Close_List = new List<MyPoint>();  
    byte[,] R;  
  
    public AxingTest(byte[,] R)  
    {  
        this.R = R;  
    }  
  
    //从开启列表查找F值最小的节点    
     
  
    //判断一个点是否为障碍物    
    private bool IsBar(MyPoint p, byte[,] map)  
    {  
        if (map[p.y, p.x] == 0) return true;  
        return false;  
    }  
  
    //判断关闭列表是否包含某个坐标的点    
    private bool IsInCloseList(int x, int y)  
    {  
        foreach (MyPoint p in Close_List)  
            if (p.x == x && p.y == y)  
                return true;  
        return false;  
    }  
  
    //从关闭列表返回对应坐标的点    
    private MyPoint GetPointFromCloseList(int x, int y)  
    {  
        foreach (MyPoint p in Close_List)  
            if (p.x == x && p.y == y)  
                return p;  
        return null;  
    }  
    //判断开始列表是否包含某个坐标的点  
    private bool IsInOpenList(int x, int y)  
    {  
        foreach (MyPoint p in Open_List)  
            if (p.x == x && p.y == y)  
                return true;  
        return false;  
    }  
    //从开始列表返回对应坐标的点   
    private MyPoint GetPointFromeOpenList(int x, int y)  
    {  
        foreach (MyPoint p in Open_List)  
            if (p.x == x && p.y == y)  
                return p;  
        return null;  
    }  
    //计算g  
    private int GetG(MyPoint p)  
    {  
        if (p.father == null) return 0;  
        if (p.x == p.father.x || p.y == p.father.y)  
            return p.father.G + 10;  
        else  
            return 0;  
    }  
    //计算h  
    private int GetH(MyPoint p, MyPoint pb)  
    {  
        return Math.Abs(p.x - pb.x) * 10 + Math.Abs(p.y - pb.y) * 10;  
    }  
    //更新开启列表  
    private MyPoint CheckP4(MyPoint p0, byte[,] map, MyPoint pa, ref MyPoint pb)  
    {  
        MyPoint Hmin = new MyPoint();  
        Hmin =null;  
        for (int xt = p0.x - 1; xt <= p0.x + 1; xt++)  
        {  
            for (int yt = p0.y - 1; yt <= p0.y + 1; yt++)  
            {  
                //取上下左右邻点  
                if (xt == p0.x || yt == p0.y)  
                {  
                    //排除超过边界和关闭自身的点    
                    if ((xt >= 0 && xt < R.GetLength(0) && yt >= 0 && yt < R.GetLength(1)) && !(xt == p0.x && yt == p0.y) )  
                    {  
                        //排除障碍点和关闭列表中的点    
                        if (map[xt, yt] != 0 && !IsInCloseList(xt, yt))  
                        {  
                            //如果在上一次开启列表里  
                            if (IsInOpenList(xt, yt))  
                            {  
                                MyPoint pt = GetPointFromeOpenList(xt, yt);  
                                    pt.G = p0.G + 10;  
                                    pt.father = p0;  
                                    pt.H = GetH(pt, pb);  
                                    if (Hmin == null ||  pt.H < p0.H)  
                                        Hmin = pt;   
                           }  
                            else  
                            {  
                                //不在开启列表中    
                                MyPoint pt = new MyPoint();  
                                pt.x = xt;  
                                pt.y = yt;  
                                pt.father = p0;  
                                pt.G = GetG(pt);  
                                pt.H = GetH(pt, pb);  
                                Open_List.Add(pt);  
                                if (Hmin==null || pt.H < Hmin.H) Hmin = pt;  
                            }  
                        }  
                    }  
                }  
            }  
        }  
        return Hmin;  
  
    }  
    ///智能寻路  
    public List<MyPoint> FindeWay(MyPoint pa, MyPoint pb)  
    {  
        List<MyPoint> myp = new List<MyPoint>();  
        Open_List.Add(pa);  
        MyPoint p0 = pa;  
        while (!(IsInOpenList(pb.x, pb.y) || Open_List.Count == 0))  
        {                 
             
            if (p0 != pa)  
            {  
            Open_List.Remove(p0);  
            Close_List.Add(p0);   
            }  
              
            p0 = CheckP4(p0, R, pa, ref pb);  
        }  
  
        MyPoint p1 = GetPointFromeOpenList(pb.x, pb.y);  
        while (p1.father != null && p1!= pa)  
        {  
            myp.Add(p1);  
            p1 = p1.father;  
            // R[p.y, p.x] = 3;    
        }  
        return myp;  
    }  
}  
class MyPoint  
{  
    public int x;  
    public int y;  
    public int G;  
    public int H;  
    public MyPoint father;  
    public MyPoint()  
    {  
    }  
    public MyPoint(int x0, int y0, int G0, int H0, MyPoint F)  
    {  
        x = x0;  
        y = y0;  
        G = G0;  
        H = H0;  
        father = F;  
    }  
  
    public override string ToString()  
    {  
        return "{" + x.ToString() + "," + y.ToString() + "}";  
    }  
}

 

基于A*算法的单AGV路径规划-AGV吧
基于A*算法的单AGV路径规划
此内容为付费资源,请付费后查看
20积分
付费资源
已售 1
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容