public abstract class Optimization extends java.lang.Object implements TechnicalInformationHandler, RevisionHandler
class MyOpt extends Optimization {
// Provide the objective function
protected double objectiveFunction(double[] x) {
// How to calculate your objective function...
// ...
}
// Provide the first derivatives
protected double[] evaluateGradient(double[] x) {
// How to calculate the gradient of the objective function...
// ...
}
// If possible, provide the indexˆ{th} row of the Hessian matrix
protected double[] evaluateHessian(double[] x, int index) {
// How to calculate the indexˆth variable's second derivative
// ...
}
}
When it's the time to use it, in some routine(s) of other class...
MyOpt opt = new MyOpt();
// Set up initial variable values and bound constraints
double[] x = new double[numVariables];
// Lower and upper bounds: 1st row is lower bounds, 2nd is upper
double[] constraints = new double[2][numVariables];
...
// Find the minimum, 200 iterations as default
x = opt.findArgmin(x, constraints);
while(x == null){ // 200 iterations are not enough
x = opt.getVarbValues(); // Try another 200 iterations
x = opt.findArgmin(x, constraints);
}
// The minimal function value
double minFunction = opt.getMinFunction();
...
It is recommended that Hessian values be provided so that the second-order
Lagrangian multiplier estimate can be calcluated. However, if it is not
provided, there is no need to override the evaluateHessian()
function.
REFERENCES (see also the getTechnicalInformation() method):getTechnicalInformation()| Constructor and Description |
|---|
Optimization() |
| Modifier and Type | Method and Description |
|---|---|
double[] |
findArgmin(double[] initX,
double[][] constraints)
Main algorithm.
|
double |
getMinFunction()
Get the minimal function value
|
TechnicalInformation |
getTechnicalInformation()
Returns an instance of a TechnicalInformation object, containing detailed
information about the technical background of this class, e.g., paper
reference or book this class is based on.
|
double[] |
getVarbValues()
Get the variable values.
|
double[] |
lnsrch(double[] xold,
double[] gradient,
double[] direct,
double stpmax,
boolean[] isFixed,
double[][] nwsBounds,
weka.core.Optimization.DynamicIntArray wsBdsIndx)
Find a new point x in the direction p from a point xold at which the value
of the function has decreased sufficiently, the positive definiteness of B
matrix (approximation of the inverse of the Hessian) is preserved and no
bound constraints are violated.
|
void |
setDebug(boolean db)
Set whether in debug mode
|
void |
setMaxIteration(int it)
Set the maximal number of iterations in searching (Default 200)
|
static double[] |
solveTriangle(Matrix t,
double[] b,
boolean isLower,
boolean[] isZero)
Solve the linear equation of TX=B where T is a triangle matrix It can be
solved using back/forward substitution, with O(N^2) complexity
|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitgetRevisionpublic TechnicalInformation getTechnicalInformation()
getTechnicalInformation in interface TechnicalInformationHandlerpublic double getMinFunction()
public void setMaxIteration(int it)
it - the maximal number of iterationspublic void setDebug(boolean db)
db - use debug or notpublic double[] getVarbValues()
public double[] lnsrch(double[] xold,
double[] gradient,
double[] direct,
double stpmax,
boolean[] isFixed,
double[][] nwsBounds,
weka.core.Optimization.DynamicIntArray wsBdsIndx)
throws java.lang.Exception
xold - old x valuegradient - gradient at that pointdirect - direction vectorstpmax - maximum step lengthisFixed - indicating whether a variable has been fixednwsBounds - non-working set bounds. Means these variables are free and
subject to the bound constraints in this stepwsBdsIndx - index of variables that has working-set bounds. Means
these variables are already fixed and no longer subject to the
constraintsjava.lang.Exception - if an error occurspublic double[] findArgmin(double[] initX,
double[][] constraints)
throws java.lang.Exception
initX - initial point of x, assuming no value's on the bound!constraints - the bound constraints of each variable constraints[0] is
the lower bounds and constraints[1] is the upper boundsjava.lang.Exception - if an error occurspublic static double[] solveTriangle(Matrix t, double[] b, boolean isLower, boolean[] isZero)
t - the matrix Tb - the vector BisLower - whether T is a lower or higher triangle matrixisZero - which row(s) of T are not used when solving the equation. If
it's null or all 'false', then every row is used.