Я работаю над моделью, чтобы соответствовать спросу и предложению.Краткое объяснение модели: у меня есть несколько точек «предложения» с определенной единицей ресурсов и несколькими точками «спроса».Цель состоит в том, чтобы «разгрузить» имеющиеся ресурсы из точек «предложения» в ближайшую точку «спроса», минимизируя транспортные расстояния.
В ArcGIS я уже нашел ближайшую точку «спроса» для каждой точки «поставки» с соответствующим расстоянием.Кроме того, у меня есть количество ресурсов, произведенных в точке «предложения», и ресурсы, необходимые в точке «спроса».Я сохранил результаты в таблице Excel и отсортировал их по расстоянию от малого до большого, чтобы я мог работать с ними дальше, используя Python.
Я составил таблицу с простым обзором, где у меня есть 2 точки «предложения» и несколько точек «спроса».Ресурсы, доступные в точке 1 «снабжения», равны 10, а в точке 2 «предложения» - 20. Спрос во всех точках «спроса» варьируется. Таблица Excel выглядит следующим образом:
Используя эту таблицу Excel, я хочу вычислить, сколько единиц ресурсов можно было бы доставить из каждой точки «поставки» («D») к ближайшей(и 2-ая ближайшая… n ближайшая) точка «спроса» («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
Приведенный выше код работает и рассчитываетвсе значения, которые я хочу в столбцах F во всех строках по всей длине списка.
Однако остается одна проблема:
То, как код написан сейчас, не корректно обновляет значения спроса и предложения.Таким образом, не принимается во внимание, что если некоторые ресурсы поставляются из одной точки «предложения» в точку «спроса», то количество доступных ресурсов в ячейке «предложения» изменяется для расчетов после этого.
В частности, пункт «снабжения» 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 после того, как была вычислена одна строка.
«Идеальная» таблица с результатами должна выглядеть следующим образом:
Как решить проблему изменения одного значения в одной строке на основе предыдущих строк врасчет?
Я пытался обновить новые значения «предложение» и «спрос» значениями из словаря, но это не дает желаемого результата.