我正在研究一种匹配供需的模型。对模型的简短解释:我有几个“供应”点,具有一定的资源单位和几个“需求”点。目的是通过最小化传输距离将可用资源从“供应”点“释放”到最接近的“需求”点。
在ArcGIS中,我已经找到了与每个“供应”点最近的“需求”点以及相应的距离。此外,我有“供应”点产生的资源量和“需求”点所需的资源。我将结果存储在Excel表格中,并将它们从小到大的距离进行排序,以便我可以使用Python进一步处理它们。
我做了一个简单概述的表格,我有2个“供应”点和几个“需求”点。 “供应”点1处可用的资源是10,“供应”点2处的资源是20.所有“需求”点的需求变化。 The Excel table looks like this:
有了这个Excel表,我想计算从每个“供应”点('D')到最近(和第二近最近......最近)“需求”点('E')可以提供多少单位的资源,直到“供给”点的值为0 /完全分配。我想在另一列('F')中存储从“供应”到“需求”的运输量的值。为此,我写了这段代码:
for row in range(1,sheet.max_row+1):
if sheet['D'+str(row)].value !=0 and sheet['E'+str(row)].value !=0:
for row in range(1,sheet.max_row+1):
if sheet['D'+str(row)].value > sheet['E'+str(row)].value:
sheet['F'+str(row)].value = sheet['E'+str(row)].value
sheet['D'+str(row)].value = sheet['D'+str(row)].value - sheet['E'+str(row)].value
sheet['E'+str(row)].value = 0
if sheet['D'+str(row)].value < sheet['E'+str(row)].value:
sheet['F'+str(row)].value = sheet['D'+str(row)].value
sheet['E'+str(row)].value = sheet['E'+str(row)].value -sheet['D'+str(row)].value
sheet['D'+str(row)].value = 0
if sheet['D'+str(row)].value == sheet['E'+str(row)].value:
sheet['F'+str(row)].value = sheet['E'+str(row)].value
sheet['D'+str(row)].value = 0
sheet['E'+str(row)].value = 0
上面的代码在列表长度的所有行中工作并计算我想要的所有值。
但是,仍有一个问题:
现在编写代码的方式,它不会正确更新供应和需求的值。因此,没有考虑到,如果从一个“供应”点向“需求”点提供一些资源,则“供应”单元中的可用资源量随后的计算而改变。
更具体地,“供应”点1仅具有可以“分配”的10个可用单元。在下面的示例表中,“供应”点1只能为第一个和第二个最近的“需求”点提供资源,直到“供应”点1的所有资源都用完为止(6个单位到“请求点”,DEMAND_FID = 10 4个单位到“要求点”DEMAND_FID = 11)。之后,“供应”点1(SUPPLY_R)的所有单元“消失”,满足DEMAND_FID = 10的“请求点”的需求,并且DEMAND_FID = 11的“请求点”的需求从6减少到1。因此,甚至不应计算第6行,因为“供应”点1不能向“请求点”提供任何额外资源。因此,我想在计算一行之后更新SUPPLY_R和DEMAND_R的值。
The “ideal” table with results should look like this:
如何根据计算中的前一行解决在一行中更改一个值的问题?
我试图用字典中的值更新新的“供应”和“需求”值,但这不会产生预期的结果。
我现在真的解决了这个问题。我正在使用字典更新每行中的值(抱歉,列的编号现在不同但希望方法变得清晰)
dict1={1: 156, 2: 5, 3: 207, ....., 226: 142}
dict2={{1: 23, 2: 18, 3: 23,....., 1530: 9}
for row in range(2,sheet.max_row+1):
sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value]
sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]
if sheet['F'+str(row)].value > sheet['I'+str(row)].value:
sheet['L'+str(row)].value = sheet['I'+str(row)].value
if sheet['L'+str(row)].value <= 0:
sheet['L'+str(row)].value = None
sheet['F'+str(row)].value = sheet['F'+str(row)].value -sheet['I'+str(row)].value
sheet['I'+str(row)].value = 0
if sheet['L'+str(row)].value > 0:
sheet['M'+str(row)].value = sheet['C'+str(row)].value
else:
sheet['M'+str(row)].value = None
if sheet['L'+str(row)].value > 0:
sheet['N'+str(row)].value = sheet['D'+str(row)].value
else:
sheet['N'+str(row)].value = None
#2 different methods to update the dictionary
dict1_1={sheet['C'+str(row)].value :sheet['F'+str(row)].value}
dict1.update(dict1_1)
sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value]
dict2[sheet['D'+str(row)].value]= sheet['I'+str(row)].value
sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]