bilinear_vb.vb#

' Copyright 2025, Gurobi Optimization, LLC */

' This example formulates and solves the following simple bilinear model:
'
'     maximize    x
'     subject to  x + y + z <= 10
'                 x * y <= 2          (bilinear inequality)
'                 x * z + y * z == 1  (bilinear equality)
'                 x, y, z non-negative (x integral in second version)

Imports Gurobi

Class bilinear_vb
    Shared Sub Main()
        Try
            Dim env As New GRBEnv("bilinear.log")
            Dim model As New GRBModel(env)

            ' Create variables

            Dim x As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "x")
            Dim y As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "y")
            Dim z As GRBVar = model.AddVar(0, GRB.INFINITY, 0, GRB.CONTINUOUS, "z")

            ' Set objective
            Dim obj As GRBLinExpr = x
            model.SetObjective(obj, GRB.MAXIMIZE)

            ' Add linear constraint: x + y + z <= 10

            model.AddConstr(x + y + z <= 10, "c0")

            ' Add bilinear inequality: x * y <= 2

            model.AddQConstr(x * y <= 2, "bilinear0")

            ' Add bilinear equality: x * z + y * z == 1

            model.AddQConstr(x * z + y * z = 1, "bilinear1")

            ' Optimize model

            model.Optimize()

            Console.WriteLine(x.VarName & " " & x.X)
            Console.WriteLine(y.VarName & " " & y.X)
            Console.WriteLine(z.VarName & " " & z.X)

            Console.WriteLine("Obj: " & model.ObjVal & " " & obj.Value)

            x.Set(GRB.CharAttr.VType, GRB.INTEGER)
            model.Optimize()

            Console.WriteLine(x.VarName & " " & x.X)
            Console.WriteLine(y.VarName & " " & y.X)
            Console.WriteLine(z.VarName & " " & z.X)

            Console.WriteLine("Obj: " & model.ObjVal & " " & obj.Value)

            ' Dispose of model and env

            model.Dispose()

            env.Dispose()
        Catch e As GRBException
            Console.WriteLine("Error code: " & e.ErrorCode & ". " & e.Message)
        End Try

    End Sub
End Class