Aby móc rozwiązać zadanie optymalizacyjne, należy ustalić funkcję celu i ograniczenia. Następnie należy:
W trakcie działania algorytm optymalizacji generują informacje dotyczące stanów początkowych, przejściowych i końcowych, na podstawie których można ocenić proces zbieżności. Informacje te mają postać ostrzeżeń:
Przykład 6.8. Rozwiązywanie zadanie optymalizacji
from biz.sc.math.opt import * from biz.sc.math.opt.alg import * from biz.sc.math.opt.nlf import * from biz.sc.math.opt.constraint import * from java.util import ArrayList from java.lang import System from biz.sc.math.opt.nlf import * class TestFunction(AbstractNLF): def __init__(self, dim, type): AbstractNLF.__init__(self, dim, type) print "Function dimension : ", dim print "Function type : ", type def evaluate(self, x, fx, gx, Hx): "@sig void evaluate(double[] x, double[] fx, double[] gx, double[][] Hx)" if (fx != None): fx[0] = x[0]*x[0]+x[1]*x[1]-2*x[1] if (gx != None): gx[0] = 2*x[0] gx[1] = 2*x[1]-2 if (Hx != None): Hx[0][0] = Hx[1][1] = 2 Hx[0][1] = Hx[1][0] = 0 constr = ArrayList() bounds = BoundConstraint([1, .5],[2,1]) constr.add(bounds) optMethod = BCNewtonMethod() f = TestFunction(2, NLF.NLF2) f.setInitVector([1.3,0.6]) opt = Optimizer(f, optMethod, constr) opt.setMinimize(); opt.setOutput(sys.stdout, FALSE) # optimization information on standard output, false means without debug data res = opt.optimize() print res
Wynik:
Function dimension : 2 Function type : 2 ********************************************************** OPT++ version 2.1 Job run at Tue Sep 19 15:04:22 2006 ********************************************************** readOptInput: No opt.input file found readOptInput: default values will be used ========= Initial state =========== i xc grad fcn_accrcy 1 1.3 2.6 2.22e-16 2 0.6 -0.8 2.22e-16 Function Value = 0.85 Norm of gradient = 2.72 ============================================== Bound constrained Newton Method with Line Search Iter F(x) ||grad|| ||step|| f/g 0 0.85 2.72 1 0.09467 2.093 0.3139 N 2 2 OptBCNewton : variable added to working set : 1 OptBCNewton: Current working set ----- variable index: 1 1 2 0 2 0.3077 N 3 3 checkConvg: gnorm = 0 gtol = 6.055e-06 OptBCNewton : variable added to working set : 2 OptBCNewton : reduced_grad_norm = 0 OptBCNewton: Current working set ----- variable index: 1 1 2 1 OptBCNewtonLike : convergence achieved. ========= Final state =========== Optimization method = Bound constrained Newton Dimension of the problem = 2 No. of bound constraints = 2 Return code = 4 (Gradient tolerance test passed) No. iterations taken = 2 No. function evaluations = 3 No. gradient evaluations = 3 ========== Tolerances =========== Machine Epsilon = 2.22045e-16 Maximum Step = 1000 Minimum Step = 1.49012e-08 Maximum Iter = 100 Maximum Backtracks = 5 Maximum Fcn Eval = 1000 Step Tolerance = 1.49012e-08 Function Tolerance = 1.49012e-08 Constraint Tolerance = 1.49012e-08 Gradient Tolerance = 6.05545e-06 LineSearch Tolerance = 0.0001 ========= Final state =========== i xc grad fcn_accrcy 1 1 2 2.22e-16 2 1 0 2.22e-16 Function Value = 0 Norm of gradient = 2 ============================================== array([1.0, 1.0], double)
W celu wyświetlenia w konsoli wszystkiego ustawienia algorytmu i procesu optymalizacji zalecane jest zastosowanie metody setOutput(System.out, FALSE) method klasy Optimizer.
W przypadku, gdy funkcja celu ma postać iloczynu kilku funkcji (np. funkcja Likelihood), lepiej jest minimalizować jej logarytm.
W przypadku metod z więzami (wszystkie metody BC), punkt startowy musi być wybrany w obszarze, w którym minimalizowana jest funkcja celu.