当前位置: 首页 > 知识库问答 >
问题:

遗传算法优化

羊舌和安
2023-03-14

几周前,我问了一个关于如何在R中进行优化(使用Optimize R优化向量)的问题。现在我已经掌握了R中的基本优化,我想开始使用遗传算法来解决问题。

考虑到目标函数:

div.ratio <- function(weight, vol, cov.mat){
  weight <- weight / sum(weight)
  dr <- (t(weight) %*% vol) / (sqrt(t(weight) %*% cov.mat %*% (weight)))  
  return(-dr)
}

我使用genalg软件包进行优化,特别是“rbga.bin”函数。但问题是一个人似乎不能传递多个参数,即不能传递vol和cov。小地毯是我遗漏了什么,还是理解错误了。

编辑:在genalg包中,有一个名为rbga的函数。垃圾箱就是我用的那个。

下面是上一个问题的简单代码,可以让你开始:

rm(list=ls())
require(RCurl)
sit = getURLContent('https://github.com/systematicinvestor/SIT/raw/master/sit.gz',     binary=TRUE, followlocation = TRUE, ssl.verifypeer = FALSE)
con = gzcon(rawConnection(sit, 'rb'))
source(con)
close(con)
load.packages('quantmod')


data <- new.env()

tickers<-spl("VTI,VGK,VWO,GLD,VNQ,TIP,TLT,AGG,LQD")
getSymbols(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T)
for(i in ls(data)) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)

bt.prep(data, align='remove.na', dates='1990::2013')

prices<-data$prices[,-10]  
ret<-na.omit(prices/mlag(prices) - 1)
vol<-apply(ret,2,sd)
cov.mat<-cov(ret)

out <- optim(par     = rep(1 / length(vol), length(vol)),  # initial guess
         fn      = div.ratio,
         vol     = vol,
         cov.mat = cov.mat,
         method  = "L-BFGS-B",
         lower   = 0,
         upper   = 1)

opt.weights <- out$par / sum(out$par) #optimal weights

虽然上面的optim函数工作得很好,但我在想,是否可以使用GA算法重现这个函数。因此,在未来,如果我在搜索多个目标,我将能够比GA更快地完成这项任务(我不确定它是否更快,但这是找到答案的步骤)

GAmodel <- rbga.bin(size = 7, #genes
popSize = 200, #initial number of chromosomes
iters = 100, #number of iterations
mutationChance = 0.01, #chance of mutation
evalFunc = div.ratio) #objective function

做上述操作似乎会产生错误,因为div.ratio需要额外的参数,所以我正在寻找一些帮助来构建我的问题,以便它能够产生最佳答案。我希望上面的编辑能澄清问题。

谢谢

共有1个答案

潘哲
2023-03-14

这就是你所需要的:

GAmodel <- rbga(stringMin=rep(0, length(vol)), stringMax=rep(1, length(vol)),
popSize = 200,
iters = 100,
mutationChance = 0.01,
evalFunc = function(weight) div.ratio(weight, vol=vol, cov.mat=cov.mat))

(见上文第一行和最后一行)。

问题是:

>

  • 向量权重体积必须匹配长度。

    函数evalFunc使用单个参数调用,导致其他参数丢失。据我所知,您只想在权重向量中进行优化,保持volcov。mat已修复。

    如果希望将权重视为连续变量,则使用rbga代替。

  •  类似资料:
    • 在程序里生宝宝, 杀死不乖的宝宝, 让乖宝宝继续生宝宝 所有的遗传算法 (Genetic Algorithm), 后面都简称 GA, 我们都需要一个评估好坏的方程, 这个方程通常被称为 fitness 在 GA 中有基因, 为了方便, 我们直接就称为DNA吧. GA 中第二重要的就是这DNA了, 如何编码和解码DNA, 就是你使用 GA 首先要想到的问题. 传统的 GA 中,DNA我们能用一串二进

    • 希望这是有意义的,我基本上是在寻找一些关于如何开始在Python 3中处理这个任务的见解。提前感谢您能提供的任何东西!

    • 参考资料:http://blog.csdn.net/b2b160/article/details/4680853/(冒昧的用了链接下的几张图) 百度百科:http://baike.baidu.com/link?url=FcwTBx_yPcD5DDEnN1FqvTkG4QNllkB7Yis6qFOL65wpn6EdT5LXFxUCmv4JlUfV3LUPHQGdYbGj8kHVs3GuaK 算法介绍

    • 我正在尝试用实数遗传算法初始化我的种群。npop是我的人口规模。我创建了一个包含npop行和2列的矩阵。我想用第一列(0,5)和第二列(7,14)之间的随机数填充这个矩阵。问题是,每当我运行这个函数时,我得到的矩阵中充满了零,我有任何语法或逻辑错误吗?

    • 我目前正在做激光切割的过程优化——在MATLAB中。我试图将工艺参数与切割质量联系起来,例如: 输入(工艺参数) 切割速度 激光功率 辅助气体压力 输出(质量参数) 切割深度 切割宽度 我首先训练一个神经网络模型,以便根据工艺参数预测切削质量。 这很好,现在我对表演不感兴趣。 接下来我想使用遗传算法优化(最大化)输入参数切割速度。这意味着我的适应度函数(目标函数)是1/切割速度。 我为我的适应度函

    • 问题内容: 我想 用Java 实现一些简单的 遗传算法 。 到目前为止,我只找到了 JGAP 。有人对此有经验吗?您知道GA的其他Java库吗? 我不想像用Java用GA编写那样自己编写它,而必须使用Java,那么什么是最活跃的基因编程库?也没有帮助。 问题答案: 我写了《钟表匠框架》,因此我的观点并不偏颇。 ECJ和JGAP是最成熟的两个选项,也许是最全面的选项。另一方面,它们的年龄意味着它们以