Imports System Imports CenterSpace.NMath.Core Namespace CenterSpace.NMath.Examples.VisualBasic <summary> A .NET example in C# showing how to solve a nonlinear programming problem that has some binary and integral constraints on its solution variables. </summary> Module BinaryNonlinearProgrammingExample The problem is: min Z = x0 + 1.5*x1 + 0.5*x2 + x3^2 + x4^2 Subject to: (x3 - 2)^2 - x4 <= 0, x3 - 2*x0 => 0, x3 - x4 - 4*(1-x1) <= 0, x3 - (1 - x0) >= 0, x4 - x1 >= 0, x3 + x4 >= 3*x2, x0 + x1 + x2 >= 1, 0 <= x3 <= 4, 0 <= x4 <= 4, In addition, x0, and x1 have binary constraints, and x2 has an integral constraint: x0, x1, = 0, 1 x2 must be an integer. Sub Main() We have 5 variables, so 5 is the x, or domain, dimension. We need this number when creating delegate functions with lambda expressions. Dim XDim As Integer = 5 Create our objective function from a delegate and use it in the mixed integer problem constructor. Dim Z As New DoubleFunctionalDelegate(XDim, AddressOf Objective) Dim Problem As New MixedIntegerNonlinearProgrammingProblem(Z) Add the constraints to our problem. (x3 - 2)^2 - x4 <= 0 Problem.AddUpperBoundConstraint(XDim, AddressOf Constraint1, 0.0) x3 - 2*x0 => 0 Problem.AddLowerBoundConstraint(XDim, AddressOf Constraint2, 0.0) x3 - x4 - 4*(1-x1) <= 0 or x3 - x4 + 4*x1 <= 4 Problem.AddUpperBoundConstraint(XDim, AddressOf Constraint3, 0.0) x3 - (1 - x0) >= 0 or x3 + x0 >= 1 Problem.AddLowerBoundConstraint(XDim, AddressOf Constraint4, 0.0) x4 - x1 >= 0 Problem.AddLowerBoundConstraint(XDim, AddressOf Constraint5, 0.0) x3 + x4 >= 3*x2 or x3 + x4 - 3*x2 >= 0 Problem.AddLowerBoundConstraint(XDim, AddressOf Constraint6, 0.0) x0 + x1 + x2 >= 1 Problem.AddLowerBoundConstraint(XDim, AddressOf Constraint7, 1.0) Add the variable bounds. 0 <= x3 <= 4 problem.AddBounds(3, 0.0, 4.0) 0 <= x4 <= 4 problem.AddBounds(4, 0.0, 4.0) Add binary constraints for x0 and x1 (variable indices 0 and 1). Problem.AddBinaryConstraint(0, 1) And the integer constraint for x2 (variable index 2). Problem.AddIntegralConstraint(2) Construct the solver and solver parameter objects. Dim Solver As New StochasticHillClimbingSolver() The solver parameters will be passed to the solver when we solve. Here we specify: Minimize the objective function, and Attempt to solve for at most 10 seconds (10000 milliseconds). If the solver fails to converge in 10 seconds, it will return and the Result field of the solver will have the value SolverInterrupted. Dim SolverParameters As New StochasticHillClimbingParameters SolverParameters.Minimize = True SolverParameters.TimeLimitMilliSeconds = 10000 Solve the problem with Imports the solver parameters and print out the results. Solver.Solve(Problem, SolverParameters) Console.WriteLine("Result: " & Solver.Result.ToString()) Console.WriteLine() Console.WriteLine("Optimal Solution: " & Solver.OptimalX.ToString()) Console.WriteLine("Optimal Function Value: " & Solver.OptimalObjectiveFunctionValue) Note that a variable with an integer constraint may not get an exact integer value in the solution. In this case x2, which has an integral constraint gets a value of about 6.48e-9 which is very, very close to 0. In general if the solver finds an optimal solution to a problem with integral constraints, the integrally constrained components of the solution should be rounded to the closest integer - or cast to ints. Console.WriteLine() Console.WriteLine("Press Enter Key") Console.Read() End Sub Function Objective(ByVal X As DoubleVector) As Double Return X(0) + 1.5 * X(1) + 0.5 * X(2) + X(3) * X(3) + X(4) * X(4) End Function Function Constraint1(ByVal x As DoubleVector) As Double Return Math.Pow(x(3) - 2.0, 2) - x(4) End Function Function Constraint2(ByVal X As DoubleVector) As Double Return X(3) - 2.0 * X(0) End Function Function Constraint3(ByVal x As DoubleVector) As Double Return x(3) - x(4) - 4.0 * (1.0 - x(1)) End Function Function Constraint4(ByVal X As DoubleVector) As Double Return X(3) - (1.0 - X(0)) End Function Function Constraint5(ByVal x As DoubleVector) As Double Return x(4) - x(1) End Function Function Constraint6(ByVal X As DoubleVector) As Double Return X(3) + X(4) - 3.0 * X(2) End Function Function Constraint7(ByVal x As DoubleVector) As Double Return x(0) + x(1) + x(2) End Function End Module End Namespace← All NMath Code Examples