R语言多目标约束优化中逻辑约束条件的正确指定与问题排查
问题原因
- 上下界参数写法错误,参数取值范围完全不符合预期
你调用nsga2时的lower.bounds和upper.bounds参数误用了rep()函数:rep()的语法是rep(待重复值, 重复次数),你写的rep(80,80,80,80, 100,200,300)实际生成的是长度为80的全80向量,取前7位作为7个参数的下限时,所有参数的下限都是80,完全不符合你预期的x5下限100、x6下限200、x7下限300的要求;上界参数存在完全相同的错误,导致x5上限120、x6上限120、x7上限120,和你预期的范围完全不符,自然会大量出现违反x5≤x6≤x7等约束的解。 - 约束函数返回值格式不规范
mco包的nsga2要求约束函数返回数值型向量,每个元素≥0代表对应约束满足,<0代表违反。你当前返回的是逻辑型向量,虽然R会隐式转换为1/0数值,但无法体现违反约束的程度,会影响算法对不可行解的筛选效率。
修复方案
1. 修正上下界参数
直接用c()拼接7个参数对应的上下限,不要误用rep():
optimization <- nsga2(funct_set, idim = 7, odim = 4 , constraints = restrictions, cdim = 4, generations=150, popsize=100, cprob=0.7, cdist=20, mprob=0.2, mdist=20, # 修正后下界:x1-x4为80,x5为100,x6为200,x7为300 lower.bounds = c(80, 80, 80, 80, 100, 200, 300), # 修正后上界:x1-x4为120,x5为200,x6为300,x7为400 upper.bounds = c(120, 120, 120, 120, 200, 300, 400) )
修正上下界后,x5≤x6≤x7的约束已经被边界自动满足,几乎不会再出现这类违反情况。
2. 优化约束函数格式
调整约束函数返回数值型的约束违反度,提升算法筛选效率:
restrictions <- function (x) { x1 <- x[1]; x2 <- x[2]; x3 <- x[3]; x4 <- x[4]; x5<- x[5] ; x6 <- x[6]; x7 <- x[7] restrictions <- numeric(4) restrictions[1] <- x3 - x1 restrictions[2] <- x4 - x2 restrictions[3] <- x7 - x6 restrictions[4] <- x6 - x5 return (restrictions) }
3. 可选参数调整
如果仍有少量违反约束的解,属于进化算法的正常现象(算法会保留少量不可行解维持种群多样性),可以适当调大generations到200-300,或者调大popsize到200,提升可行解的占比。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

