Lotka Volterra fishing problem (APMonitor)
This page contains a solution of the MIOCP Lotka Volterra fishing problem in APMonitor Python format. A MATLAB version is also available from the Dynamic Optimization Course as Example 3 (lotka_volterra_fishing.zip).
APMonitor
The model in Python code for a fixed control discretization grid using orthogonal collocation and a simultaneous optimization method. The APMonitor package is available with pip install APMonitor or from the APMonitor Python Github repository.
import numpy as np import matplotlib.pyplot as plt # retrieve apm.py from # https://raw.githubusercontent.com/APMonitor/apm_python/master/apm.py # or # http://apmonitor.com/wiki/index.php/Main/PythonApp # from apm import * # pip install with 'pip install APMonitor' from APMonitor.apm import * # local APMonitor servers are available for Windows or Linux # http://apmonitor.com/wiki/index.php/Main/APMonitorServer # with clients in Python, MATLAB, and Julia # write model model = ''' ! apopt MINLP solver options (see apopt.com) File apopt.opt minlp_maximum_iterations 1000 ! minlp iterations minlp_max_iter_with_int_sol 50 ! minlp iterations if integer solution is found minlp_as_nlp 0 ! treat minlp as nlp nlp_maximum_iterations 200 ! nlp sub-problem max iterations minlp_branch_method 1 ! 1 = depth first, 2 = breadth first minlp_gap_tol 0.001 ! covergence tolerance minlp_integer_tol 0.001 ! maximum deviation from whole number to be considered an integer minlp_integer_leaves 0 ! create soft (1) integer leaves or hard (2) integer leaves with branching End File Constants c0 = 0.4 c1 = 0.2 Parameters last Variables x0 = 0.5 , >= 0 x1 = 0.7 , >= 0 x2 = 0.0 , >= 0 int_w = 0 , >= 0 , <= 1 Intermediates w = int_w Equations minimize last * x2 $x0 = x0 - x0*x1 - c0*x0*w $x1 = - x1 + x0*x1 - c1*x1*w $x2 = (x0-1)^2 + (x1-1)^2 ''' fid = open('lotka_volterra.apm','w') fid.write(model) fid.close() # write data file time = np.linspace(0,12,121) time = np.insert(time, 1, 0.01) last = np.zeros(122) last[-1] = 1.0 data = np.vstack((time,last)) np.savetxt('data.csv',data.T,delimiter=',',header='time,last',comments='') # specify server and application name s = 'http://byu.apmonitor.com' #s = 'http://127.0.0.1/' # for local APMonitor server a = 'lotka' apm(s,a,'clear all') apm_load(s,a,'lotka_volterra.apm') csv_load(s,a,'data.csv') apm_option(s,a,'nlc.imode',6) # Nonlinear control / dynamic optimization apm_option(s,a,'nlc.nodes',3) apm_info(s,a,'MV','int_w') # M or MV = Manipulated variable - independent variable over time horizon apm_option(s,a,'int_w.status',1) # Status: 1=ON, 0=OFF apm_option(s,a,'int_w.mv_type',0) # MV Type = Zero Order Hold apm_option(s,a,'nlc.solver',1) # 1 = APOPT # solve output = apm(s,a,'solve') print(output) # retrieve solution y = apm_sol(s,a) plt.figure(1) plt.step(y['time'],y['int_w'],'r-',label='w (0/1)') plt.plot(y['time'],y['x0'],'b-',label=r'$x_0$') plt.plot(y['time'],y['x1'],'k-',label=r'$x_1$') plt.plot(y['time'],y['x2'],'g-',label=r'$x_2$') plt.xlabel('Time') plt.ylabel('Variables') plt.legend(loc='best') plt.show()
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