2017-04-24 37 views
1

간단한 우선 순위 규칙을 사용하여 주어진 레이아웃으로 이동하는 여러 자치 차량을 갖춘 창고를 시뮬레이트해야합니다. 내 이해에서이 문제는 이산 이벤트 시뮬레이션 (DES)으로 쉽게 해결할 수 있으며이 경우 SimPy을 사용합니다.그리드 /웨어 하우스 레이아웃에서 이산 이벤트 시뮬레이션 시각화

내가 보는 문제는이 차량의 실제 궤도와 상호 작용을 시각화하는 것이 매우 어려워 보인다는 것입니다. 물론 모든 기간 동안 모든 차량의 모든 위치를 기록 할 수는 있지만 시각화를 작성하려면 어떻게해야합니까?

가장 멍청한 방법은 백만 장의 사진을 만드는 것이지만 더 좋은 방법이 있어야합니다. 배경 앞에 기호를 이동하여 그리드의 오브젝트 이동을 시각화하는 라이브러리 또는 도구가 있습니까?

또 다른 옵션은 AnyLogic과 같은 소프트웨어로 에이전트 기반 접근 방식을 사용하는 것입니다. 그러나 이것은 나에게 더 복잡해 보이며, 선호되는 오픈 소스 소프트웨어와 함께 DES 접근 방식을 적용하고자합니다.

+1

도서관이나 도구에 대한 권장 사항은 질문을 닫는 기준으로 명시되어 있습니다. 즉, Simio, Arena 또는 ExtendSim과 같은 상용 DES 제품은 모두 애니메이션/시각화 기능을 제공합니다. 나쁜 소식은 가격이 비싸다는 것입니다. 가능한 희망은 학문적으로 쉽게 이용할 수있는 것입니다. – pjs

+0

설명해 주셔서 감사합니다. 나는 그렇게하지 않으면 내 질문에 관한 도움을 얻는 방법과 장소를 확신 할 수 없다. 어디에서 묻겠습니까? 또는 어떻게 제 질문을 재 설명해야합니까? – mondano

답변

0

R 라이브러리 gganimate이 내가 원하는 것을 수행한다는 것을 알게되었습니다. 나는 파이썬에 상응하는 것을 찾지 못했다. (어쩌면 파이썬에서 ggplot2도 아니고 animate도 없기 때문에) ...

0

필자는 모든 필수 데이터를 수집하여 어딘가에 저장합니다 (파일, HDF5, SQL 등). 나중에 (또는 병렬로) 데이터를 시각화 할 수 있습니다. 예를 들어 matplotlib 등으로 많은 이미지를 생성하거나 D3.js으로 더 멋진 이미지를 만들면됩니다.

+0

내 질문은 *이 시각화 부분을 얼마나 정확하게 수행했는지입니다. 벽 시계 시간을 8 시간으로 시뮬레이션하고 매 순간 "그림"을 찍으면 하나의 시뮬레이션 실행을 시각화하기 위해 8 시간 * 60 분/시간 * 60 초/분 * 1MB = 28.8GB입니다. 이것은 너무 많이 보인다. 더 효율적인 솔루션을 찾고 있습니다. 이 동적 인 문제에 해당하는 D3.js 차트 옵션을 찾지 못했습니다. 나에게 직접 가르쳐 주시겠습니까? – mondano

2

나는 tkinter 라이브러리를 체크 아웃 할 것을 제안한다. 우리는 이것을 사용하여 우리의 모든 simpy 시각화를 수행합니다. https://github.com/harrymunro/Simulations/blob/master/termini_simulation_animation.py 여기

은 다음과 같습니다 대략 당신은 위 참조에 대해 설명하는 다음

https://www.youtube.com/watch?v=xnZQ0f--Ink 소스 코드입니다 : 여기

달성 할 수 애니메이션의 종류의 매우 기본적인 예입니다, 극적인 장면을 사면 애니메이션 구성 요소의 복사 붙여 넣기 :

################ 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 ################# 
+1

감사합니다. 이것은 정말 흥미로운 해결책입니다! – mondano

1

애니메이션 당신이 Pygame 라이브러리를 사용할 수있는 2D해야합니다. 나는 그것과 약간 simpy 시뮬레이션 애니메이션 그것은 잘 작동. 쓰레드를 사용해야한다면 몇 초 후에 윈도우가 멈추게됩니다. 이 간단한 방법은 고객이 도착할 때마다 빨간색 원을 그리며 고객이 도착하면 녹색으로 그립니다.

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()