Юля: глобальная оптимизация с ограничениями за счет минимизации целевой функции

Я новичок в языке JULIA, и я пытаюсь выполнить глобальную оптимизацию с ограничениями, минимизируя целевую функцию RMSE путем оптимизации P1 и P2. Я попытался запустить алгоритм 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()

person Jesus    schedule 11.10.2017    source источник
comment
В наши дни для меня не так много julia-программирования, но здесь некоторые проблемы очевидны: (1) JuMP.register() нужен аргумент, чтобы отметить, сколько вводов ожидается. Вы дали 2, а ваша функция - 3. (2) Вы просите JuMP использовать GLPKSolverLP, предназначенный для линейного программирования. Это не сработает для вашей проблемы, даже если (1) будет отремонтирован (здесь кандидат ipopt). if you could suggest me a package that works: когда я немного использовал julia, JuMP была самой мощной библиотекой для математического программирования, которую я когда-либо видел (помимо convxjl; других сценариев). JuMP работает при правильном использовании.   -  person sascha    schedule 12.10.2017
comment
Ах и (3): JuMP говорит: все аргументы пользовательских функций должны быть скалярами. Это, конечно, не так для данных, которые даже не являются опт-переменной. (4) Я подозреваю, что вам нужно больше опыта. Надеюсь, вы знаете, что делаете (используя JuMP) вместо, например, Optim.jl (последний выглядит более привлекательным для меня, поскольку ваша проблема не ограничена / ограничена только ограничениями).   -  person sascha    schedule 12.10.2017
comment
Ваше изменение игнорирует 50% моих жалоб на ваш подход, и вы даже не опубликовали сообщение об ошибке / проблеме, возникающей сейчас.   -  person sascha    schedule 13.10.2017


Ответы (1)


Когда определяет ограниченные @variables, имя переменной должно отображаться слева - сторона неравенства (или в середине цепного сравнения). Попробуйте поменять местами P1 на:

@variable(myModel, P1 >= 2)
person mbauman    schedule 11.10.2017
comment
Это известное ограничение и неудобство - подробнее см. JUMP.jl # 1072 Детали. - person mbauman; 12.10.2017