0

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

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()
4

1 回答 1

2

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

@variable(myModel, P1 >= 2)
于 2017-10-11T23:32:24.383 回答