2017-04-24 6 views
1

シンプルな優先順位ルールを使用して、特定のレイアウト上を移動する複数の自律車両を使用して倉庫をシミュレートする必要があります。私の理解では、この問題は離散事象シミュレーション(DES)で簡単に取り組むことができ、これにはSimPyを使用します。グリッド/倉庫レイアウトでの離散事象シミュレーションの可視化

私が見ている問題は、これらの車両の実際の軌道と相互作用を視覚化することは非常に難しいようです。もちろん、すべての車両のすべてのポジションをすべての期間記録することができますが、どのように進んでビジュアライゼーションを作成できますか?

愚かなやり方は、100万枚の写真を作成することですが、より良い方法が必要です。背景の前にシンボルを移動させてグリッド上のオブジェクトの動きを視覚化するライブラリやツールはありますか?

もう1つの選択肢は、AnyLogicのようなソフトウェアでエージェントベースのアプローチを使用することですが、これは私にとってはもっと複雑に思えるので、オープンソースソフトウェアでDESアプローチを適用したいと思います。

+1

ライブラリやツールの推奨事項を明記することは、質問を閉じるための基準として明記されています。つまり、Simio、Arena、ExtendSimなどの商用DES製品はすべてアニメーション/ビジュアライゼーション機能を提供します。悪いニュースは、彼らが高価だということです。可能性のある希望の光線は、それらのうちのいくつかが学術的な利用のために容易に利用可能であることである。 – pjs

+0

清算していただきありがとうございます。私は、SO上になければ、私の質問に関してどのように助けを受けるべきかわからない。あなたはどこで質問しますか、私は自分の質問を言い換える必要がありますか? – mondano

答えて

0

私はRライブラリgganimateが欲しいものを見つけました。私はPythonに相当するものを見つけられませんでした(おそらく、ggplot2と同等でもなく、Pythonでanimateもないからです...)

0

私はちょうどすべての必要なデータを収集し、それらをどこかに保存します(ファイル、HDF5、SQLなど)。後で(または並行して)、そのデータを視覚化することができます。たとえば、matplotlibなどでたくさんの画像を生成するか、D3.jsでもっと魅力的なことをすることによって、

+0

私の質問は、この視覚化の部分をどのくらい正確に行うかということでした。私が8時間の壁時計時間のシミュレーションをして毎秒 "画像"を撮ると、1回のシミュレーション実行の視覚化のために8時間* 60分/ 60秒/分* 1MB = 28.8GBとなります。これはあまりにも多すぎるようです。私はより効率的なソリューションを探しています。私は、この動的な問題の対応するD3.jsグラフオプションが見つかりませんでした。あなたは私に直接1つを指摘できますか? – mondano

2

私はtkinterライブラリをチェックアウトすることをお勧めします。私たちはこれを使用して私たちのすべてのsimpy視覚化を行います。ここで

は劇的な映像を許し、達成することができ、アニメーションの種類の非常に基本的な例である:ここではhttps://www.youtube.com/watch?v=xnZQ0f--Ink

は大体あなたは上記を参照について説明したソースコードは次のとおりです。ここでhttps://github.com/harrymunro/Simulations/blob/master/termini_simulation_animation.py

ですアニメーションコンポーネントのコピーペースト:

################ 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() 
関連する問題