DianaOptimization: rosenbrock.py

File rosenbrock.py, 3.1 KB (added by gogolenk, 16 years ago)

Minimization of Rosenbrock's function

Line 
1# ------------------------------------------------------------------
2#  Diana process modelling, simulation and analysis software
3#  Copyright (c) 2006, Sergiy Gogolenko
4#  e-mail: gogolenk@mpi-magdeburg.mpg.de
5#  All rights reserved.
6# ------------------------------------------------------------------
7#  $Id: rosenbrock.py Fri Aug 11 13:38:55 2006 gogolenk $
8# ------------------------------------------------------------------
9#  Written under: i586-suse-linux
10# ------------------------------------------------------------------
11#  Last update: Fri Aug 11 13:38:55 2006
12# ------------------------------------------------------------------
13#  Description:
14#   Simple example of using DIANA in order to find minimum of
15#  Rosenbrocks' function (10 unknowns) with deterministic
16#  optimizer (in this case LBFGS-solver).
17
18__author__ = "Sergiy Gogolenko (gogolenk@mpi-magdeburg.mpg.de)"
19__version__ = "@PACKAGE_VERSION@"
20__date__ = "$Date: Fri Aug 11 13:38:55 2006 $"
21__copyright__ = "Copyright (c) 2006 Sergiy Gogolenko"
22__license__ = ""
23
24import diana, sys
25from math import *
26
27optimizerName = "lbfgsb" # "direct"
28
29# initialize Diana main class
30dmain = diana.GetDianaMain(sys.argv)
31
32# create LBFGSB-optimizer
33sfactory = dmain.GetSolverFactory()
34solver = sfactory.CreateSolver(diana.CAPE_NLP, None, optimizerName)
35
36# specify list of sought parameters
37sp = []
38for i in range(10):
39    sp.append(diana.DianaNLPRealParameterSpec
40              ("x"+str(i+1), "x"+str(i+1), 2, -512, 512, 0.001))
41
42# create task
43task=diana.BasicNLPTask(sp)
44
45# define objective
46def objfunc_Rosenbrock(task):
47    pars = task.GetNLPParameters()
48    par = pars.GetParameterValue(0)
49    objfunc = 0.
50    for i in xrange(pars.GetParametersCount()-1):
51        par_next = pars.GetParameterValue(i+1)
52        objfunc += 100*((par_next - par**2)**2) + ((par-1)**2)
53        par = par_next
54    return objfunc
55
56# assign objective with task
57task.SetObjFunction(objfunc_Rosenbrock)
58task.Initialize()
59print "Rosenbrock task initialized"
60
61# create report
62report = dmain.CreateReportingInterface(optimizerName)
63
64# set parameters for reporting
65pars_rep = report.GetParameters()
66pars_rep["Author"].SetValue("MG")
67pars_rep["OutputFolder"].SetValue("./report")
68pars_rep["ConsoleOutput"].SetValue(True)
69
70report.Initialize()
71print "Report initialized"
72
73# assign prepared task and report to solver
74solver.SetReportingInterface(report)
75solver.SetNLPTask(task)
76solver.Initialize()
77print "LBFGSB optimizer initialized"
78
79# start optimization
80print "Rosenbrock function (%i parameters) optimization..." \
81      % (task.GetSoughtParameters().Count())
82try:
83    solver.Solve()
84except:
85    print "Solving error"
86pars_opt = solver.GetParameters()
87print '#'*80
88print "Found minimum:                   ", \
89      pars_opt["MinObjFunc"].GetValue()
90print "Total amount of objective calls: ", \
91      pars_opt["TotalEvalsCount"].GetValue()
92print "Total amount of iterations:      ", \
93      pars_opt["CurrIteration"].GetValue()
94print "Total execution time:             %s sec" % \
95      pars_opt["TotalTimeOfWork"].GetValue()
96print '#'*80
97print "Solution: ", solver.GetSolution()
98print '#'*80
99