Imports System Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic Module NonlinearProgrammingExample Example illustrating using the Module ActiveSetLineSearchSQP to solve a NonLinear Programming (NLP) problem with linear constraints and variable bounds. Sub Main() min -x0*x1*x2 0 <= x0 + 2*x1 + 2*x2 <= 72, 0 <= x0, x1, x2 <= 42 Dimensionality of the domain of the objective function. Dim XDim As Integer = 3 Dim Objective As Func(Of DoubleVector, Double) = AddressOf Temp Dim Problem As New NonlinearProgrammingProblem(XDim, Objective) Add variable bounds. For I = 0 To XDim - 1 Add a lower bound of 0 and upper bound of 42 for the ith variable. Problem.AddBounds(I, 0.0, 42.0) Next Add the constraint 0 <= x0 + 2*x1 + 2*x2 <= 72. Note that this is a linear constraint. Problem.AddLinearConstraint(New DoubleVector(1.0, 2.0, 2.0), 0.0, 72) Pick the point (1, 1, 1) as initial solution guess. Dim x0 As New DoubleVector(3, 1.0) Pick a tolerance for convergence. The iteration will stop when either the magnitude of the predicted function value change or the magnitude of the step direction is less than the specified tolerance. Dim tolerance As Double = 0.0001 Dim solver As New ActiveSetLineSearchSQP(tolerance) Dim Success As Boolean = solver.Solve(Problem, x0) Console.WriteLine() Console.WriteLine("Termination status = " & solver.SolverTerminationStatus.ToString()) Console.WriteLine("X = " & solver.OptimalX.ToString()) Console.WriteLine("f(x) = " & solver.OptimalObjectiveFunctionValue) Console.WriteLine("Iterations = " & solver.Iterations) Seems like it took quite a few iterations to converge. Note that the solver computes a step direction and a step size at each iteration. The step direction is computed by forming a quadratic programming problem with linear constraints at each iteration whose solution yields the step direction. The size of the step taken in this direction is then chosen to decrease the function value and not violate constraints. Since our constraints for this problem are linear to begin with, we may try taking a larger step in order to converge faster. Well use the ConstantSQPStepSize Module with a constant step size of one and see what happens. solver.SolverOptions.StepSizeCalculator = New ConstantSQPStepSize(1) Success = solver.Solve(Problem, x0) Console.WriteLine() Console.WriteLine("Using a constant step size of 1:") Console.WriteLine("Termination status = " & solver.SolverTerminationStatus.ToString()) Console.WriteLine("X = " & solver.OptimalX.ToString()) Console.WriteLine("f(x) = " & solver.OptimalObjectiveFunctionValue) Console.WriteLine("Iterations = " & solver.Iterations) As you can see the algorithm converges must faster with the constant step size of one. In general if your constraints are all linear, or very nearly linear, the constant step size calculator may yield faster convergence. Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub Function Temp(ByVal x As DoubleVector) As Double Return -x(0) * x(1) * x(2) End Function End Module End Namespace← All NMath Code Examples