使用Genalg进行R中的整数规划

时间:2018-02-05 19:11:31

标签: r optimization genetic-algorithm integer-programming

我试图使用genalg包来解决R中的问题,特别是这个包,因为我需要一个可以理解的GA包。

问题是我必须在城市附近建造消防站,但我的目标是获得最少的救火车。它们之间的距离不得超过15分钟。数据表明每个城市彼此之间的时间。我已经为每个城市制定了限制并在excel中运行了IP,所以我知道答案应该是什么。我评论了这些约束,因为我无法弄清楚如何将它们与我用来存储在GA中解决的染色体的变量相关联。我还添加了一个惩罚,试图保持值与约束一致。如果有人知道除了CRAN书之外的genalg的好教程,我会感激任何帮助。

以下是代码:

#initilaize library
library(genalg)

#insert data

#set objective
#minimize the sume of x1,x2,x3,x4,x5,x6
datat = data.frame(city1 = c(0, 10, 20, 30, 30, 20), 
                   city2 = c(10, 0, 25, 35, 15, 30),
                   city3 = c(20, 25, 0, 15, 30, 20),
                   city4 = c(30, 35, 15, 0, 15, 25),
                   city5 = c(30, 15, 30, 15, 0, 14),
                   city6 = c(20, 30, 20, 25, 14, 0))

coeff = c(0, 10, 15, 15, 14, 0)

#constraints
#add in a penalty to run function
#how?? relate x to the defined variables
# Failed applications 1 x as a list
#2 x as a variable equal to 6 variables
#3 use x indices instead (zero length?)
#4 changed the dot product to a variable > 0
#5
evalFun = function(x){
  coefftot = x %*% coeff
  # x1 + x2 + x3 + x4 + x5 + x6 >= 1
  # x2 + x4 + x6 >= 2
  # x3 + x4 >= 1
  # x4 + x5 + x6 >= 2
  # x2 + x4 + x5 + x6 >= 3
  # x5 + x6 >= 1
  # if (x5 + x6 < 1) 
  #   #return(0)
  #   x[5] = 1
  if (coefftot <= 0) {
    return(0) else
      return(coefftot)

  }

}



#create function to create shortest path
lpiter = rbga.bin(size = 6,
                  popSize = 100,
                  iters = 100,
                  mutationChance = .01,
                  elitism = T,
                  evalFunc = evalFun)

1 个答案:

答案 0 :(得分:0)

为了将约束与问题中的变量联系起来,我将一个向量与约束相关联。然后我创建了一个方程来将它们联系起来。例如

  # x5 + x6 >= 1
  x56 <- c(0, 0, 0, 0, 1, 1)
  con56 <-  sum(x*x56)

可能有一种更简单的方法,但我以这种方式关联它们。如果有人有更高效的方式,我会听到它。当通过if语句运行时,替换将变为零,因此我假设有一个更有效的选项。