Grid 网格/仓库布局上离散事件仿真的可视化

Grid 网格/仓库布局上离散事件仿真的可视化,grid,visualization,simulation,anylogic,simpy,Grid,Visualization,Simulation,Anylogic,Simpy,我需要模拟一个仓库,其中有几个自动车辆在给定的布局上以简单的优先级规则移动。在我的理解中,这个问题可以很容易地用离散事件模拟(DES)来解决,我将使用它 我看到的问题是,我似乎很难想象这些车辆的实际轨迹和相互作用。当然,我可以记录所有时段内所有车辆的所有位置,但我如何继续创建可视化 最愚蠢的方法是创造一百万张照片,但必须有更好的方法。是否有任何库或工具可以通过在背景前移动符号来可视化网格上对象的移动 另一个选择是使用基于代理的方法和软件,如,但这对我来说似乎更复杂,我想应用DES方法,最好是使用

我需要模拟一个仓库,其中有几个自动车辆在给定的布局上以简单的优先级规则移动。在我的理解中,这个问题可以很容易地用离散事件模拟(DES)来解决,我将使用它

我看到的问题是,我似乎很难想象这些车辆的实际轨迹和相互作用。当然,我可以记录所有时段内所有车辆的所有位置,但我如何继续创建可视化

最愚蠢的方法是创造一百万张照片,但必须有更好的方法。是否有任何库或工具可以通过在背景前移动符号来可视化网格上对象的移动


另一个选择是使用基于代理的方法和软件,如,但这对我来说似乎更复杂,我想应用DES方法,最好是使用开源软件。

我只收集所有需要的数据并将它们存储在某个地方(文件、HDF5、sql等)。稍后(或并行),您可以可视化该数据。通过使用matplotlib等工具生成大量图像,或者使用matplotlib做一些更有趣的事情。

我发现R库满足了我的需求。但是我还没有找到Python的等价物(可能是因为既没有ggplot2的等价物,也没有Python中的等价物…

我建议查看tkinter库。我们用这个做所有的简单可视化

下面是一个可以实现的动画类型的基本示例,请原谅戏剧性的片段:

以下是源代码,大致描述了您在上面看到的内容:

以下是动画组件的复制粘贴:

################ SET UP ANIMATION CANVAS #################
class Train:
    def __init__(self, canvas, x1, y1, x2, y2, tag):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.canvas = canvas
        self.train = canvas.create_rectangle(self.x1, self.y1, self.x2, self.y2, fill="red", tags = tag)
        self.train_number = canvas.create_text(((self.x2 - self.x1)/2 + self.x1), ((self.y2 - self.y1)/2 + self.y1), text = tag)
        self.canvas.update()

    def move_train(self, deltax, deltay):
        self.canvas.move(self.train, deltax, deltay)
        self.canvas.move(self.train_number, deltax, deltay)
        self.canvas.update()

    def remove_train(self):
        self.canvas.delete(self.train)
        self.canvas.delete(self.train_number)
        self.canvas.update()

class Clock:
    def __init__(self, canvas, x1, y1, x2, y2, tag):
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        self.canvas = canvas
        self.train = canvas.create_rectangle(self.x1, self.y1, self.x2, self.y2, fill="#fff")
        self.time = canvas.create_text(((self.x2 - self.x1)/2 + self.x1), ((self.y2 - self.y1)/2 + self.y1), text = "Time = "+str(tag)+"s")
        self.canvas.update()

    def tick(self, tag):
        self.canvas.delete(self.time)
        self.time = canvas.create_text(((self.x2 - self.x1)/2 + self.x1), ((self.y2 - self.y1)/2 + self.y1), text = "Time = "+str(tag)+"s")
        self.canvas.update()


if show_animation == True:
    animation = Tk()
    #bitmap = BitmapImage(file="uxbridge.bmp")

    im = PhotoImage(file="uxbridge_resized.gif")

    canvas = Canvas(animation, width = 800, height = 400)
    canvas.create_image(0,0, anchor=NW, image=im)
    animation.title("Uxbridge Termini Simulation")

    canvas.pack()

#### matplotlib plots


if show_animation == True and hide_plots == False:
    f = plt.Figure(figsize=(5,4), dpi=100)

    a1 = f.add_subplot(221) # mean headway
    a2 = f.add_subplot(222) # TPH meter
    a3 = f.add_subplot(223) # headway distribution
    a4 = f.add_subplot(224) # train count

    a1.plot()
    a2.plot()
    a3.plot()
    a4.plot()

    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

    dataPlot = FigureCanvasTkAgg(f, master=animation)
    dataPlot.show()
    dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
    f.tight_layout()

    canvas.pack()

# platforms
if show_animation == True:
    canvas.create_rectangle(50, 100, 200, 150, fill = "yellow")
    canvas.create_rectangle(50, 200, 200, 250, fill = "yellow")

    canvas.create_line(50, 75, 200, 75, fill="green", width=3) # platform 4
    canvas.create_line(50, 175, 200, 175, fill="green", width=3) # platform 2/3
    canvas.create_line(50, 275, 200, 275, fill="green", width=3) # platform 1

    canvas.create_text(125, 110, text = "Platform 4")
    canvas.create_text(125, 140, text = "Platform 3")
    canvas.create_text(125, 210, text = "Platform 2")
    canvas.create_text(125, 240, text = "Platform 1")

# track
    canvas.create_line(200, 75, 650, 75, fill="green", width=3) # platform 4 run out
    canvas.create_line(200, 175, 650, 175, fill="green", width=3) # platform 2/3 run in
    canvas.create_line(300, 175, 400, 75, fill="green", width=3)
    canvas.create_line(450, 75, 600, 175, fill="green", width=3)
    canvas.create_line(450, 175, 600, 75, fill="green", width=3)
    canvas.create_line(200, 275, 300, 275, fill="green", width=3)
    canvas.create_line(300, 275, 400, 175, fill="green", width=3)

############ END OF CANVAS #################

如果动画应为2D,则可以使用库。我用它制作了一个简单的模拟动画,效果很好。请注意,您需要使用线程,否则几秒钟后窗口将冻结。这个简单的方法为每个到达的顾客画一个红色圆圈,当顾客得到服务时画一个绿色圆圈

def draw(env, timelist):
    gameDisplay.fill(white)
    start = time.clock()
    kdnr = 0
    kdaktuell = -1
    kdstart = -10
    while True:
        timer = (time.clock() - startzeit)
        if timer > 15: #simulation for 15 sec
                break

    # incoming customers
    if kdnr < len(timelist):
        if timelist[kdnr] <= timer:
            pygame.draw.circle(gameDisplay,red,(50+30*kdnr,400),10)
            print('Customer '+str(kdnr+1)+ ' arrived in minute: ' + str(timelist[kdnr]))
            kdnr = kdnr + 1

    # served customers
    if (kdstart+3) <= timer:
        kdaktuell = kdaktuell + 1
        kdstart = time
        pygame.draw.circle(gameDisplay,green,(50+30*kdaktuell,400),10)
        print('Customer '+str(kdaktuell+1)+ ' gets served.')

    pygame.display.update()
def绘图(环境,时间列表):
游戏显示。填充(白色)
开始=时间。时钟()
kdnr=0
kdaktuell=-1
kdstart=-10
尽管如此:
计时器=(time.clock()-startzeit)
如果计时器>15:#模拟15秒
打破
#新客户
如果kdnr如果timelist[kdnr]与您打算用于模拟库的内容相比,有一点变化,可以使用它来代替simpy。它与simpy非常相似,但有一个动画引擎,大大简化了过程。

我的问题是如何准确地完成这一可视化部分。如果我有一个模拟时间为8小时的挂钟,并且每秒拍一张“照片”,那么我有8小时*60分钟/h*60秒/min*1 MB=28.8 GB用于一次模拟运行的可视化。这似乎有点太过分了。我正在寻找一个更有效的解决方案。对于这个动态问题,我没有找到相应的D3.js图表选项。你能直接给我指一个吗?请注意,征求关于库或工具的建议是明确规定的一个标准,以结束你的问题。也就是说,商业DES产品,如Simio、Arena或ExtendSim都提供动画/可视化功能。坏消息是它们很贵。一个可能的希望是,其中一些可以随时用于学术用途。感谢您的澄清。如果不是这样的话,我不确定如何以及在哪里获得关于我的问题的帮助。您会在哪里提问,或者我需要如何重新表述我的问题?函数draw中未使用env。