Imports System Imports System.Diagnostics Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic A .NET example in Visual Basic showing how to use the stochastic hill climbing solver <c>StochasticHillClimbingSolver</c> to solve a nonlinear programming problem. W. Hock, K. Schittkowski, Test Examples for Nonlinear Programming Codes. This is problem number 86. Public Module StochasticHillClimbingExample Sub Main() Create the objective function as an instance of a class derived from DoubleFunctional. Dim F As New ObjectiveFunction() Construct the nonlinear programming problem. There are five constraints and each variable is required to be >= 0. Dim Problem As New NonlinearProgrammingProblem(F) Dim NumVars As Integer = 5 Dim NumConstraints As Integer = 10 Dim I As Integer = 0 For I = 0 To NumConstraints - 1 Value of the ith constraint function must be >= 0. Problem.AddLowerBoundConstraint(New ConstraintFunctions(I), 0.0) Next For I = 0 To NumVars - 1 Each variable must be >= 0. Problem.AddLowerBound(I, 0.0) Next Create the solver object. Dim Solver As New StochasticHillClimbingSolver() The solver is stochastic. Setting a random seed before the solver will ensure consistent results between runs. Solver.RandomSeed = &H248 Create a solver parameter object and set a time limit for the solver. By default the solver will run until a solution is found. Since this could take forever, it is a good idea to set a reasonable time limit on the solve. Here we set the time limit for ten seconds. If an optimal solution is not found within the specified time limit the solver will exit and the solvers Result property will be equal to SolverResult.SolverInterrupted. We also specify that we want to presolve. By default there is no presolve step. For some problems presolve can reduce the size and complexity and result in fewer steps to reach a solution. Dim SolverParams As New StochasticHillClimbingParameters SolverParams.TimeLimitMilliSeconds = 10000 SolverParams.Presolve = True Attempt the solver and write out the results. Solver.Solve(Problem, SolverParams) Console.WriteLine("Solver Result = " & Solver.Result) Console.WriteLine("Number of steps = " & Solver.Steps) Console.WriteLine("Optimal x = " & Solver.OptimalX.ToString("F3")) Console.WriteLine("Optimal function value = " & Solver.OptimalObjectiveFunctionValue.ToString("F3")) Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub Objective function. This is the function we want to minimize. Private Class ObjectiveFunction Inherits DoubleFunctional Constants used in evaluating the objective function. Private C_ As DoubleSymmetricMatrix Private D_ As DoubleVector Private E_ As DoubleVector Constructs an instance of the objective function. Sub New() MyBase.New(5) E_ = New DoubleVector(-15.0, -27.0, -36.0, -18.0, -12.0) D_ = New DoubleVector(4.0, 8.0, 10.0, 6.0, 2.0) C_ = New DoubleSymmetricMatrix(5) C_(0, 0) = 30 C_(0, 1) = -20 C_(0, 2) = -10 C_(0, 3) = 32 C_(0, 4) = -10 C_(1, 1) = 39 C_(1, 2) = -6 C_(1, 3) = -31 C_(1, 4) = 32 C_(2, 2) = 10 C_(2, 3) = -6 C_(2, 4) = -10 C_(3, 3) = 39 C_(3, 4) = -20 C_(4, 4) = 30 End Sub Evaluates the objective function at the given point. <param name="x">Evaluate at this point.</param> <returns>The objective function value at the point.</returns> Public Overrides Function Evaluate(X As DoubleVector) As Double Dim S1 As Double = 0 Dim S2 As Double = 0 Dim S3 As Double = 0 Dim I As Integer For I = 0 To 4 S1 = S1 + E_(I) * X(I) Dim J As Integer For J = 0 To 4 S2 = S2 + C_(I, J) * X(I) * X(J) Next S3 = S3 + D_(I) * Math.Pow(X(I), 3) Next Return S1 + S2 + S3 End Function End Class <summary> Constraint functions for the nonlinear programming problem. Constraints contain five variables. Ten different constraint objects may be constructed. </summary> Class ConstraintFunctions Inherits DoubleFunctional <summary> Coefficients for each of the ten different constraints. Each row of the matrix contains coefficients for the five variables. </summary> Private Shared AData As DoubleMatrix <summary> Constant values used in evaluating each of the ten different constraints. </summary> Private Shared BData As DoubleVector <summary> References the variable coefficients for this constraint. </summary> Private ARow As DoubleVector <summary> The constant value for this constraint. </summary> Private BValue As Double Shared Sub New() Dim ADataArray(,) As Double = New Double(,) {{-16.0, 2.0, 0.0, 1.0, 0.0}, {0.0, -2.0, 0.0, 0.4, 2.0}, {-3.5, 0, 2, 0, 0}, {0, -2, 0, -4, -1}, {0, -9, -2, 1, -2.8}, {2, 0, -4, 0, 0}, {-1, -1, -1, -1, -1}, {-1, -2, -3, -2, -1}, {1, 2, 3, 4, 5}, {1, 1, 1, 1, 1} } AData = New DoubleMatrix(ADataArray) BData = New DoubleVector(-40.0, -2.0, -0.25, -4, -4, -1, -40, -60, 5, 1) End Sub <summary> Constructs an instance of one of the ten constraint functions. </summary> <param name="i">Constraint function number. Must be between 0 and 9 inclusive.</param> <exception cref="InvalidArgumentException">Thrown if the constraint number is less than zero or greater than 9.</exception> Public Sub New(I As Integer) MyBase.New(5) If (I < 0 Or I > AData.Rows) Then Dim Msg = String.Format("Invalid constraint number {0}. Must be between 0 and 9", I) Throw New InvalidArgumentException(Msg) End If ARow = AData.Row(I) BValue = BData(I) End Sub <summary> Evaluates the constraint function at the given point. </summary> <param name="x">Point to evaluate at.</param> <returns>Constraint value at the given point.</returns> Public Overrides Function Evaluate(X As DoubleVector) As Double Return NMathFunctions.Dot(ARow, X) - BValue End Function End Class End Module End Namespace← All NMath Code Examples