R中具有多个约束的遗传算法适应度函数

时间:2017-11-26 05:43:30

标签: r genetic-algorithm

该方案是一种卡车优化程序,可以最大化卡车总重量,同时保持在最大允许重量之下,并且还可以观察物品级别的堆叠限制。

例如,考虑一个小容器,可容纳12个盒子(底部有6个盒子“脚印”,6个盒子堆放在那些盒子顶部)。总重量不能超过12磅。每个项目(框)都有一个需要考虑的特定规则,它表明它是否可以支持任何权重,如果是,那么多少。

library(GA)

# Item-Level Data
item_dat <- data.frame(order = c(rep("A",2), rep("B",3), rep("C",3)),
                   weight = c(4,5,1,1,1,2,2,2),
                   ft.print = c(1,1,1,1,1,1,1,1),
                   rule = c(rep("supports nothing",5), rep("supports <= own weight",2), "no constraint"))

> item_dat
  order weight ft.print                   rule
1     A      4        1       supports nothing
2     A      5        1       supports nothing
3     B      1        1       supports nothing
4     B      1        1       supports nothing
5     B      1        1       supports nothing
6     C      2        1 supports <= own weight
7     C      2        1 supports <= own weight
8     C      2        1           no constraint

我已经能够编写代码以在聚合标题级别进行优化,但是在编写可以在项目级别评估的适应度函数时考虑到每个项目的堆叠规则是不成功的。

# Aggregated Item-Level Data
header_dat <- aggregate(cbind(weight, ft.print) ~ order, item_dat, sum)

> header_dat
  order weight ft.print
1     A      9        2
2     B      3        3
3     C      6        3

# Constraints
max_weight <- 12
max_ft_prints <- 12

# Fitness function
eval_func <- function(x) {
    cur_wgt <- x %*% header_dat$weight
    cur_ft_print <- x %*% header_dat$ft.print

    # If overweight or over foot print space
    if(cur_wgt > max_weight | cur_ft_print > max_ft_prints) {
        return(0) 
    } else {
        return(cur_wgt)
    }
}

ga(type = "binary", nBits = nrow(header_dat), fitness = eval_func, min = 1, max = nrow(header_dat))@solution[1, ]

GA | iter = 100 
Mean = 11.1 | Best = 12.0 
x1 x2 x3 
 1  1  0 

输出正确地使用标题级别的权重和轮廓线将订单A和B正确分配在一起,但如果它能够考虑项目堆叠规则,则会因为没有任何项目能够支持任何权重而取消分组资格

正确的输出将是订单B&amp; C组合在一起,单独A。

我已经尝试将第二个项目级别的适应度函数传递给标题级别“eval_func”,但到目前为止还没有任何内容甚至接近。我不清楚如何根据每个订单中可以支撑的重量来考虑每个订单中的项目,同时最大化卡车的总重量。

更新

经过一些额外的研究,我开始认为解决方案将属于多目标组合优化的范畴。问题在于旅行推销员或班次调度类型的任务领域,而不是上面的背包类型。额外的目标(约束)似乎需要在每次迭代时在头级别的eval函数中再次调用单独的函数或某种查找包含。

仍然希望那里的某个地方可以指向我的方向。谢谢。

0 个答案:

没有答案