OBJ <- function(T, n, lambda) { integrand <- function(t, i) { (1.1^(i-1)) * lambda(t) } lambda <- function(t) { (1.6986/3110.396823) * ((t/3110.396823)^0.6986) } numerator <- (n-1) * 6050 + 2000 * sum(sapply(1:n, function(i) integrate(Vectorize(integrand), lower = 0, upper = T[i], i = i)$value)) + 13200 denominator <- sum(T) OBJ_value <- numerator / denominator return(OBJ_value) } n <- 5 T <- rep(1000, n) # 初始化Ti为相同值 library(pso) lower_bounds <- rep(0, n) # T的下界 upper_bounds <- rep(10000, n) # T的上界 fitness <- function(T) { OBJ_value <- OBJ(T, n, lambda) return(OBJ_value) } pso_control <- list(maxit =100) # 最大迭代次数 result <- psoptim(lower = lower_bounds, upper = upper_bounds, par = T, fn = fitness, control = pso_control) min_value <- result$value optimal_T <- result$par cat("最小值:", min_value, "\n") cat("对应的T值:", optimal_T, "\n")
时间: 2024-03-22 18:38:40 浏览: 58
这段代码存在一个问题,即在 `fitness` 函数中调用了 `lambda` 函数,但是这个函数的定义在 `OBJ` 函数之后。可以将 `lambda` 函数的定义放在 `OBJ` 函数之前,或者将 `lambda` 函数的定义移到全局环境中。另外,需要注意的是,`lambda` 函数的参数 `t` 是一个向量,而 `integrand` 函数中却以 `t` 为标量来调用 `lambda` 函数,这可能导致结果不正确。可以将 `integrand` 函数改为 `integrand <- function(t, i) { (1.1^(i-1)) * lambda(t[i]) }`。修改后的代码如下:
```
library(pso)
lambda <- function(t) {
(1.6986/3110.396823) * ((t/3110.396823)^0.6986)
}
OBJ <- function(T, n, lambda) {
integrand <- function(t, i) {
(1.1^(i-1)) * lambda(t[i])
}
numerator <- (n-1) * 6050 + 2000 * sum(sapply(1:n, function(i) integrate(Vectorize(integrand), lower = 0, upper = T[i], i = i)$value)) + 13200
denominator <- sum(T)
OBJ_value <- numerator / denominator
return(OBJ_value)
}
n <- 5
T <- rep(1000, n) # 初始化Ti为相同值
lower_bounds <- rep(0, n) # T的下界
upper_bounds <- rep(10000, n) # T的上界
fitness <- function(T) {
OBJ_value <- OBJ(T, n, lambda)
return(OBJ_value)
}
pso_control <- list(maxit =100) # 最大迭代次数
result <- psoptim(lower = lower_bounds, upper = upper_bounds, par = T, fn = fitness, control = pso_control)
min_value <- result$value
optimal_T <- result$par
cat("最小值:", min_value, "\n")
cat("对应的T值:", optimal_T, "\n")
```
阅读全文