You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
6.1 KiB
174 lines
6.1 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkAmoebaMinimizer.h,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkAmoebaMinimizer - nonlinear optimization with a simplex
|
|
// .SECTION Description
|
|
// vtkAmoebaMinimizer will modify a set of parameters in order to find
|
|
// the minimum of a specified function. The method used is commonly
|
|
// known as the amoeba method, it constructs an n-dimensional simplex
|
|
// in parameter space (i.e. a tetrahedron if the number or parameters
|
|
// is 3) and moves the vertices around parameter space until a local
|
|
// minimum is found. The amoeba method is robust, reasonably efficient,
|
|
// but is not guaranteed to find the global minimum if several local
|
|
// minima exist.
|
|
|
|
#ifndef __vtkAmoebaMinimizer_h
|
|
#define __vtkAmoebaMinimizer_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
class VTK_COMMON_EXPORT vtkAmoebaMinimizer : public vtkObject
|
|
{
|
|
public:
|
|
static vtkAmoebaMinimizer *New();
|
|
vtkTypeRevisionMacro(vtkAmoebaMinimizer,vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Specify the function to be minimized. When this function
|
|
// is called, it must get the parameter values by calling
|
|
// GetParameterValue() for each parameter, and then must
|
|
// call SetFunctionValue() to tell the minimizer what the result
|
|
// of the function evaluation was. The number of function
|
|
// evaluations used for the minimization can be retrieved
|
|
// using GetFunctionEvaluations().
|
|
void SetFunction(void (*f)(void *), void *arg);
|
|
|
|
// Description:
|
|
// Set a function to call when a void* argument is being discarded.
|
|
void SetFunctionArgDelete(void (*f)(void *));
|
|
|
|
// Description:
|
|
// Set the initial value for the specified parameter. Calling
|
|
// this function for any parameter will reset the Iterations
|
|
// and the FunctionEvaluations counts to zero. You must also
|
|
// use SetParameterScale() to specify the step size by which the
|
|
// parameter will be modified during the minimization. It is
|
|
// preferable to specify parameters by name, rather than by
|
|
// number.
|
|
void SetParameterValue(const char *name, double value);
|
|
void SetParameterValue(int i, double value);
|
|
|
|
// Description:
|
|
// Set the scale to use when modifying a parameter, i.e. the
|
|
// initial amount by which the parameter will be modified
|
|
// during the search for the minimum. It is preferable to
|
|
// identify scalars by name rather than by number.
|
|
void SetParameterScale(const char *name, double scale);
|
|
double GetParameterScale(const char *name);
|
|
void SetParameterScale(int i, double scale);
|
|
double GetParameterScale(int i) { return this->ParameterScales[i]; };
|
|
|
|
// Description:
|
|
// Get the value of a parameter at the current stage of the minimization.
|
|
// Call this method within the function that you are minimizing in order
|
|
// to get the current parameter values. It is preferable to specify
|
|
// parameters by name rather than by index.
|
|
double GetParameterValue(const char *name);
|
|
double GetParameterValue(int i) { return this->ParameterValues[i]; };
|
|
|
|
// Description:
|
|
// For completeness, an unchecked method to get the name for particular
|
|
// parameter (the result will be NULL if no name was set).
|
|
const char *GetParameterName(int i) { return this->ParameterNames[i]; };
|
|
|
|
// Description:
|
|
// Get the number of parameters that have been set.
|
|
int GetNumberOfParameters() { return this->NumberOfParameters; };
|
|
|
|
// Description:
|
|
// Initialize the minimizer. This will reset the number of parameters to
|
|
// zero so that the minimizer can be reused.
|
|
void Initialize();
|
|
|
|
// Description:
|
|
// Iterate until the minimum is found to within the specified tolerance,
|
|
// or until the MaxIterations has been reached.
|
|
virtual void Minimize();
|
|
|
|
// Description:
|
|
// Perform one iteration of minimization. Returns zero if the tolerance
|
|
// stopping criterion has been met.
|
|
virtual int Iterate();
|
|
|
|
// Description:
|
|
// Get the function value resulting from the minimization.
|
|
vtkSetMacro(FunctionValue,double);
|
|
double GetFunctionValue() { return this->FunctionValue; };
|
|
|
|
// Description:
|
|
// Specify the fractional tolerance to aim for during the minimization.
|
|
vtkSetMacro(Tolerance,double);
|
|
vtkGetMacro(Tolerance,double);
|
|
|
|
// Description:
|
|
// Specify the maximum number of iterations to try before giving up.
|
|
vtkSetMacro(MaxIterations,int);
|
|
vtkGetMacro(MaxIterations,int);
|
|
|
|
// Description:
|
|
// Return the number of interations that have been performed. This
|
|
// is not necessarily the same as the number of function evaluations.
|
|
vtkGetMacro(Iterations,int);
|
|
|
|
// Description:
|
|
// Return the number of times that the function has been evaluated.
|
|
vtkGetMacro(FunctionEvaluations,int);
|
|
|
|
// Description:
|
|
// Evaluate the function. This is usually called internally by the
|
|
// minimization code, but it is provided here as a public method.
|
|
void EvaluateFunction();
|
|
|
|
protected:
|
|
vtkAmoebaMinimizer();
|
|
~vtkAmoebaMinimizer();
|
|
|
|
//BTX
|
|
void (*Function)(void *);
|
|
void (*FunctionArgDelete)(void *);
|
|
void *FunctionArg;
|
|
//ETX
|
|
|
|
int NumberOfParameters;
|
|
char **ParameterNames;
|
|
double *ParameterValues;
|
|
double *ParameterScales;
|
|
double FunctionValue;
|
|
|
|
double Tolerance;
|
|
int MaxIterations;
|
|
int Iterations;
|
|
int FunctionEvaluations;
|
|
|
|
private:
|
|
// specific to amoeba simplex minimization
|
|
//BTX
|
|
double **AmoebaVertices;
|
|
double *AmoebaValues;
|
|
double *AmoebaSum;
|
|
int AmoebaNStepsNoImprovement;
|
|
|
|
void InitializeAmoeba();
|
|
void GetAmoebaParameterValues();
|
|
void TerminateAmoeba();
|
|
double TryAmoeba(double sum[], int high, double fac);
|
|
int PerformAmoeba();
|
|
//ETX
|
|
|
|
vtkAmoebaMinimizer(const vtkAmoebaMinimizer&); // Not implemented.
|
|
void operator=(const vtkAmoebaMinimizer&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|