R中遗传算法的广义分配问题
Generalized Assignment Problem with Genetic Algorithms in R
如何在 R 中实现广义分配问题:https://en.wikipedia.org/wiki/Generalized_assignment_problem to be solved with Genetic Algorithms https://cran.r-project.org/web/packages/GA/GA.pdf。
我有一个代码的工作示例,但它不工作:
require(GA)
p <- matrix(c(5, 1, 5, 1, 5, 5, 5, 5, 1), nrow = 3)
t <- c(2, 2, 2)
w <- c(2, 2, 2)
assigment <- function(x) {
f <- sum(x * p)
penalty1 <- sum(w)*(sum(t)-sum(w*x))
penalty2 <- sum(w)*(1-sum(x))
f - penalty1 - penalty2
}
GA <- ga(type = "binary", fitness = assigment, nBits = length(p),
maxiter = 1000, run = 200, popSize = 20)
summary(GA)
您对适应度函数的定义似乎有问题,即 assigment()
函数。
x
是一个二进制向量,而不是理论上的矩阵,因此 sum(x * p)
没有按照您的预期进行(请注意 x
的长度为 9 并且 p
在你的例子中是一个 3x3 矩阵);
penalty2
项未正确考虑对 x_{ij} 之和的约束;
penalty1
和 penalty2
的惩罚应该不同,第一个是不等式(即 <=),而第二个是严格相等(即 =)。
w
定义为向量,但应该是与x
大小相同的矩阵
如何在 R 中实现广义分配问题:https://en.wikipedia.org/wiki/Generalized_assignment_problem to be solved with Genetic Algorithms https://cran.r-project.org/web/packages/GA/GA.pdf。
我有一个代码的工作示例,但它不工作:
require(GA)
p <- matrix(c(5, 1, 5, 1, 5, 5, 5, 5, 1), nrow = 3)
t <- c(2, 2, 2)
w <- c(2, 2, 2)
assigment <- function(x) {
f <- sum(x * p)
penalty1 <- sum(w)*(sum(t)-sum(w*x))
penalty2 <- sum(w)*(1-sum(x))
f - penalty1 - penalty2
}
GA <- ga(type = "binary", fitness = assigment, nBits = length(p),
maxiter = 1000, run = 200, popSize = 20)
summary(GA)
您对适应度函数的定义似乎有问题,即 assigment()
函数。
x
是一个二进制向量,而不是理论上的矩阵,因此sum(x * p)
没有按照您的预期进行(请注意x
的长度为 9 并且p
在你的例子中是一个 3x3 矩阵);penalty2
项未正确考虑对 x_{ij} 之和的约束;penalty1
和penalty2
的惩罚应该不同,第一个是不等式(即 <=),而第二个是严格相等(即 =)。w
定义为向量,但应该是与x
大小相同的矩阵