【问题标题】:Contraints Satisfaction Prob (CSP) R约束满足问题 (CSP) R
【发布时间】:2012-05-06 07:34:26
【问题描述】:

我有一个包含多个等式和不等式的线性问题。它存在无限的解决方案。我想找到这个系统的多重随机解来改进遗传算法的初始种群。

有没有人知道如何用 R 做到这一点?

感谢您的宝贵时间,

查尔斯

【问题讨论】:

    标签: r optimization genetic-algorithm


    【解决方案1】:

    一些优化功能允许您指定起点: 通过选择随机起点,您应该有不同的解决方案。

    也可以修改问题:在目标函数中, 将距离添加到某个随机点。

    library(Rsolnp)
    get_one_point <- function(...) {
      r <- NULL
      while( is.null(r) || r$convergence != 0 ) {
        x <- rnorm(2)
        r <- solnp( 
          rnorm(2), 
          # Minimize the distance to some point
          function(u) sum((u-x)^2),
          # Constraints we want to satisfy
          ineqfun = function(u) c(sum(u^2), u[2] - u[1]^2),
          ineqLB = c(1,0),
          ineqUB = c(2,5)
        )
      }
      r$pars
    }  
    
    # Plot the points and the constraints
    library(parallel) # Very slow: run the optimizations in parallel
    x <- mclapply( 1:10, get_one_point, mc.cores=detectCores() )
    x <- do.call(rbind, x)
    plot(x, 
      xlim=c(-2,2), ylim=c(0,2), 
      pch=15, cex=1.5, asp=1, las=1,
      xlab="", ylab=""
    )
    curve(x^2, add=TRUE)
    curve(sqrt(1-x^2), add=TRUE)
    curve(2*sqrt(1-x^2/4), add=TRUE)
    

    我只使用了Rsolnp,因为它允许我指定约束 作为函数:如果你有一个线性问题 并使用欧几里得距离, 问题变成二次方程,可以用 solve.QP 来自 quadprog 包。

    您还可以使用 L^1 范数(即绝对值): 然后可以将问题重新表述为线性问题。

    【讨论】:

    • 实际上,我的目标函数是具有等式和不等式约束的非线性非凸函数。我使用来自 Rsolnp 的 gosolnp() 来解决它。但我只找到最佳解决方案,即我的函数的局部最小值,它需要时间(10 分钟),这对我来说太多了。这就是我现在使用 genoud() 的原因,但所需的时间是....很大。所以,我正在努力改善我的初始人口,快速找到很多可接受的解决方案......
    • 如果您的约束相对简单,您可以将目标函数替换为到某个随机点的距离:这将为您提供可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多