我在R中模拟一个仓库,其中供应(o.in)到达随机提前期并且需求(d)被提供。库存水平(stockHistory)是根据供需之间的差异计算的。
for(i in 1:periods){
stockHistory[i] = stockHistory[i] - d[i] + o.in[i] # o.in has been determined in previous looping, d is known before loop
openOrders = openOrders - o.in[i]
missing_packages = ceiling((reorderPoint - stockHistory[i] - openOrders)/q) # stockHistory + openOrders are based on o.in and calculated in loop
if (missing_packages > 0 ) {
openOrders = openOrders + missing_packages * q
o.in[leadtimes[i]+i] = o.in[leadtimes[i]+i] + missing_packages * q # leadtimes is known before looping
}
}
如何通过矢量化避免 for loop ?我的问题是我不知道如何处理
o.in[leadtimes[i]+i] = o.in[leadtimes[i]+i] + missing_packages * q
以矢量化的方式,以便在计算中按元素计算向量中的偏移 leadtimes [i] + i 。我检查了diff(),但它似乎不适合我的用例。
第二个问题是我无法确定操作的正确顺序,因为它们是基于彼此的。
任何帮助都将受到高度赞赏。提前谢谢!
答案 0 :(得分:1)
好吧,让我们逐行看一下。例如:
stockHistory[i] = stockHistory[i] - d[i] + o.in[i]
由于没有"历史依赖,"写一下
stockHistory <- stockHistory -d +o.in
openOrders = openOrders - o.in[i]
在这里,将openOrders
设为与其他所有内容相同长度的矢量。
openOrders <- -o.in # and later modify each i-th element in some way
您与missing_packages
的问题在于,您似乎并没有将其作为与您的第i个时间段对齐的值向量。当您更好地定义您的情况时,我可以建议进一步的矢量化代码。我将指出您当前的设置是天真的,因为添加零不会改变值:-)。要点:
if ( foo > 0 ) bar <- bar + 5*foo
是浪费精力。 bar<-bar + 5*foo
完全相同,foo
是否为零。