我有属于不同类别的个人,他们位于不同的地方
区,这些人口预计将从population
值低于
到demand
value.
population_and_demand_by_category_and_zone <- tibble::tribble(
~category, ~zone, ~population, ~demand,
"A", 1, 115, 138,
"A", 2, 121, 145,
"A", 3, 112, 134,
"A", 4, 76, 91,
"B", 1, 70, 99,
"B", 2, 59, 83,
"B", 3, 86, 121,
"B", 4, 139, 196,
"C", 1, 142, 160,
"C", 2, 72, 81,
"C", 3, 29, 33,
"C", 4, 58, 66,
"D", 1, 22, 47,
"D", 2, 23, 49,
"D", 3, 16, 34,
"D", 4, 45, 96
)
区域有给定的容量,当前人口低于此阈值,但需求
某些区域将超出容量。
demand_and_capacity_by_zone <- tibble::tribble(
~zone, ~demand, ~capacity, ~capacity_exceeded,
1, 444, 465, FALSE,
2, 358, 393, FALSE,
3, 322, 500, FALSE,
4, 449, 331, TRUE
)
因此,我们需要将这些人转移到一个新区域(我们假设我们有
总容量足够)。
我们需要移动的每个人都会产生成本,这取决于其
类别和目的地区域。这些成本如下。
costs <- tibble::tribble(
~category, ~zone, ~cost,
"A", 1, 0.1,
"A", 2, 0.1,
"A", 3, 0.1,
"A", 4, 1.3,
"B", 1, 16.2,
"B", 2, 38.1,
"B", 3, 1.5,
"B", 4, 0.1,
"C", 1, 0.1,
"C", 2, 12.7,
"C", 3, 97.7,
"C", 4, 46.3,
"D", 1, 25.3,
"D", 2, 7.7,
"D", 3, 67.3,
"D", 4, 0.1
)
我希望找到跨区域和类别的个人分布,以便
总成本最小化。所以基本上有一个新的专栏new_population
在表中population_and_demand_by_category_and_zone
如上所述。
如果有多个解决方案,如果结果是非整数,则任何一个都可以
人口,没问题。
实际用例大约有 20 个类别和 30 个区域,虽然更大,但也不是那么大。
这似乎是一个很常见的问题,所以我希望 R 中有一种方便的方法来解决这个问题。