0

私は SimPy モジュールで Python2.7 を使用しています。ここに初めて投稿します。私は両方を学んでいるので、これを正しく説明したいと思います。私のプログラムの目的: Demand オブジェクトを作成し、毎週数値を生成します。リストに格納します。供給オブジェクトを作成し、需要オブジェクトによって作成された数に基づいて毎週数を生成します。52 個の数字を作成してリストに追加できるようですが、Supply オブジェクトを正常に取得してリストを読み取ることができません。私のコードは次のとおりです。

from SimPy.Simulation import *
import pylab as pyl
from random import Random
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# Model components
runLength = 51

## Lists for examination
D1Vals = []
S1Vals = []

.... other code lines

class Demander(Process):

# This object creates the demand, and stores the values in the 'D1Vals' list above

def weeklyDemand(self):  # Demand Weekly
    while True:
            lead = 1.0      # time between demand requests
            demand = random.triangular(20,110,370)  # amount demanded each increment
            #yield put, self, orderBook, delivery
            print('Week'+'%6.0f: Need %6.0f units: Total Demand = %6.0f' %
                    (now(), demand, orderBook.amount))
            yield hold, self, lead
            yield put, self, orderBook, demand
            D1Vals.append(demand)

# This object is trying to read each value iteratively in D1Vals, 
  and create a supply value and store in a list 'S1Vals'

class Supplier(Process):

def supply_rate(self):
    lead = 1.0
    for x in D1Vals:
            supply = random.triangular(x - 30, x , x + 30)               
            yield put, self, stocked, supply
            print('Week'+'%6.0f: Gave %6.0f units: Inv. Created = %6.0f' %
                    (now(), supply,stocked.amount))
            yield hold, self, lead
            S1Vals.append(stocked.amount)

..... other misc coding .....

# Model
demand_1 = Demander()
activate(demand_1, demand_1.weeklyDemand())
supply_1 = Supplier()
activate(supply_1, supply_1.supply_rate())
simulate(until=runLength)

プログラムを実行すると、要求が作成され、週ごとの値と累積値がコンソールに出力されます。また、D1Vals リストが出力されて、空でないことがわかります。

Supplier オブジェクトと関数からリストを正常に読み取るための正しいパスを教えてください。ありがとう、そしてPythonに関する私の明らかな「新鮮な」見通しを許してください;)

4

1 に答える 1

0

D1ValsS1Valsモジュールスコープで定義されています。x=S1Vals[-7:]そのモジュールのどこにでも問題なく式を書くことができるはずです 。

これは、これらの変数の値にアクセスして値を変更するために機能するため、

def append_supply( s ):
    S1Vals.append(s)

動作するはずです。

ただし、それらに割り当てるには、それらをグローバルとして宣言する必要があります

def erase_supply():
    '''Clear the list of supply values'''
    global S1Vals
    S1Vals = []

このglobal S1Vals行を省略すると、関数ローカル変数S1Valsが割り当てステートメントによって定義され、同じ名前のモジュール レベル変数が隠されます。

global ステートメントの使用を避ける方法は、実際のモジュール名を使用してこれらの変数を参照することです。あなたのコードは で定義されていると仮定します SupplyAndDemandModel.py

このファイルの先頭に置くことができます

import SupplyAndDemandModel

次に、モジュール名を使用して、これらのモジュール スコープの変数を参照します。

SupplyAndDemandModel.S1Vals = []

これにより、モジュールレベルの変数にアクセス/変更していることを明確に示す方法が提供されます。

于 2012-07-25T20:09:13.577 に答える