我刚开始使用this example在R中学习遗传算法,我遇到了一个尝试应用它的有趣问题。我在数据框dataset
中有商店,供应中心和商店与供应中心之间的距离(英里)数据集:
Shop Center Distance DistanceSave
A 1 700 300
A 2 200 800
A 3 300 700
B 1 400 600
B 2 100 900
B 3 150 850
C 1 600 400
C 2 500 500
C 3 200 800
我正在尝试最小化Distance
(或最大化DistanceSave
,即1000减去Distance
),但受限于每个商店必须绑定到Center
并且我在编写最后一部分时遇到了麻烦:
#Generate Evaluation Function
library(genalg)
evalFunc <- function(x) {
current_solution_savings <- x %*% dataset$DistanceSave
current_solution_shop <- length(unique(dataset$shop[x==1]))
#Set Conditions in Function
if (current_solution_shop != length(unique(dataset$Shop)))
return(0) else return(-current_solution_savings)
}
#Run GA Algorithm with 100 iterations
iter = 100
GAmodel <- rbga.bin(size = genes, popSize = 200, iters = iter, mutationChance = 0.01,
elitism = T, evalFunc = evalFunc)
cat(summary.rbga(GAmodel))
我认为current_solution_shop != length(unique(dataset$Shop))
条件已经足够了,但不幸的是它不是,有时它仍然会分配同一家餐馆两次。
答案 0 :(得分:1)
如果您尝试将每个商店分配到一个中心并且不允许将多个商店分配到特定中心,那么这称为分配问题,并且可以以有效的方式完全解决使用线性编程。
以下是使用lp.assign
包中的lpSolve
函数的方法:
# Cost matrix (shops as rows, centers as columns)
(dist.mat <- matrix(dat$Distance, nrow=3))
# [,1] [,2] [,3]
# [1,] 700 400 600
# [2,] 200 100 500
# [3,] 300 150 200
# Solve the assignment problem
library(lpSolve)
sol <- lp.assign(dist.mat, "min")
sol$solution
# [,1] [,2] [,3]
# [1,] 0 1 0
# [2,] 1 0 0
# [3,] 0 0 1
sol$objval
# [1] 800
最佳解决方案将商店A分配给中心2,将商店B分配到中心1,将商店C存储到中心3,费用为800.