'至少有一个选择'遗传算法约束

时间:2015-02-05 15:48:03

标签: r constraints mathematical-optimization genetic-algorithm

我刚开始使用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))条件已经足够了,但不幸的是它不是,有时它仍然会分配同一家餐馆两次。

编辑:Facility Location Problem看起来像是我需要研究的东西,但任何人都可以为R或Python推荐多设施方法吗?

1 个答案:

答案 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.