2012-07-25 77 views
0

我使用Python2.7用的SimPy模塊,第一次在這裏發帖。 我只是在學習他們所以我希望我解釋正確。 我的程序目標: 創建一個Demand對象並每週生成一個數字。 將它存儲在一個列表中。 根據需求對象創建的編號,創建一個Supply對象並每週生成一個數字。 我似乎能夠創建我的52號碼,並將它們追加到列表中,但我無法成功獲取Supply對象來讀取列表。 我的代碼如下:Python 2.7版:功能訪問列表

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名單給我看看,這是不是空。

誰能請指引我正確的路徑,成功地讀取來自供應對象和功能列表。 謝謝,請原諒我對python的'新鮮'外觀;)

+0

您的supply_rate()和weeklyDemand()方法壓痕都搞砸 – 2012-07-25 19:55:10

回答

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 = [] 

這提供了明確表明,你的方式正在訪問/修改模塊級變量。

+0

@Colin:謝謝,它在我的實際的程序確定。 – manengstudent 2012-07-25 20:30:22

+0

@Dave謝謝你,儘管在我的學習曲線的這個階段,對我來說似乎有點複雜。我希望能夠爲我的「初學者」編碼找到一個解決方案。另一件事我注意到,如果我用任意隨機數手動填充D1Vals,那麼程序就可以工作(即使len(D1Vals)現在是52而不是51)。要繼續嘗試,並仍然感謝任何幫助 – manengstudent 2012-07-25 20:58:24

+0

@戴夫。根據你的建議,我可以通過將列表聲明爲全局來獲得結果,並且每次訪問列表時都會刪除條目。所以這是一個值得學習的練習,因爲它迫使我理解我可以從哪裏獲取變量。謝謝。不知道我是否打算髮布工作代碼? – manengstudent 2012-07-27 13:30:59