2014-11-23 2 views
2

У меня есть следующая простая задача, которую я хочу решить с NLopt:NLopt ошибка Юлии и Ipopt альтернативы

using JuMP 
using NLopt 

""" 
min_x = x1 * x4* (x1 + x2 + x3) + x3 

s.t. 
x1 * x2 * x3 * x4 >= 25 
x_1^2 + x_2^2 + x_3^2 + x_4^2 = 40 
1 <= x1,x2,x3,x4 <= 5 

starting values: vec(x) = (x1 = 1, x2 = 5, x3 = 5, x4 = 1) 
""" 


tic() 

m = Model(solver=NLoptSolver(algorithm=:LD_MMA)) 


@defVar(m, 1 <= x1 <= 5) 
@defVar(m, 1 <= x2 <= 5) 
@defVar(m, 1 <= x3 <= 5) 
@defVar(m, 1 <= x4 <= 5) 

@setNLObjective(m, Min, x1 * x4 * (x1 + x2 + x3) + x3) 
@addNLConstraint(m, x1^2 + x2^2 + x3^2 + x4^2 == 40) 
@addNLConstraint(m, x1 * x2 * x3 * x4 >= 25) 

setValue(x1, 1) 
setValue(x2, 5) 
setValue(x3, 5) 
setValue(x4, 1) 

status = solve(m) 

println("got ", getObjectiveValue(m), " at ", [getValue(x1),getValue(x2), getValue(x3), getValue(x4)]) 

toc() 

Однако я получаю ошибку аргумент. Есть ли способ сделать эту работу с NLopt, и если не так, как этот код может измениться, чтобы использовать его с другими бесплатными оптимизаторами, которые могут быть установлены в Julia (возможно, Ipopt, но не Gurobi)?

+0

Может вы публикуете сообщение об ошибке? – IainDunning

+0

ОШИБКА: ArgumentError («недопустимые аргументы NLopt») в chk at (путь NLopt) в push at array.jl: 458 в ограничении равенства! at (путь NLopt) во время загрузки (my_file) – Echetlaeus

ответ

1

Ну, я не смог решить проблему, используя NLopt, но вместо этого мне удалось решить ее с помощью Ipopt.

Решение прост для использования Ipopt. Во-первых, вам нужно загрузить Ipopt (я использовал версию Windows на данный момент, и я также попробую в Linux) с этого site и поместите его в путь (если вы поместите его в путь и перейдите в командную строку и введите ipopt, он должен не показывать ошибку - на самом деле будет показано ipopt опций). Просто идите в самом конце, чтобы найти новейшую версию.

Тогда я sliglty изменил код, который я предоставил, прежде чем объяснить Ipopt таким образом:

using JuMP 

using Ipopt 


""" 
The problem that I want to solve has 4 variables and 6 constraints. 
It is the following: 


min_x = x1x4(x1+x2+x3) + x3 


s.t. 

x1*x2*x3*x4 >= 25 
x_1^2 + x_2^2 + x_3^2 + x_4^2 = 40 
1 <= x1,x2,x3,x4 <= 5 


starting values: x0 = (x1 = 1, x2 = 5, x3 = 5, x4 = 1) 
""" 


tic() 


m = Model(solver=IpoptSolver()) 


@defVar(m, 1 <= x1 <= 5) 
@defVar(m, 1 <= x2 <= 5) 
@defVar(m, 1 <= x3 <= 5) 
@defVar(m, 1 <= x4 <= 5) 


@setNLObjective(m, Min, x1 * x4 * (x1 + x2 + x3) + x3) 
@addNLConstraint(m, x1^2 + x2^2 + x3^2 + x4^2 == 40) 
@addNLConstraint(m, x1 * x2 * x3 * x4 >= 25) 


setValue(x1, 1) 
setValue(x2, 5) 
setValue(x3, 5) 
setValue(x4, 1) 

status = solve(m) 

println("got ", getObjectiveValue(m), " at ", [getValue(x1),getValue(x2), 
getValue(x3), getValue(x4)]) 

toc() 

Более подробную информацию о правильном названии решателей и т.д., можно найти здесь: https://jump.readthedocs.org/en/latest/installation.html#getting-solvers

+3

'Pkg.add (« Ipopt »)' фактически установит Ipopt автоматически и будет готов для использования с Julia. – IainDunning

+0

Чтобы следить за комментарием Иэна, интерфейс Ipopt.jl не использует исполняемый файл командной строки ipopt. Не нужно настраивать его вручную. – mlubin

Смежные вопросы