| 1 | from scikits.openopt import NLP |
|---|
| 2 | from numpy import cos, arange, ones, asarray, abs, zeros, sqrt, asscalar |
|---|
| 3 | from pylab import legend, show, plot, subplot, xlabel, subplots_adjust |
|---|
| 4 | from string import rjust, ljust, expandtabs |
|---|
| 5 | N = 15 |
|---|
| 6 | M = 5 |
|---|
| 7 | f = lambda x: -(abs(x-M) ** 1.5).sum() |
|---|
| 8 | |
|---|
| 9 | x0 = cos(arange(N)) |
|---|
| 10 | |
|---|
| 11 | #c = lambda x: [2* x[0] **4-32, x[1]**2+x[2]**2 - 8] |
|---|
| 12 | global cc1, cc2, cc3 |
|---|
| 13 | |
|---|
| 14 | def c1(x): |
|---|
| 15 | global cc1 |
|---|
| 16 | cc1 += 1 |
|---|
| 17 | return 2* x[0] **4-32 |
|---|
| 18 | |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | def c2(x): |
|---|
| 22 | global cc2 |
|---|
| 23 | cc2 += 1 |
|---|
| 24 | return x[1]**2+x[2]**2 - 8 |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | def c3(x): |
|---|
| 28 | global cc3 |
|---|
| 29 | cc3 += 1 |
|---|
| 30 | return x[1]**2+x[2]**2 + x[3]**2 - 35 |
|---|
| 31 | |
|---|
| 32 | |
|---|
| 33 | c = [c1, c2, c3] |
|---|
| 34 | |
|---|
| 35 | h1 = lambda x: 1e1*(x[-1]-1)**4 |
|---|
| 36 | h2 = lambda x: (x[-2]-1.5)**4 |
|---|
| 37 | h = (h1, h2) |
|---|
| 38 | |
|---|
| 39 | lb = -6*ones(N) |
|---|
| 40 | ub = 6*ones(N) |
|---|
| 41 | lb[3] = 5.5 |
|---|
| 42 | ub[4] = 4.5 |
|---|
| 43 | |
|---|
| 44 | colors = ['b', 'k', 'y', 'r', 'g'] |
|---|
| 45 | ############# |
|---|
| 46 | #solvers = ['ralg','scipy_cobyla', 'lincher'] |
|---|
| 47 | solvers = ['ralg', 'ralg3'] |
|---|
| 48 | solvers = ['ralg', 'scipy_cobyla', 'lincher','ipopt','algencan' ] |
|---|
| 49 | #solvers = ['ipopt'] |
|---|
| 50 | ############# |
|---|
| 51 | colors = colors[:len(solvers)] |
|---|
| 52 | |
|---|
| 53 | lines, results = [], {} |
|---|
| 54 | for j in range(len(solvers)): |
|---|
| 55 | cc1, cc2, cc3 = 0, 0, 0 |
|---|
| 56 | solver = solvers[j] |
|---|
| 57 | color = colors[j] |
|---|
| 58 | p = NLP(f, x0, c=c, h=h, lb = lb, ub = ub, ftol = 1e-4, maxFunEvals = 1e7, maxIter = 1e4, plot = 1, color = color, iprint = 0, legend = [solvers[j]], show=False, xlabel='time', goal='maximum', name='nlp3') |
|---|
| 59 | if solver == 'algencan': |
|---|
| 60 | p.gradtol=1e-1 |
|---|
| 61 | elif solver == 'ralg': |
|---|
| 62 | p.debug = 1 |
|---|
| 63 | |
|---|
| 64 | r = p.solve(solver) |
|---|
| 65 | print 'c1 evals:', cc1, 'c2 evals:', cc2, 'c3 evals:', cc3 |
|---|
| 66 | results[solver] = (r.ff, p.getMaxResidual(r.xf), r.elapsed['solver_time'], r.elapsed['solver_cputime'], r.evals['f'], r.evals['c'], r.evals['h']) |
|---|
| 67 | subplot(2,1,1) |
|---|
| 68 | F0 = asscalar(p.f(p.x0)) |
|---|
| 69 | lines.append(plot([0, 1e-15], [F0, F0], color= colors[j])) |
|---|
| 70 | |
|---|
| 71 | for i in range(2): |
|---|
| 72 | subplot(2,1,i+1) |
|---|
| 73 | legend(lines, solvers) |
|---|
| 74 | |
|---|
| 75 | subplots_adjust(bottom=0.2, hspace=0.3) |
|---|
| 76 | |
|---|
| 77 | xl = ['Solver f_opt MaxConstr Time CPUTime fEvals cEvals hEvals'] |
|---|
| 78 | for i in range(len(results)): |
|---|
| 79 | xl.append((expandtabs(ljust(solvers[i], 16)+' \t', 15)+'%0.2f'% (results[solvers[i]][0]) + ' %0.1e' % (results[solvers[i]][1]) + (' %0.2f'% (results[solvers[i]][2])) + ' %0.2f '% (results[solvers[i]][3]) + str(results[solvers[i]][4]) + ' ' + rjust(str(results[solvers[i]][5]), 5) + expandtabs('\t' +str(results[solvers[i]][6]),8))) |
|---|
| 80 | |
|---|
| 81 | xl = '\n'.join(xl) |
|---|
| 82 | subplot(2,1,1) |
|---|
| 83 | xlabel('Time elapsed (without graphic output), sec') |
|---|
| 84 | |
|---|
| 85 | from pylab import * |
|---|
| 86 | subplot(2,1,2) |
|---|
| 87 | xlabel(xl) |
|---|
| 88 | |
|---|
| 89 | show() |
|---|
| 90 | |
|---|