Lotka Volterra fishing problem (Casadi)
Appearance
This page contains a discretized version of the MIOCP Lotka Volterra fishing problem in Casadi format.
Casadi
The model in Python code for a fixed control discretization grid using direct multiple shooting.
# ------------------------------------------------------------------------------
# Lotka Volterra fishing problem with CasADi Python interface using direct
# multiple shooting with IPOPT and Sundials' integrator CVodes
#
# NOTE: CasADi currently has no support for mixed-integer problems. Only the
# relaxed solution is calculated
# ------------------------------------------------------------------------------
# Import
from casadi import *
# Introduce model parameters
t0 = 0
tf = 12
c0 = 0.4
c1 = 0.2
x0 = [0.5, 0.7, 0]
# Define length of time horizon as well as number and length of intervals
T = tf - t0
N = 100
dt = float(T) / N
# Define the DAE
x = SX.sym('x', 3)
w = SX.sym('w')
rhs = vertcat([
dt * ( x[0] - x[0] * x[1] - c0 * x[0] * w),
dt * (-x[1] + x[0] * x[1] - c1 * x[1] * w),
dt * ((x[0] - 1)**2 + (x[1] - 1)**2)
])
dae = SXFunction("dae", daeIn(x=x, p=w), daeOut(ode=rhs))
I_opt = {
'linear_solver': 'csparse',
't0': 0.0,
'tf': 1.0
}
I = Integrator("integrate", "cvodes", dae, I_opt)
# Define number of state variables, controls and variables per interval
nx = x.size1() # Number of states
nu = w.size1() # Number of controls
ns = nx + nu # Number of variables per shooting interval
# Create symbolic expressions for actual NLP variables and define DMS structure
X = MX.sym('X', (N + 1) * nx + N * nu) # Optimization variables
G = [] # Nonlinear constraints
F = X[N*ns+2] # Mayer objective
for i in range(0, N):
X0 = X[i*ns:i*ns+nx] # Initial state for interval
U = X[i*ns+nx:(i+1)*ns] # Control for interval
X1 = X[(i+1)*ns:(i+1)*ns+nx] # Terminal state for interval
Y = I({'x0': X0, 'p': U})
G = vertcat([G, Y['xf'] - X1])
# Define NLP
nlp = MXFunction('nlp', nlpIn(x=X), nlpOut(f=F, g=G))
# Create feasible initial solution by simulating with constant zero control
Xstart = DMatrix.zeros(X.size1(), X.size2())
Xstart[0:nx] = x0
for i in range(0, N):
X0 = Xstart[i*ns:i*ns+nx]
Xstart[i*ns+nx:(i+1)*ns] = 0.0
Xstart[(i+1)*ns:(i+1)*ns+nx] = I({'x0': X0, 'p': 0.0})['xf']
# Create and execute nonlinear solver
solver = NlpSolver('solver', 'ipopt', nlp)
result = solver({
'x0': Xstart,
'lbg': DMatrix.zeros(G.size1()),
'ubg': DMatrix.zeros(G.size1()),
'lbx': x0 + [0.0] + [0.0, 0.0, 0.0, 0.0] * (N - 1) + [0.0, 0.0, 0.0],
'ubx': x0 + [1.0] + [inf, inf, inf, 1.0] * (N - 1) + [inf, inf, inf]
})
# Extract solution and objective
x = result['x']
f = result['f']
# Disassemble solution into easily plottable lists
t = [i*dt for i in range(0, N + 1)]
x0 = [x[i*ns] for i in range(0, N + 1)]
x1 = [x[i*ns+1] for i in range(0, N + 1)]
u = [x[i*ns+nx] for i in range(0, N )]
Results
IPOPT
The relaxed solution calculated by IPOPT (Ipopt 3.12, Linux x86_64, default settings, 4 GHz quadcore, Linux 4.2.0-23-generic) has an objective function value of . IPOPT requires 22 iterations (6.062 seconds of processing time). The following is a Gnuplot compatible tabular version of the solution:
# t, x_0, x_1, u 0, 0.5, 0.7, 5.18436e-09 0.12, 0.519594, 0.659989, 5.42459e-09 0.24, 0.542429, 0.623852, 5.79496e-09 0.36, 0.568601, 0.591429, 6.30563e-09 0.48, 0.59823, 0.562571, 6.97415e-09 0.6, 0.631456, 0.537143, 7.827e-09 0.72, 0.66843, 0.515028, 8.90236e-09 0.84, 0.709312, 0.496134, 1.02545e-08 0.96, 0.75426, 0.480401, 1.19611e-08 1.08, 0.803421, 0.4678, 1.41346e-08 1.2, 0.856919, 0.458344, 1.69417e-08 1.32, 0.914842, 0.452091, 2.06377e-08 1.44, 0.97722, 0.449154, 2.56285e-08 1.56, 1.044, 0.449708, 3.2592e-08 1.68, 1.11503, 0.454003, 4.27322e-08 1.8, 1.18998, 0.462372, 5.83658e-08 1.92, 1.26837, 0.475251, 8.44574e-08 2.04, 1.34942, 0.493189, 1.33425e-07 2.16, 1.43209, 0.516862, 2.44977e-07 2.28, 1.51492, 0.547087, 6.24464e-07 2.4, 1.59605, 0.584816, 0.715281 2.52, 1.61776, 0.61833, 0.999999 2.64, 1.61116, 0.6499, 0.999999 2.76, 1.59844, 0.68229, 1 2.88, 1.57963, 0.714939, 1 3, 1.55497, 0.747196, 1 3.12, 1.52487, 0.778343, 0.999999 3.24, 1.48993, 0.807625, 0.999999 3.36, 1.4509, 0.83429, 0.999999 3.48, 1.40865, 0.857635, 0.999998 3.6, 1.36412, 0.877047, 0.999997 3.72, 1.31827, 0.892039, 0.999991 3.84, 1.27203, 0.90228, 0.999646 3.96, 1.22628, 0.907616, 0.536112 4.08, 1.20755, 0.919653, 0.581667 4.2, 1.18502, 0.928525, 0.503883 4.32, 1.16606, 0.936899, 0.464153 4.44, 1.14851, 0.944178, 0.418428 4.56, 1.13278, 0.950658, 0.378617 4.68, 1.11859, 0.956378, 0.341493 4.8, 1.10582, 0.961433, 0.3073 4.92, 1.09438, 0.965904, 0.276462 5.04, 1.08411, 0.969849, 0.248219 5.16, 1.07492, 0.973333, 0.222481 5.28, 1.0667, 0.976412, 0.19935 5.4, 1.05936, 0.97913, 0.178262 5.52, 1.0528, 0.981533, 0.159402 5.64, 1.04696, 0.983656, 0.142349 5.76, 1.04175, 0.985532, 0.127041 5.88, 1.0371, 0.987191, 0.1133 6, 1.03297, 0.988657, 0.100985 6.12, 1.02929, 0.989954, 0.0899604 6.24, 1.02601, 0.991101, 0.0800981 6.36, 1.0231, 0.992117, 0.0712934 6.48, 1.02051, 0.993015, 0.0634308 6.6, 1.01821, 0.993811, 0.0564127 6.72, 1.01617, 0.994515, 0.0501573 6.84, 1.01435, 0.995139, 0.0445824 6.96, 1.01274, 0.995691, 0.0396177 7.08, 1.01131, 0.99618, 0.0351979 7.2, 1.01003, 0.996613, 0.0312714 7.32, 1.0089, 0.996997, 0.027765 7.44, 1.0079, 0.997337, 0.0246626 7.56, 1.00701, 0.997639, 0.0218975 7.68, 1.00622, 0.997905, 0.0194423 7.8, 1.00552, 0.998142, 0.0172603 7.92, 1.0049, 0.998351, 0.0153224 8.04, 1.00435, 0.998537, 0.0136015 8.16, 1.00386, 0.998701, 0.0120735 8.28, 1.00342, 0.998847, 0.0107171 8.4, 1.00303, 0.998976, 0.00951328 8.52, 1.00269, 0.99909, 0.00844491 8.64, 1.00239, 0.999191, 0.00749702 8.76, 1.00212, 0.999281, 0.00665598 8.88, 1.00188, 0.99936, 0.00590975 9, 1.00167, 0.99943, 0.00524776 9.12, 1.00148, 0.999492, 0.00466052 9.24, 1.00131, 0.999547, 0.00413914 9.36, 1.00117, 0.999596, 0.00367206 9.48, 1.00103, 0.999637, 0.00326159 9.6, 1.00092, 0.999675, 0.00290302 9.72, 1.00082, 0.999707, 0.00258504 9.84, 1.00072, 0.999736, 0.00230262 9.96, 1.00064, 0.999762, 0.00205186 10.08, 1.00057, 0.999785, 0.00182951 10.2, 1.00051, 0.999805, 0.00163302 10.32, 1.00045, 0.999822, 0.00146039 10.44, 1.0004, 0.999838, 0.00131011 10.56, 1.00036, 0.999851, 0.00118097 10.68, 1.00032, 0.999863, 0.00107188 10.8, 1.00028, 0.999872, 0.000981659 10.92, 1.00025, 0.99988, 0.00090944 11.04, 1.00022, 0.999886, 0.000854893 11.16, 1.00019, 0.99989, 0.000818284 11.28, 1.00017, 0.999892, 0.000801181 11.4, 1.00014, 0.999891, 0.000807844 11.52, 1.00012, 0.999886, 0.000848734 11.64, 1.00009, 0.999878, 0.000951928 11.76, 1.00006, 0.999864, 0.00121852 11.88, 1.00002, 0.999838, 0.00267036 12, 0.999915, 0.999769, 0