1

これが私がSimPyに実装しようとしているものです:

顧客は最初にサーバーAに5分間サービスを提供します。次に、各顧客は2つに分割され、1つはサーバーBに3分間サービスを提供し、もう1つはサーバーCに2分間サービスを提供します。

次のコードを書きましたが、出力に基づいて動作していないようです。また、サーバーAを離れる各顧客を分割したいので、コピー機能の使用方法が正しいかどうかはわかりませんが、私のコードは最初の顧客でしか機能しない可能性があると感じています。

どんな助けでもいただければ幸いです。

from SimPy.Simulation import *
from copy import *

class Source(Process):                               
    def generate(self):                 
        for i in range(5):
            c = Customer(name="Customer%02d" % (i))  
            activate(c, c.runA())
            yield hold, self, 10                    

class Customer(Process):
    def runA(self):
        print("%7.4f %s (original) enters server A" % (now(), self.name))
        yield hold, self, 5
        print("%7.4f %s (original) leaves server A" % (now(), self.name))

        dup1 = copy(self)
        dup2 = copy(self)
        activate(dup1, dup1.runB())
        activate(dup2, dup2.runC())

    def runB(self):
        print("%7.4f %s (copy) enters server B" % (now(), self.name))
        yield hold, self, 3
        print("%7.4f %s (copy) leaves server B" % (now(), self.name))

    def runC(self):
        print("%7.4f %s (copy) enters server C" % (now(), self.name))
        yield hold, self, 2
        print("%7.4f %s (copy) leaves server C" % (now(), self.name))

initialize()
s = Source()                                         
activate(s, s.generate(), at=0.0)
simulate(until=100.0)

出力:

 0.0000 Customer00 (original) enters server A
 5.0000 Customer00 (original) leaves server A
10.0000 Customer01 (original) enters server A
15.0000 Customer01 (original) leaves server A
20.0000 Customer02 (original) enters server A
25.0000 Customer02 (original) leaves server A
30.0000 Customer03 (original) enters server A
35.0000 Customer03 (original) leaves server A
40.0000 Customer04 (original) enters server A
45.0000 Customer04 (original) leaves server A
logout
4

1 に答える 1

0

残念ながら、Simpy プロセスのコピーはそれほど単純ではありません。これは、ジェネレーター ( 「 」を参照) であり、シミュレーション用の内部変数を保持しているためだと思います。

コードを機能させるには、RunA(self) を次のように変更します。ここでは、self をコピーするのではなく、self のように見える 2 つの新しい Process-Customers を作成します。

def runA(self):
    print("%7.4f %s (original) enters server A" % (now(), self.name))
    yield hold, self, 5
    print("%7.4f %s (original) leaves server A" % (now(), self.name))

    dup1 = Customer(name = self.name)
    dup2 = Customer(name = self.name)

    activate(dup1, dup1.runB())
    activate(dup2, dup2.runC())

コピーする変数が 1 つしかないため、これはうまく機能します。より複雑なケースでは、var(Object)メソッドを使用できますが、Process クラスにはおそらくコピーすべきではない多くの変数が含まれていることに注意してください。

また、シミュレーションの設計に役立つ SimPy のチュートリアルもお勧めします。

于 2013-11-07T15:01:01.513 に答える