R语言基于正整数排列输入的目标函数优化方案咨询
问题本质与GenSA报错原因
你的需求属于排列优化问题,核心是在1~n的无重复全排列中找到目标函数值最大的解。你之前用GenSA出错是因为GenSA是面向连续域优化的模拟退火工具,本身不支持「每个整数仅出现一次、覆盖全部输入值」的排列约束,输出非整数、重复值是工具适配性问题,不是操作错误。
现有GA方案的合理性
你找到的GA包type='permutation'的实现完全适配你的需求:
- 该参数专门为排列类优化设计,自动保证输出是1到upper值的无重复全排列,完全符合vec的输入要求
- 你的示例写法逻辑正确,只是针对更大体量数据需要调整参数提升效率:
- 把
maxiter调整到50~200(根据收敛情况调整) - 增加
popSize参数,一般设为排列长度的2~3倍 - 增加
elitism=2配置,保留每一代的最优个体,避免最优解丢失
- 把
更大体量数据的适配工具推荐
如果你的实际数据排列长度超过100,推荐换用adagio包的permutationSA函数:
- 它是专门针对排列优化的模拟退火实现,相比遗传算法内存占用更低,大规模排列下收敛速度更快
- 调用逻辑简单,只需传入初始排列、目标函数、排列长度即可,不需要额外配置约束
目标函数优化建议
你现有function_1里的df3<<-df2全局赋值和print(df2)语句会严重拖慢迭代速度,建议删除,仅保留return(sum(df2$Revenue_Penalized))逻辑,寻优效率能提升30%以上。另外你示例中function_1(df)的调用是错误的,需要传入vec类型的参数才能正常运行。
内容的提问来源于stack exchange,提问作者jsimpsno
相关产品推荐
相关产品推荐

