|
|
(9 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
| ITK optimizers are generic classes, which can be used independently of registration. This example demonstrates use of the itk::AmoebaOptimizer class in optimizing a simple paraboloid function.
| | {{warning|1=The media wiki content on this page is no longer maintained. The examples presented on the https://itk.org/Wiki/* pages likely require ITK version 4.13 or earlier releases. In many cases, the examples on this page no longer conform to the best practices for modern ITK versions. |
| | }} |
|
| |
|
| Contributed by: Davis Vigneault
| | [https://itk.org/ITKExamples[ITK Sphinx Examples]] |
| | |
| ==AmoebaOptimizerExample.cxx==
| |
| <source lang="cpp">
| |
| | |
| // Set properties pertinent to convergence
| |
| optimizer->SetMaximumNumberOfIterations( 100 );
| |
| optimizer->SetParametersConvergenceTolerance( 0.01 );
| |
| optimizer->SetFunctionConvergenceTolerance( 0.01 );
| |
| | |
| // Instantiate the cost function
| |
| // The cost function is a 2D paraboloid in the x-y plane
| |
| // with the equation f(x,y) = (x+5)^2+(y-7)^2 + 5
| |
| // and a global minimum at (x,y) = (-5, 7)
| |
| CostType::Pointer cost = CostType::New();
| |
| | |
| // Assign the cost function to the optimizer
| |
| optimizer->SetCostFunction( cost.GetPointer() );
| |
|
| |
| // Set the initial parameters of the cost function
| |
| OptimizerType::ParametersType initial(2);
| |
| initial[0] = 123;
| |
| initial[1] = -97.4;
| |
| optimizer->SetInitialPosition( initial );
| |
| | |
| // Begin the optimization!
| |
| optimizer->StartOptimization();
| |
| | |
| // Print out some information about the optimization
| |
| std::cout << "Position: " << optimizer->GetCurrentPosition() << std::endl;
| |
| std::cout << "Value: " << optimizer->GetValue() << std::endl;
| |
| | |
| // As expected, the position is near to (-5, 7) and the value to 5
| |
| // Position: [-5.003825599641884, 6.998563761340231]
| |
| // Value: 5.00002
| |
| return EXIT_SUCCESS;
| |
| | |
| }
| |
| | |
| </source>
| |
| | |
| ==ExampleCostFunction.h==
| |
| <source lang="cpp">
| |
| | |
| | |
| #ifndef __itkExampleCostFunction_h
| |
| #define __itkExampleCostFunction_h
| |
| | |
| #include "itkSingleValuedCostFunction.h"
| |
| | |
| namespace itk
| |
| {
| |
| class ExampleCostFunction :
| |
| public SingleValuedCostFunction
| |
| {
| |
| public:
| |
| /** Standard class typedefs. */
| |
| typedef ExampleCostFunction Self;
| |
| typedef SingleValuedCostFunction Superclass;
| |
| typedef SmartPointer<Self> Pointer;
| |
| typedef SmartPointer<const Self> ConstPointer;
| |
| | |
| /** Method for creation through the object factory. */
| |
| itkNewMacro(Self);
| |
| | |
| /** Run-time type information (and related methods). */
| |
| itkTypeMacro(ExampleCostFunction, SingleValuedCostfunction);
| |
| | |
| unsigned int GetNumberOfParameters(void) const { return 2; } // itk::CostFunction
| |
| | |
| MeasureType GetValue(const ParametersType & parameters) const {
| |
| return pow(parameters[0]+5, 2)+pow(parameters[1]-7, 2)+5;
| |
| }
| |
| | |
| void GetDerivative(const ParametersType & parameters,
| |
| DerivativeType & derivative ) const {
| |
| throw itk::ExceptionObject( __FILE__, __LINE__, "No derivative is available for this cost function.");
| |
| }
| |
| | |
| protected:
| |
| ExampleCostFunction(){};
| |
| ~ExampleCostFunction(){};
| |
| | |
| private:
| |
| ExampleCostFunction(const Self &); //purposely not implemented
| |
| void operator = (const Self &); //purposely not implemented
| |
| };
| |
| | |
| } // end namespace itk
| |
| | |
| #endif
| |
| | |
| </source>
| |
| | |
| | |
| {{ITKCMakeLists|{{SUBPAGENAME}}}}
| |