1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/* -------------------------------------------------------------------------- *
* Simbody(tm) Example: Constrained Optimization w/Numerical Gradient *
* -------------------------------------------------------------------------- *
* This is part of the SimTK biosimulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
* *
* Portions copyright (c) 2006-12 Stanford University and the Authors. *
* Authors: Jack Middleton *
* Contributors: *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may *
* not use this file except in compliance with the License. You may obtain a *
* copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* -------------------------------------------------------------------------- */
#include "SimTKmath.h"
#include <iostream>
using namespace SimTK;
static int NumberOfParameters = 4;
static int NumberOfEqualityConstraints = 1;
static int NumberOfInequalityConstraints = 1;
/*
* Problem hs071 looks like this
*
* min x1*x4*(x1 + x2 + x3) + x3
* s.t. x1*x2*x3*x4 >= 25
* x1**2 + x2**2 + x3**2 + x4**2 = 40
* 1 <= x1,x2,x3,x4 <= 5
*
* Starting point:
* x = (1, 5, 5, 1)
*
* Optimal solution:
* x = (1.00000000, 4.74299963, 3.82114998, 1.37940829)
*
*/
class ProblemSystem : public OptimizerSystem {
public:
int objectiveFunc( const Vector &coefficients, bool new_coefficients, Real& f ) const override {
const Real *x;
x = &coefficients[0];
f = x[0] * x[3] * (x[0] + x[1] + x[2]) + x[2];
return( 0 );
}
int constraintFunc( const Vector &coefficients, bool new_coefficients, Vector &constraints) const override{
const Real *x;
x = &coefficients[0];
constraints[0] = x[0]*x[0] + x[1]*x[1] + x[2]*x[2] + x[3]*x[3] - 40.0;
constraints[1] = x[0] * x[1] * x[2] * x[3] - 25.0;
return(0);
}
ProblemSystem( const int numParams, const int numEqualityConstraints, const int numInequalityConstraints ) :
OptimizerSystem( numParams )
{
setNumEqualityConstraints( numEqualityConstraints );
setNumInequalityConstraints( numInequalityConstraints );
}
};
int main() {
/* create the system to be optimized */
ProblemSystem sys(NumberOfParameters, NumberOfEqualityConstraints, NumberOfInequalityConstraints);
Vector results(NumberOfParameters);
Vector lower_bounds(NumberOfParameters);
Vector upper_bounds(NumberOfParameters);
/* set initial conditions */
results[0] = 1.0;
results[1] = 5.0;
results[2] = 5.0;
results[3] = 1.0;
/* set bounds */
for(int i=0;i<NumberOfParameters;i++) {
lower_bounds[i] = 1.0;
upper_bounds[i] = 5.0;
}
sys.setParameterLimits( lower_bounds, upper_bounds );
Real f = NaN;
try {
Optimizer opt( sys );
opt.setConvergenceTolerance( .0001 );
opt.useNumericalGradient( true );
opt.useNumericalJacobian( true );
/* compute optimization */
f = opt.optimize( results );
}
catch (const std::exception& e) {
std::cout << "ConstrainedNumericalDiffOptimization.cpp: Caught exception" << std::endl;
std::cout << e.what() << std::endl;
}
printf("Optimal Solution: f = %f parameters = %f %f %f %f \n",f, results[0],results[1],results[2],results[3]);
return 0;
}
|