分配算法变体

时间:2017-04-07 10:31:57

标签: r algorithm

我在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):

enter image description here

因此,所述目标是最小化最大和最小分配距离之间的差异,这正是我正在寻找的。匈牙利算法的分配给出了最大和最小距离之间的以下差异:

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)实现这个算法(可能)也是瓶颈分配算法)我自己远非理想。

0 个答案:

没有答案