[TOC]
Imports System
Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Analysis
Namespace CenterSpace.NMath.Analysis.Examples.VisualBasic
Module NonlinearProgrammingExample
Sub Main()
Dim Objective As DoubleFunctional = New ObjectiveFunction()
Dim Problem As New NonlinearProgrammingProblem(Objective)
' Dimensionality of the objective and constraint function domains
Dim xDimension As Integer = 2
' Add constraint x0*x1 - x0 -x1 <= -1.5
Problem.AddUpperBoundConstraint(xDimension, AddressOf Constraint1, -1.5)
' Add constraint x0*x1 >= -10
Problem.AddLowerBoundConstraint(xDimension, AddressOf Constraint2, -10.0)
' Set some options on the solver by creating an Options object and setting
' some properties, then use it to construct the solver instance.
Dim solveroptions As New ActiveSetLineSearchSQP.Options()
solverOptions.StepDirectionTolerance = 0.00000001
solverOptions.FunctionChangeTolerance = 0.000001
' Since our contraints are nearly linear (one quadratic term) we'll
' use the simpler constant step size.
solveroptions.StepSizeCalculator = New ConstantSQPStepSize(1)
' Create the solver with the above options and use it to solve the problem.
Dim Solver As New ActiveSetLineSearchSQP(solveroptions)
' Initial solution guess
Dim x0 As New DoubleVector(-1.0, 1.0)
Dim success As Boolean = Solver.Solve(Problem, x0)
Console.WriteLine(If(success, "Solver was successful", "Solver encountered a problem."))
Console.WriteLine("Termination status = " & Solver.SolverTerminationStatus.ToString())
Console.WriteLine("X = " & Solver.OptimalX.ToString())
Console.WriteLine("f(x) = " & Solver.OptimalObjectiveFunctionValue)
Console.WriteLine("Iterations = " & Solver.Iterations)
Console.WriteLine()
Console.WriteLine("Press Enter Key")
Console.Read()
End Sub
Function Constraint1(ByVal X As DoubleVector) As Double
Return X(0) * X(1) - X(0) - X(1)
End Function
Function Constraint2(ByVal x As DoubleVector) As Double
Return x(0) * x(1)
End Function
End Module
' <summary>
' f(x) = exp(x0)*(4*x0^2 + 2*x1^2 + 4*x0*x1 + 2*x1 + 1)
' </summary>
Class ObjectiveFunction
Inherits DoubleFunctional
' <summary>
' Constructor. Must initilialize the base Module with dimension
' of the domain, 2 in this case.
' </summary>
Public Sub New()
MyBase.New(2)
End Sub
' <summary>
' Evaluate the objective function at a point x.
' </summary>
' <param name="x">The point at which to evaluate the function.</param>
' <returns>The value of the objective function.</returns>
Public Overrides Function Evaluate(ByVal X As DoubleVector) As Double
Dim x0 As Double = X(0)
Dim x1 As Double = X(1)
Return Math.Exp(x0) * (4 * x0 * x0 + 2 * x1 * x1 + 4 * x0 * x1 + 2 * x1 + 1)
End Function
' <summary>
' Returns the gradient of the objective function at a point x.
' </summary>
' <param name="x">The point at which to evaluate the gradient.</param>
' <param name="grad">Vector into which to place the gradient values.</param>
Public Overrides Sub Gradient(ByVal X As DoubleVector, ByVal grad As DoubleVector)
Dim x0 As Double = X(0)
Dim x1 As Double = X(1)
Dim ex0 As Double = Math.Exp(x0)
grad(0) = ex0 * (4 * x0 * x0 + 2 * x1 * x1 + 4 * x0 * x1 + 2 * x1 + 1) + ex0 * (8 * x0 + 4 * x1)
grad(1) = ex0 * (4 * x0 + 4 * x1 + 2)
End Sub
End Class
End Namespace
[TOC]