我正在使用Python2.7和SimPy模块,第一次在这里发帖。 我正在学习它们,所以我希望我能正确解释。 我的计划的目标: 创建一个Demand对象并每周生成一个数字。 将其存储在列表中。 创建一个Supply对象,并根据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列表以便我看到它不是空的。
任何人都可以引导我到正确的路径,从供应商对象和功能成功阅读列表。 谢谢,请原谅我对python的明显“新鲜”展望;)
答案 0 :(得分:0)
D1Vals
和S1Vals
在模块范围内定义;
你应该能够写出像这样的表达式
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
由赋值语句定义,模糊了模块级
具有相同名称的变量。
避免使用全局语句的一种方法是使用实际的模块名称
引用这些变量。我假设您的代码已定义
SupplyAndDemandModel.py
。
在此文件的顶部,您可以输入
import SupplyAndDemandModel
然后使用模块名称引用那些模块范围的变量:
SupplyAndDemandModel.S1Vals = []
这提供了一种明确指示您正在访问/修改模块级变量的方法。