| 1 | """ |
|---|
| 2 | Example for oolin - linear oofun |
|---|
| 3 | |
|---|
| 4 | For the given input vector z it returns dot(f, z) + c |
|---|
| 5 | (by default c=0) |
|---|
| 6 | |
|---|
| 7 | Note! For oolin NaN * 0 had been implemented as 0. |
|---|
| 8 | For example oolin([0, 0, 1]) with x = [nan, 10, 15] will yield 15 |
|---|
| 9 | """ |
|---|
| 10 | from scikits.openopt import * |
|---|
| 11 | from numpy import mat |
|---|
| 12 | v0 = oovar('v0', [-4, -15]) # 2nd arg (if provided) is start value |
|---|
| 13 | v1 = oovar('v1', [1, 2], ub=[0.1, 0.2]) # ub is upper bound (optional) |
|---|
| 14 | v2 = oovar('v2', (3, 4), lb=[-2, 0], ub=[-1.5, 1]) # lb is lower bound (optional) |
|---|
| 15 | |
|---|
| 16 | f0 = oofun(lambda z: z[0]**2 + z[0] + 2*z[1]**2 , input = v0) |
|---|
| 17 | f1 = oofun(lambda z: (z-1).sum() ** 2, input = v1) |
|---|
| 18 | f2 = oofun(lambda z: z.sum() ** 2, input = v2) |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | """ |
|---|
| 22 | f3 returns z0 + 2 * z1 + 3 * z2 |
|---|
| 23 | this is same to |
|---|
| 24 | f3 = oofun(lambda z0, z1, z2: z0 + 2*z1 + 3*z2] , input = [f0, f1, f2], d = lambda x: [1, 2, 3]) |
|---|
| 25 | """ |
|---|
| 26 | f3 = oolin([1, 2, 3], input=[f0, f1, f2]) |
|---|
| 27 | |
|---|
| 28 | """ |
|---|
| 29 | f4 returns 15 * f0 + 8 * f3 + 80 * f2 + 15 |
|---|
| 30 | this is same to |
|---|
| 31 | f4 = oofun(lambda z0, z1, z2: 15*f0 + 8*f3 + 80*f2 + 15] , input = [f0, f4, f2], d = lambda x: [15, 8, 80]) |
|---|
| 32 | """ |
|---|
| 33 | f4 = oolin([15, 8, 80], 15, input=[f0, f3, f2]) |
|---|
| 34 | |
|---|
| 35 | """ |
|---|
| 36 | f5 returns matrix_C * vector_input + vector_d |
|---|
| 37 | We will use it as 3 non-linear inequalities C * input + d <= 0 |
|---|
| 38 | (input is non-linear, hence the constraints are non-linear): |
|---|
| 39 | z1 + 2*z2 + 4*z3 - 10 <= 0 |
|---|
| 40 | 4*z1 + 5*z2 + 8*z3 - 20 <= 0 |
|---|
| 41 | 7*z1 + 8*z2 + 10*z3 - 30 <= 0 |
|---|
| 42 | Of course, we could use f5 somewhere as a part of (recursive) calculations for obtaining objFunc |
|---|
| 43 | """ |
|---|
| 44 | C = mat('1 2 4; 4 5 8; 7 8 10') # numpy.array or array-like object is OK as well |
|---|
| 45 | d = [-10, -20, -30] # numpy.array or array-like object is OK as well |
|---|
| 46 | f5 = oolin(C, d, input=[f2, f1, f0]) |
|---|
| 47 | |
|---|
| 48 | # objective function: |
|---|
| 49 | F = oolin([1, 1, 1], 15, input = [f2, f3, f4]) # returns f2 + f3 + f4 + 15 |
|---|
| 50 | |
|---|
| 51 | # assign prob: |
|---|
| 52 | p = NLP(F, c=f5) # Note - it already has some lb <= x <= ub constraints rased from v1, v2 |
|---|
| 53 | |
|---|
| 54 | # solve: |
|---|
| 55 | r = p.solve('ralg') |
|---|
| 56 | #r = p.solve('scipy_slsqp') |
|---|
| 57 | |
|---|
| 58 | print 'solution:', r.xf |
|---|
| 59 | print 'optim value:', r.ff |
|---|
| 60 | """ |
|---|
| 61 | solution: {'v0': array([ -5.00012873e-01, 8.20344763e-05]), 'v1': array([ 0.10000018, 0.19999917]), 'v2': array([-1.49999962, 1.00000076])} |
|---|
| 62 | optim value: 103.019917653 |
|---|
| 63 | """ |
|---|