| 1 |
from scikits.openopt import NLP |
|---|
| 2 |
from numpy import cos, arange, ones, asarray, abs, zeros, sqrt, sign, asscalar |
|---|
| 3 |
from pylab import legend, show, plot, subplot, xlabel, subplots_adjust |
|---|
| 4 |
from string import rjust, ljust, expandtabs, center, lower |
|---|
| 5 |
from scipy import rand |
|---|
| 6 |
N = 10 |
|---|
| 7 |
M = 5 |
|---|
| 8 |
s = 1.3 |
|---|
| 9 |
f = lambda x: (abs(x-M) ** s).sum() |
|---|
| 10 |
df = lambda x: s * sign(x-M) * abs(x-M) ** (s-1) |
|---|
| 11 |
|
|---|
| 12 |
x0 = cos(arange(N)) |
|---|
| 13 |
|
|---|
| 14 |
c = lambda x: [2* x[0] **4-32, x[1]**2+x[2]**2 - 8] |
|---|
| 15 |
def dc(x): |
|---|
| 16 |
r = zeros((len(c(x0)), p.n)) |
|---|
| 17 |
r[0,0] = 2 * 4 * x[0]**3 |
|---|
| 18 |
r[1,1] = 2 * x[1] |
|---|
| 19 |
r[1,2] = 2 * x[2] |
|---|
| 20 |
return r |
|---|
| 21 |
|
|---|
| 22 |
K = 1e2 |
|---|
| 23 |
h1 = lambda x: K*(x[-1]-1)**4 |
|---|
| 24 |
h2 = lambda x: (x[-2]-1.5)**4 |
|---|
| 25 |
h3 = lambda x: (x[-5]+x[-6]-2*M+1.5)**6 |
|---|
| 26 |
h = (h1, h2, h3) |
|---|
| 27 |
def dh(x): |
|---|
| 28 |
r = zeros((len(h), N)) |
|---|
| 29 |
r[0, -1] = 4 * K * (x[-1]-1)**3 |
|---|
| 30 |
r[1, -2] = 4 * (x[-2]-1.5)**3 |
|---|
| 31 |
r[2, -5] = 6 * (x[-5]+x[-6]-2*M+1.5)**5 |
|---|
| 32 |
r[2, -6] = 6 * (x[-5]+x[-6]-2*M+1.5)**5 |
|---|
| 33 |
return r |
|---|
| 34 |
|
|---|
| 35 |
|
|---|
| 36 |
lb = -6*ones(N) |
|---|
| 37 |
ub = 6*ones(N) |
|---|
| 38 |
lb[3] = 5.5 |
|---|
| 39 |
ub[4] = 4.5 |
|---|
| 40 |
gradtol=1e-1 |
|---|
| 41 |
ftol = 1e-6 |
|---|
| 42 |
xtol = 1e-6 |
|---|
| 43 |
diffInt = 1e-8 |
|---|
| 44 |
contol = 1e-6 |
|---|
| 45 |
maxTime = 5 |
|---|
| 46 |
colors = ['b', 'k', 'y', 'g', 'r'] |
|---|
| 47 |
|
|---|
| 48 |
|
|---|
| 49 |
|
|---|
| 50 |
solvers = ['ralg', 'scipy_cobyla', 'lincher', 'scipy_slsqp'] |
|---|
| 51 |
|
|---|
| 52 |
|
|---|
| 53 |
|
|---|
| 54 |
|
|---|
| 55 |
colors = colors[:len(solvers)] |
|---|
| 56 |
lines, results = [], {} |
|---|
| 57 |
for j in range(len(solvers)): |
|---|
| 58 |
solver = solvers[j] |
|---|
| 59 |
color = colors[j] |
|---|
| 60 |
p = NLP(f, x0, name = 'bench2', df = df, c=c, dc = dc, h=h, dh = dh, lb = lb, ub = ub, gradtol=gradtol, ftol = ftol, maxFunEvals = 1e7, maxIter = 1e4, maxTime = maxTime, plot = 1, color = color, iprint = 0, legend = [solvers[j]], show=False, contol = contol) |
|---|
| 61 |
|
|---|
| 62 |
if solver in ['ralg', 'ralg2']: |
|---|
| 63 |
p.gradtol = 1e-8 |
|---|
| 64 |
p.ftol = 1e-7 |
|---|
| 65 |
p.xtol = 1e-7 |
|---|
| 66 |
elif solver == 'lincher': |
|---|
| 67 |
|
|---|
| 68 |
p.maxTime = 1e15 |
|---|
| 69 |
p.maxIter = 100 |
|---|
| 70 |
|
|---|
| 71 |
|
|---|
| 72 |
|
|---|
| 73 |
|
|---|
| 74 |
r = p.solve(solver) |
|---|
| 75 |
for fn in ('h','c'): |
|---|
| 76 |
if not r.evals.has_key(fn): r.evals[fn]=0 |
|---|
| 77 |
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']) |
|---|
| 78 |
subplot(2,1,1) |
|---|
| 79 |
F0 = asscalar(p.f(p.x0)) |
|---|
| 80 |
lines.append(plot([0, 1e-15], [F0, F0], color= colors[j])) |
|---|
| 81 |
|
|---|
| 82 |
|
|---|
| 83 |
for i in range(2): |
|---|
| 84 |
subplot(2,1,i+1) |
|---|
| 85 |
legend(lines, solvers) |
|---|
| 86 |
|
|---|
| 87 |
subplots_adjust(bottom=0.2, hspace=0.3) |
|---|
| 88 |
|
|---|
| 89 |
xl = ['Solver f_opt MaxConstr Time CPUTime fEvals cEvals hEvals'] |
|---|
| 90 |
|
|---|
| 91 |
for i in range(len(results)): |
|---|
| 92 |
s=(ljust(lower(solvers[i]), 40-len(solvers[i]))+'%0.3f'% (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) + ' '*5 +str(results[solvers[i]][6])) |
|---|
| 93 |
xl.append(s) |
|---|
| 94 |
|
|---|
| 95 |
xl = '\n'.join(xl) |
|---|
| 96 |
subplot(2,1,1) |
|---|
| 97 |
xlabel('Time elapsed (without graphic output), sec') |
|---|
| 98 |
|
|---|
| 99 |
from pylab import * |
|---|
| 100 |
subplot(2,1,2) |
|---|
| 101 |
xlabel(xl) |
|---|
| 102 |
show() |
|---|