2

作成したシミュレーションに問題があり、どうすれば解決できるかわかりません。このシミュレーションの考え方は次のとおりです。

システムには合計 10 台のマシンがあります。シミュレーションが開始されると、6 台のマシンが稼働を開始し、残りの 4 台のマシンは予備として在庫に保持されます。

要件は、システム内で常に 6 台のマシンが動作している必要があるということです。合計 6 台のマシンが稼働していない時間は、ダウンタイムとしてカウントされます。

しばらく稼働した後、稼働中の 6 台のマシンのうちの 1 台が故障します。この障害イベントが発生すると、インベントリから 1 台のマシンを取得して稼働中のマシンのグループに追加し、6 台のマシンを同時に稼働させるという要件を満たすことができます。

故障した機械は修理工場に送られ、一定期間後に修理されます。修理が完了すると、インベントリに移動され、他のマシンと合流します。

稼働中の 6 台のマシンのうち別の 1 台が次回故障した場合、在庫から 1 台のマシンが再度取り出され、故障したマシンと交換されます。これは、在庫内のマシンの数がシミュレーション全体で常に変動することを意味します。シミュレーション全体を通して、インベントリ内にあるマシンの数も確認する必要があるため、それprintを示すステートメントを追加しました。

要約すると、マシンは次のループをたどります: 作動開始 -> 失敗 -> 修理工房に送られる -> 修理後、在庫に入れられる -> 別のマシンが故障したときに再び稼働する -> 作動開始 -> 失敗 。など

このシミュレーションでのもう 1 つの要件は、マシン 1 から 10 までが常にどこにあるかを知る必要があるということです。これは、たとえば、マシン 7 がいつ故障したか、いつ修理工場に出入りしたか、いつ在庫に出入りしたかなど、各マシンの動きを追跡できるようにするためです。

このシミュレーションが構築された後、スペアの初期数と修理時間を変更して、これらの要因が稼働率のレベルにどのように影響するかを調べます。

私が直面している主な問題:

サイクル全体を通して 10 台のマシンのそれぞれを個別に追跡することはできません

スペアの在庫を適切にモデル化できません。最初にマシン 5 から 10 が稼働していて、そのうちの 1 台が故障した場合、出力の次の行は、マシン 1 が在庫から取り出され (したがって、稼働を開始し)、故障したマシンを交換したことを示しているはずです。しかし、私はそのような出力を得ることができません。

前もって感謝します!

これまでの進捗状況を含めました。

    import simpy
    import random

    RANDOM_SEED = 42
    NUM_SERVERS = 2
    MTBF = 10
    MTTR = 2
    TOTAL_MACHINES = 10
    TOTAL_SPARES = 4
    TOTAL_WORKING = TOTAL_MACHINES - TOTAL_SPARES
    SIM_TIME = 100

    class Working(object):
        def __init__ (self, env, num, repair_workshop, spares_inventory, downtime):
            self.env = env
            self.repair_workshop = repair_workshop
            self.spares_inventory = spares_inventory
            self.downtime = downtime
            self.name = 'Machine %d' % (num + 1)
            print('%s begins working %.2f' % (self.name, self.env.now))
            self.env.process(self.run())

        def run(self):
            yield self.env.timeout(random.expovariate(1.0 / MTBF))
            print('%s stops working %.2f' % (self.name, self.env.now))

            downtime_start = self.env.now
            spare = yield self.spares_inventory.get(1)
            self.downtime.append(self.env.now - downtime_start)

            print('%s taken from inventory at %.2f' % (spare.name, self.env.now))
            print('%d inside inventory' % len(spares_inventory.items))

            with self.repair_workshop.request() as req:
                yield req
                print('%s starts repair %.2f' % (self.name, self.env.now))

                yield self.env.timeout(random.expovariate(1.0 / MTTR))

                yield self.spares_inventory.put(1)
                print('%s finishes repair at %.2f' % (self.name, self.env.now))

            print(' %d inside inventory' % len(spares_inventory.items))

    def main():
        env = simpy.Environment()
        repair_workshop = simpy.Resource(env, capacity = NUM_SERVERS)
        spares_inventory = simpy.Container(env, capacity = TOTAL_MACHINES, init = TOTAL_SPARES)
        downtime = []
        working = [Working(env, i, repair_workshop, spares_inventory, downtime) for i in range(TOTAL_WORKING)]

        env.run(SIM_TIME)

        print('Total downtime for all machines throughout simulation time is %.2f hours' % sum(downtime))
        print('Operational Availability = %.2f percent' % ( (SIM_TIME - sum(downtime)) * 100 / (SIM_TIME)))

    if __name__ == '__main__':
        main()

Stefan の助けを借りて、スクリプトを次のように変更しました。

    class Working(object):

        def __init__ (self, env, num, repair_workshop, spares_inventory, downtime, machine):
            self.env = env
            self.repair_workshop = repair_workshop
            self.spares_inventory = spares_inventory
            self.downtime = downtime
            self.machine = machine
            self.name = ('Machine %d' % (num + 1))
            print('%s begins working %.2f' % (self.name, self.env.now))
            self.env.process(self.run())

        def run(self):
            yield self.env.timeout(random.expovariate(1.0 / MTBF))
            print('%s stops working %.2f' % (self.name, self.env.now))

            downtime_start = self.env.now
            spare = yield self.spares_inventory.get(1)
            self.downtime.append(self.env.now - downtime_start)

            print('%s taken from inventory at %.2f' % (spare.name, self.env.now))
            print('%d inside inventory' % len(spares_inventory.items))

            with self.repair_workshop.request() as req:
                yield req
                print('%s starts repair %.2f' % (self.name, self.env.now))

                yield self.env.timeout(random.expovariate(1.0 / MTTR))

                yield self.spares_inventory.put(1)
                print('%s finishes repair at %.2f' % (self.name, self.env.now))

            print(' %d inside inventory' % len(spares_inventory.items))

    def main():
        env = simpy.Environment()
        repair_workshop = simpy.Resource(env, capacity = NUM_SERVERS)
        downtime = []

        machines = [object() for i in range(TOTAL_MACHINES)]
        working, spares = machines[:TOTAL_WORKING], machines[TOTAL_WORKING:]
        spares_inventory = simpy.Store(env, capacity = TOTAL_MACHINES)
        spares_inventory.items = spares
        working = [Working(env, i, repair_workshop, spares_inventory, downtime, machine) for i, machine in enumerate(working)]

        env.run(SIM_TIME)

        print('Total downtime for all machines throughout simulation time is %.2f hours' % sum(downtime))
        print('Operational Availability = %.2f percent' % ( (SIM_TIME - sum(downtime)) * 100 / (SIM_TIME)))

    if __name__ == '__main__':
        main()

これは私が受け取ったトレースバックです:

    Traceback (most recent call last):
    File "/Users/Scripts/8oct1.py", line 70, in <module> main()
    File "/Users/Scripts/8oct1.py", line 64, in main env.run(SIM_TIME)
    File "/Library/Python/2.7/site-packages/simpy/core.py", line 120, in run self.step()
    File "/Library/Python/2.7/site-packages/simpy/core.py", line 213, in step raise event._value
    TypeError: __init__() takes exactly 2 arguments (3 given)
4

1 に答える 1

2

Storeの代わりに を使用できますContainer。をStore使用すると、マシンに識別可能なオブジェクトを使用して、シミュレーションを通じてその経路をたどることができます。

例えば、

machines = [object() for i in range(TOTAL_MACHINES)]
working, spares = machines[:TOTAL_WORKING], machines[TOTAL_WORKING:]
spares_inventory = Store(env, capacity=TOTAL_MACHINES)
spares_inventory.items = spares
working = [Working(env, i, machine) for i, machine in enumerate(working)]

もちろん、代わりにobject(名前付き) タプル、プレーンな int、またはマシンを表すのに最適なその他のオブジェクトも使用します。

于 2014-10-08T07:44:36.290 に答える