public class MinConGenLin extends Object implements Serializable, Cloneable
The class MinConGenLin
is based on M.J.D. Powell's TOLMIN,
which solves linearly constrained optimization problems, i.e., problems of
the form
min
subject to
A_1x = b_1
A_2x\le b_2
x_l \le x\le x_u
given the vectors b_1, b_2, x_l, and x_u and the matrices A_1 and A_2.
The algorithm starts by checking the equality constraints for inconsistency and redundancy. If the equality constraints are consistent, the method will revise x^0, the initial guess, to satisfy A_1x =b_1
Next, x^0 is adjusted to satisfy the simple bounds and inequality constraints. This is done by solving a sequence of quadratic programming subproblems to minimize the sum of the constraint or bound violations.
Now, for each iteration with a feasible x^k, let J_k be the set of indices of inequality constraints that have small residuals. Here, the simple bounds are treated as inequality constraints. Let I_k be the set of indices of active constraints. The following quadratic programming problem
\min f\left( {x^k } \right) + d^T \nabla \,f\left( {x^k } \right) + {1 \over 2}d^T B^k d
subject to
a_jd = 0, \,j \in I_k
a_jd \le 0, \,j \in J_k
is solved to get (d^k, \lambda^k) where a_j is a row vector representing either a constraint in A_1 or A_2 or a bound constraint on x. In the latter case, the a_j = e_j for the bound constraint x_i \le (x_u)_i and a_j = -e_i for the constraint -x_i \le (x_l)_i. Here, e_i is a vector with 1 as the i-th component, and zeros elsewhere. Variables \lambda^k are the Lagrange multipliers, and B^k is a positive definite approximation to the second derivative \nabla ^2 f(x^k).
After the search direction d^k is obtained, a line search is performed to locate a better point. The new point x^{k+1}= x^k +\alpha^kd^k has to satisfy the conditions
f(x^k + \alpha^kd^k) \le f(x^k) + 0.1 \alpha^k (d^k)^T\nabla f(x^k)
and
(d^k)^T\nabla f(x^k +\alpha ^kd^k) \ge 0.7 (d^k)^T\nabla f(x^k)
The main idea in forming the set J_k is that, if any of the equality constraints restricts the step-length \alpha^k, then its index is not in J_k. Therefore, small steps are likely to be avoided.
Finally, the second derivative approximation B^K, is updated by the BFGS formula, if the condition
\left( {d^K } \right)^T \nabla f\left( {x^k + \alpha ^k d^k } \right) - \nabla f\left( {x^k } \right) > 0
holds. Let x^k \leftarrow x^{k + 1}, and start another iteration.
The iteration repeats until the stopping criterion
\left\| {\nabla f(x^k ) - A^k \lambda ^K } \right\|_2 \le \tau
is satisfied. Here \tau is the supplied tolerance. For more details, see Powell (1988, 1989).
Modifier and Type | Class and Description |
---|---|
static class |
MinConGenLin.ConstraintsInconsistentException
The equality constraints are inconsistent.
|
static class |
MinConGenLin.ConstraintsNotSatisfiedException
No vector x satisfies all of the constraints.
|
static class |
MinConGenLin.EqualityConstraintsException
the variables are determined by the equality constraints.
|
static interface |
MinConGenLin.Function
Public interface for the user-supplied function to evaluate the function to be minimized.
|
static interface |
MinConGenLin.Gradient
Public interface for the user-supplied function to compute the gradient.
|
static class |
MinConGenLin.VarBoundsInconsistentException
The equality constraints and the bounds on the variables are found to be
inconsistent.
|
Constructor and Description |
---|
MinConGenLin(MinConGenLin.Function fcn,
int nvar,
int ncon,
int neq,
double[] a,
double[] b,
double[] lowerBound,
double[] upperBound)
Constructor for
MinConGenLin . |
Modifier and Type | Method and Description |
---|---|
int[] |
getFinalActiveConstraints()
Returns the indices of the final active constraints.
|
int |
getFinalActiveConstraintsNum()
Returns the final number of active constraints.
|
double[] |
getLagrangeMultiplerEst()
Deprecated.
Method name misspelled. Use
MinConGenLin.getLagrangeMultiplierEst() instead. |
double[] |
getLagrangeMultiplierEst()
Returns the Lagrange multiplier estimates of the final active constraints.
|
int |
getNumberOfThreads()
Returns the number of
java.lang.Thread instances used for
parallel processing. |
double |
getObjectiveValue()
Returns the value of the objective function.
|
double[] |
getSolution()
Returns the computed solution.
|
void |
setGuess(double[] guess)
Sets an initial guess of the solution.
|
void |
setNumberOfThreads(int numberOfThreads)
Sets the number of
java.lang.Thread instances to be used for
parallel processing. |
void |
setTolerance(double tolerance)
Sets the nonnegative tolerance on the first order conditions at the calculated solution.
|
void |
solve()
Minimizes a general objective function subject to linear equality/inequality constraints.
|
public MinConGenLin(MinConGenLin.Function fcn, int nvar, int ncon, int neq, double[] a, double[] b, double[] lowerBound, double[] upperBound)
MinConGenLin
.fcn
- A Function
object, user-supplied function to evaluate the function
to be minimized.nvar
- An int
scalar containing the number of variables.ncon
- An int
scalar containing the number of linear constraints
(excluding simple bounds).neq
- An int
scalar containing the number of linear equality constraints.a
- A double
array containing the equality constraint gradients in the
first neq rows followed by the inequality constraint gradients.
a.length
= ncon
* nvar
b
- A double
array containing the right-hand sides of the linear constraints.lowerBound
- A double
array containing the lower bounds on the variables. Choose a
very large negative value if a component should be unbounded below
or set lowerBound[i] = upperBound[i]
to freeze the i-th variable.
lowerBound.length
= nvar
upperBound
- A double
array containing the upper bounds on the variables. Choose a
very large positive value if a component should be unbounded above.
upperBound.length
= nvar
IllegalArgumentException
- is thrown if the dimensions of nvar
,
ncon
, neq
, a.length
, b.length
,
lowerBound.length
and upperBound.length
are not consistent.public void setNumberOfThreads(int numberOfThreads)
java.lang.Thread
instances to be used for
parallel processing.numberOfThreads
- an int
specifying the number of
java.lang.Thread
instances to be used for parallel
processing. If numberOfThreads
is greater than 1, then
interface Function.f
is evaluated in parallel and
Function.f
must be thread-safe. Otherwise, unexpected
behavior can occur.
Default: numberOfThreads
= 1.
public int getNumberOfThreads()
java.lang.Thread
instances used for
parallel processing.int
containing the number of
java.lang.Thread
instances used for parallel processing.public final void solve() throws MinConGenLin.ConstraintsInconsistentException, MinConGenLin.VarBoundsInconsistentException, MinConGenLin.ConstraintsNotSatisfiedException, MinConGenLin.EqualityConstraintsException
public double[] getLagrangeMultiplerEst()
MinConGenLin.getLagrangeMultiplierEst()
instead.double
array containing the Lagrange multiplier estimates of the final active constraints.public double[] getLagrangeMultiplierEst()
double
array containing the Lagrange multiplier estimates of the final active constraints.public double getObjectiveValue()
double
scalar containing the value of the objective function.public void setTolerance(double tolerance)
tolerance
- a double
scalar containing the tolerance.public int getFinalActiveConstraintsNum()
int
scalar containing the final number of active constraints.public double[] getSolution()
double
array containing the computed solution.public int[] getFinalActiveConstraints()
int
array containing the indices of the final active constraints.public void setGuess(double[] guess)
guess
- a double
array containing an initial guess.Copyright © 2020 Rogue Wave Software. All rights reserved.