【问题标题】:Julia: global constrained optimization by minimizing an objective functionJulia:通过最小化目标函数进行全局约束优化
【发布时间】:2017-10-11 23:04:24
【问题描述】:

我是 JULIA 语言的新手,我正在尝试通过优化 P1 和 P2 最小化目标函数 RMSE 来执行带约束的全局优化。我尝试运行 JumpP 算法,但收到很多错误。如果您能向我推荐一个可行的软件包或帮助我修复我的错误,我将不胜感激?

using CSV
using JuMP, Ipopt
using Optim
using JuMP  
using GLPKMathProgInterface 


function READING()
   cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
   table1 = CSV.read("table3.6.csv")
   Datas = Array(table1[1])
   Ydata = Array(table1[2])
   println( Datas, Ydata)
   return Datas, Ydata
end

function RMSE(Datas, P1,P2)
   ParticleSize(Datas, P1,P2) = (1.+(P1./Datas).^P2).^(-(1.-2./P2))
   RMSE(P1,P2) = sum(((ParticleSize(Datas, P1,P2) - Ydata)).^2.)
   result = RMSE3(P1,P2)
   return result
end

function FITTING2()
   Datas, Ydata = READING()
   println("read")
   myModel = Model(solver=GLPKSolverLP())

   @variable(myModel, P2 <= 1) 
   @variable(myModel, 2 <= P1) 

   JuMP.register(myModel, :RMSE, 2, RMSE, autodiff=true)
   @NLobjective(myModel, Min, RMSE(Datas, P1, P2))

   solve(myModel) # solves the model
   println("End")
end

FITTING2()

控制台中的错误消息

LoadError: MethodError: no method matching getname(::Int64

我已经按照说明进行了一些更改,但仍然无法正常工作。我在下面复制它以防有人可以提供帮助。这种优化的任何替代方法都将受到欢迎。非常感谢!

function READING()
    cd("\\\\RichardHadlee\\user1\\GalvezJ\\Documents\\JULIAPRO")
    table1 = CSV.read("table3.6.csv")
    Datum = Array(table1[1])
    Ydata = Array(table1[2])
    global Datum, Ydata
    return Datum, Ydata
end

function RMSE_Error(P1,P2)
  global Datum, Ydata

  RMSE_Sum = 0.0
  Len_Datum = length(Datum)
  for i in 1:Len_Datum
     println(i," " ,Datum[i])
     ParticleSize(Datum,P1,P2) = (1.0+(P1/Datum[i])^P2)^(2/P2-1)
     println("PS ", ParticleSize(Datum,P1,P2))
     RMSE(P1,P2, Datum, Ydata) = (ParticleSize(Datum,P1,P2) - Ydata[i])^2.0
     RMSE_Sum = RMSE_Sum + RMSE(P1,P2, Datum, Ydata)
  end
  println("RMSE=", RMSE_Sum)
  return RMSE_Sum
end

function FITTING()
   Datum, Ydata = READING()
   println("read")
   myModel = Model(solver=GLPKSolverLP())
   @variable(myModel, P1 <= 1.) 
   @variable(myModel, P2 >= 2.) 
   JuMP.register(myModel, :RMSE_Error, 2, RMSE_Error, autodiff=true)
   @NLobjective(myModel, Min, RMSE_Error( P1, P2))
   solve(myModel) # solves the model
end

FITTING()

我设法找到了解决方案。如果没有更好的选择,我会坚持下去。谢谢!

using BalckBoxOptim

function sqerror(p, Datum, Ydata)

  println( p[1]," " ,p[2])
  err = 0.0
  for i in 1:length(Datum)
    pred_i =  (1.0+(p[1]/Datum[i])^p[2])^(2.0/p[2]-1.0)
    err += (Ydata[i] - pred_i)^2
   end
   println("Error: ", err)
   return err
 end

function Testing()
  Datum, Ydata = READING()
  res = bboptimize(p ->sqerror(p, Datum, Ydata); SearchRange = [(0.0001, 100.0), (2., 100.)], NumDimensions = 2, MaxSteps=5000000)
 end


Testing()

【问题讨论】:

  • 这些天对我来说没有太多的 julia 编程,但这里有一些问题是显而易见的:(1)JuMP.register() 需要一个参数来标记预期有多少输入。你给了 2,而你的函数需要 3。 (2) 你让 JuMP 使用 GLPKSolverLP,它用于线性规划。这对您的问题不起作用,即使 (1) 已修复(ipopt 是这里的候选者)。 if you could suggest me a package that works:当我稍微使用 julia 时,JuMP 是我见过的最强大的数学编程库(除了 convejl;其他场景)。如果使用正确,JuMP 可以工作。
  • 啊和 (3):JuMP 说:用户定义函数的所有参数都必须是标量。对于 Datas 来说当然不是这样,它甚至不是一个 opt 变量。 (4) 我怀疑你需要更多的经验。我希望您知道自己在做什么(使用 JuMP),而不是例如 Optim.jl(后者对我来说更有吸引力,因为您的问题只是不受约束/有界约束)。
  • 您的编辑忽略了我对您的方法的 50% 的抱怨,您甚至没有发布 现在 发生的错误/问题。

标签: optimization julia mathematical-optimization julia-jump


【解决方案1】:

defining bounded @variables 时,变量名必须出现在不等式的左侧(或链式比较的中间)。尝试将P1 的顺序交换为:

@variable(myModel, P1 >= 2)

【讨论】:

  • 这是一个已知的限制和尴尬——请参阅JUMP.jl#1072了解更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多