用Genalg实现R中的整数规划

用Genalg实现R中的整数规划,r,optimization,genetic-algorithm,integer-programming,R,Optimization,Genetic Algorithm,Integer Programming,我试图用genalg包解决R中的一个问题,特别是这个包,因为我需要一个可以理解的GA包 问题是我必须在城市附近建造消防站,但我的目标是尽量减少消防车的数量。它们之间的距离不得超过15分钟。这些数据表明每个城市之间的距离。我对每个城市进行了限制,并在excel中运行了IP,因此我知道答案应该是什么。我对约束进行了注释,因为我不知道如何将它们与用于存储遗传算法中求解的染色体的变量相关联。我还添加了一个惩罚,以使值与约束保持一致。如果有人知道genalg除了CRAN的书之外还有一本很好的教程,我将非常

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

问题是我必须在城市附近建造消防站,但我的目标是尽量减少消防车的数量。它们之间的距离不得超过15分钟。这些数据表明每个城市之间的距离。我对每个城市进行了限制,并在excel中运行了IP,因此我知道答案应该是什么。我对约束进行了注释,因为我不知道如何将它们与用于存储遗传算法中求解的染色体的变量相关联。我还添加了一个惩罚,以使值与约束保持一致。如果有人知道genalg除了CRAN的书之外还有一本很好的教程,我将非常感谢任何帮助

代码如下:

#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)
#初始化库
图书馆(genalg)
#插入数据
#设定目标
#最小化x1、x2、x3、x4、x5、x6的总和
datat=data.frame(城市1=c(0,10,20,30,30,20),
城市2=c(10,0,25,35,15,30),
城市3=c(20,25,0,15,30,20),
城市4=c(30,35,15,0,15,25),
城市5=c(30,15,30,15,0,14),
城市6=c(20,30,20,25,14,0))
系数=c(0,10,15,15,14,0)
#约束条件
#添加惩罚以运行函数
#怎么做??将x与定义的变量关联
#失败的应用程序1 x作为列表
#2 x作为一个等于6个变量的变量
#3使用x索引代替(零长度?)
#4将点积更改为大于0的变量
#5
evalFun=函数(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
#如果(x5+x6<1)
##返回(0)
#x[5]=1

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

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

x56可能检查谢谢你的建议,我以前在处理背包问题时确实检查过。我发现解决方法是以向量的形式进行约束。不过谢谢你的帮助。