gc_funcnonlinear_vb.vb#

' Copyright 2024, Gurobi Optimization, LLC
'
' This example considers the following nonconvex nonlinear problem
'
'  minimize   sin(x) + cos(2*x) + 1
'  subject to  0.25*exp(x) - x <= 0
'              -1 <= x <= 4
'
'  We show you two approaches to solve it as a nonlinear model:
'
'  1) Set the paramter FuncNonlinear = 1 to handle all general function
'     constraints as true nonlinear functions.
'
'  2) Set the attribute FuncNonlinear = 1 for each general function
'     constraint to handle these as true nonlinear functions.
'

Imports System
Imports Gurobi

Class gc_funcnonlinear_vb

    Shared Sub printsol(m As GRBModel, x As GRBVar)
        Console.WriteLine("x = " & x.X)
        Console.WriteLine("Obj = " & m.ObjVal)
    End Sub

    Shared Sub Main()
        Try

            ' Create environment

            Dim env As New GRBEnv()

            ' Create a new m

            Dim m As New GRBModel(env)

            Dim x     As GRBVar = m.AddVar(-1.0, 4.0, 0.0, GRB.CONTINUOUS, "x")
            Dim twox  As GRBVar = m.AddVar(-2.0, 8.0, 0.0, GRB.CONTINUOUS, "twox")
            Dim sinx  As GRBVar = m.AddVar(-1.0, 1.0, 0.0, GRB.CONTINUOUS, "sinx")
            Dim cos2x As GRBVar = m.AddVar(-1.0, 1.0, 0.0, GRB.CONTINUOUS, "cos2x")
            Dim expx  As GRBVar = m.AddVar(0.0, GRB.INFINITY, 0.0, GRB.CONTINUOUS, "expx")

            ' Set objective

            m.SetObjective(sinx + cos2x + 1, GRB.MINIMIZE)

            ' Add linear constraints

            m.AddConstr(0.25*expx - x <= 0, "l1")
            m.AddConstr(2*x - twox = 0, "l2")

            ' Add general function constraints
            ' sinx = sin(x)
            Dim gcf1 As GRBGenConstr = m.AddGenConstrSin(x, sinx, "gcf1", "")
            ' cos2x = cos(twox)
            Dim gcf2 As GRBGenConstr = m.AddGenConstrCos(twox, cos2x, "gcf2", "")
            ' expx = exp(x)
            Dim gcf3 As GRBGenConstr = m.AddGenConstrExp(x, expx, "gcf3", "")

        ' Approach 1) Set FuncNonlinear parameter

            m.Parameters.FuncNonlinear = 1

            ' Optimize the model and print solution

            m.Optimize()
            printsol(m, x)

            ' Restore unsolved state and set parameter FuncNonlinear to
            ' its default value
            m.Reset()
            m.Parameters.FuncNonlinear = 0

        ' Approach 2) Set FuncNonlinear attribute for every
        '             general function constraint

            gcf1.Set(GRB.IntAttr.FuncNonlinear, 1)
            gcf2.Set(GRB.IntAttr.FuncNonlinear, 1)
            gcf3.Set(GRB.IntAttr.FuncNonlinear, 1)

            ' Optimize the model and print solution

            m.Optimize()
            printsol(m, x)

            ' Dispose of model and environment

            m.Dispose()
            env.Dispose()
        Catch e As GRBException
            Console.WriteLine("Error code: " + e.ErrorCode + ". " + e.Message)
        End Try
    End Sub
End Class