ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

simpy仿真JS-AGV联合调度(考虑AGV运输时间的作业车间调度)小实验(一:演示框架)

2021-09-09 22:32:52  阅读:481  来源: 互联网

标签:Origin canvas p1 simpy self 调度 AGV create unit


        这个项目纯属小个人娱乐小项目,由于最近突然发现了一个比较好玩的第三方库simpy,由此引发了这一个小实验的灵感,本项目涉及内容:

        路径优化算法:A*算法(采用A*做一个无路径冲突的AGV调度),其中节点间距离采用曼哈顿距离。

        界面开发工具:tkinter

        仿真工具:simpy

        JS-AGV算例:3机器、3工件、2个AGV,不考虑AGV充电、考虑装卸站和路径冲突。

        实验的目的:做一个动态演示的排产过程以及AGV调度过程。

        实验扩展:后续有时间将采用强化学习来指导调度过程。

Machine=[
        [1,2,3],
        [2,3,1],
        [1,3,2],
    ]
    #机器在地图中的坐标
    Machine_site=[[4,1],[4,2],[4,3]]
    Processing_time=[
        [4,7,8],
        [5,2,3],
        [1,3,4]
    ]
    AGV_num=2

首先,搭建演示框架:

import simpy
import tkinter as tk

class Center:
    def __init__(self,Env,x=4,y=5):
        self.x=x
        self.y=y
        self.unit=70
        self.Origin = [1, 2]
        self.split = 5
        self.Hight = self.y - 1  # 4
        self.Width = self.x - 1  # 3
        self.build_JSP()

    def build_JSP(self):
        self.window = tk.Tk()

        self.window.title("Job shop scheduling simulation")
        self.window.geometry("{1}x{1}".format((self.Hight + 4) * self.unit
                                              , (self.Width + 9) * self.unit))
        self.canvas = tk.Canvas(bg="white", height=(self.Hight + 4) \
                                                   * self.unit, width=(self.Width + 9) * self.unit)

        # Grid Layout
        for c in range(0, (self.Width * self.unit + 1), self.unit):
            x0, y0, x1, y1 = self.Origin[0] * self.unit + c, self.Origin[1] * self.unit \
                , self.Origin[0] * self.unit + c, (self.Hight + self.Origin[1]) \
                             * self.unit
            self.canvas.create_line(x0, y0, x1, y1)

        for r in range(0, (self.Hight * self.unit + 1), self.unit):
            x0, y0, x1, y1 = self \
                                 .Origin[0] * self.unit, self.Origin[1] * self.unit + r \
                , (self.Width + self.Origin[0]) * self.unit \
                , self.Origin[1] * self.unit + r
            self.canvas.create_line(x0, y0, x1, y1)

        # Loading Point
        L = [[0, 2]]
        for i in range(len(L)):
            p1 = [(self.Origin[0] + L[i][0]) * self.unit - 5, (self.Origin[1] + self.Hight - L[i][1]) \
                  * self.unit - 5]
            p2 = [(self.Origin[0] + L[i][0]) * self.unit + 5, (self.Origin[1] + self.Hight - L[i][1]) \
                  * self.unit + 5]
            self.canvas.create_oval(p1[0], p1[1], p2[0], p2[1], fill="blue")
        # Unloading Point
        U = [[0, 1]]
        for i in range(len(U)):
            p1 = [(self.Origin[0] + U[i][0]) * self.unit - 5, (self.Origin[1] + self.Hight - U[i][1]) \
                  * self.unit - 5]
            p2 = [(self.Origin[0] + U[i][0]) * self.unit + 5, (self.Origin[1] + self.Hight - U[i][1]) \
                  * self.unit + 5]
            self.canvas.create_oval(p1[0], p1[1], p2[0], p2[1], fill="green")
        # P/D Point
        PD = [[2,1],[2,2],[2,3]]
        Machine_name=["M1","M2","M3"]
        #scheduling的布局
        self.canvas.create_rectangle( 4.1* self.unit,  2* self.unit, 11* self.unit,  6* self.unit \
                                     , fill="white")
        for i in range(len(PD)):
            p1 = [(self.Origin[0] + PD[i][0]) * self.unit - 5, (self.Origin[1] \
                                                                + self.Hight - PD[i][1]) * self.unit - 5]
            p2 = [(self.Origin[0] + PD[i][0]) * self.unit + 5, (self.Origin[1] \
                                                                + self.Hight - PD[i][1]) * self.unit + 5]

            self.canvas.create_rectangle(p1[0]-20, p1[1]-20, p2[0]+20, p2[1]+20 \
                                                  , fill="orange")
            self.canvas.create_text(p1[0]+5, p1[1]+5, text=Machine_name[i]
                                , font=("arial", 12), fill="black")
            self.canvas.create_rectangle(p1[0] - 20+1.7*self.unit, p1[1] - 20, p2[0] + 20+1.7*self.unit, p2[1] + 20 \
                                         , fill="red")
            self.canvas.create_text(p1[0] + 5+1.7*self.unit, p1[1] + 5, text=Machine_name[i]
                                    , font=("arial", 12), fill="black")
        # AS/RS]
        p = [0.5 * self.unit, 4.5 * self.unit]
        p1 = [0.1* self.unit, 5.5* self.unit]
        p2 = [1* self.unit,3.5* self.unit]
        self.canvas.create_rectangle(p1[0], p1[1], p2[0], p2[1] \
                                     , fill="yellow")
        self.canvas.create_text(p[0], p[1], text="AS/RS"
                                , font=("arial", 12), fill="black")

        self.canvas.create_rectangle(0* self.unit \
                                            , 0* self.unit, 1.6* self.unit \
                                            , 0.8* self.unit \
                                     , fill="gray")
        self.time = self.canvas.create_text(0.8 * self.unit \
                                            , 0.4 * self.unit, text="00:00" \
                                            , font=("arial", 20) \
                                            , fill="Blue")
        self.canvas.create_text(2.5*self.unit, 1.5*self.unit, text="SIMULATION SIDE"
                                , font=("arial", 12), fill="black")
        self.canvas.create_text(7.5 * self.unit, 1.5 * self.unit, text="SCHEDULING SIDE"
                                , font=("arial", 12), fill="black")
        self.canvas.pack()
        self.window.mainloop()

Env=simpy.Environment()
c=Center(Env)

得到界面框架如下: 

标签:Origin,canvas,p1,simpy,self,调度,AGV,create,unit
来源: https://blog.csdn.net/crazy_girl_me/article/details/120211156

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有