我在R中有一个方形矩阵,包含城市之间的距离:
set.seed(3)
x <- matrix(sample(1:15, 16, replace = TRUE), nrow = 4)
x
# [,1] [,2] [,3] [,4]
#[1,] 3 10 9 9
#[2,] 13 10 10 9
#[3,] 6 2 8 14
#[4,] 5 5 8 13
每一行代表一个可以发送信使的城市,每一列代表一个必须交付包裹的城市。所有快递员都有相同的包裹,因此可以分配到其他所有城市。
通常我会在clue::solve_LSAP()
中使用匈牙利算法来找到最佳分配,以便最小化总成本(在这种情况下为总距离):
y <- clue::solve_LSAP(x)
y
#Optimal assignment:
#1 => 1, 2 => 4, 3 => 2, 4 => 3
但是,在这种特殊情况下,我希望尽量减少距离的扩散。 我一直在寻找相当长的一段时间,我发现了以下here in this book at page 270(以及类似的here in this book at page 195):
因此,所述目标是最小化最大和最小分配距离之间的差异,这正是我正在寻找的。匈牙利算法的分配给出了最大和最小距离之间的以下差异:
distances <- x[cbind(1:4, y)]
max(distances) - min(distances)
#[1] 7
然而,最小化新目标的最佳任务是(这种解决方案是通过强力发现的):
#Optimal assignment to minimize the new objective:
#1 => 2, 2 => 4, 3 => 1, 4 => 3
yNew <- c(2, 4, 1, 3)
distancesNew <- x[cbind(1:4, yNew)]
max(distancesNew) - min(distancesNew)
#[1] 4
很明显,匈牙利算法没有给出理想的解决方案。
现在我的问题是:是否有任何现有的R代码通过最小化上述目标(最大和最小分配成本值之间的差异)找到最佳分配?或者也许某些R代码的算法可以获得类似的结果?
我提到的那些书描述了我想要的算法,但是1)它们都是从瓶颈分配问题的解决方案开始的(我也找不到R代码的算法)和2)实现这个算法(可能)也是瓶颈分配算法)我自己远非理想。