Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# diet_vb.vb

    ' Copyright 2025, Gurobi Optimization, LLC

    ' Solve the classic diet model, showing how to add constraints
    ' to an existing model.

    Imports System
    Imports Gurobi

    Class diet_vb
        Shared Sub Main()
            Try

                ' Nutrition guidelines, based on
                ' USDA Dietary Guidelines for Americans, 2005
                ' http://www.health.gov/DietaryGuidelines/dga2005/
                Dim Categories As String() = New String() {"calories", "protein", "fat", _
                                                           "sodium"}
                Dim nCategories As Integer = Categories.Length
                Dim minNutrition As Double() = New Double() {1800, 91, 0, 0}
                Dim maxNutrition As Double() = New Double() {2200, GRB.INFINITY, 65, 1779}

                ' Set of foods
                Dim Foods As String() = New String() {"hamburger", "chicken", "hot dog", _
                                                      "fries", "macaroni", "pizza", _
                                                      "salad", "milk", "ice cream"}
                Dim nFoods As Integer = Foods.Length
                Dim cost As Double() = New Double() {2.49, 2.89, 1.5R, 1.89, 2.09, 1.99, _
                                                     2.49, 0.89, 1.59}

                ' Nutrition values for the foods
                ' hamburger
                ' chicken
                ' hot dog
                ' fries
                ' macaroni
                ' pizza
                ' salad
                ' milk
                ' ice cream
                Dim nutritionValues As Double(,) = New Double(,) {{410, 24, 26, 730}, _
                                                                  {420, 32, 10, 1190}, _
                                                                  {560, 20, 32, 1800}, _
                                                                  {380, 4, 19, 270}, _
                                                                  {320, 12, 10, 930}, _
                                                                  {320, 15, 12, 820}, _
                                                                  {320, 31, 12, 1230}, _
                                                                  {100, 8, 2.5, 125}, _
                                                                  {330, 8, 10, 180}}

                ' Model
                Dim env As New GRBEnv()
                Dim model As New GRBModel(env)

                model.ModelName = "diet"

                ' Create decision variables for the nutrition information,
                ' which we limit via bounds
                Dim nutrition As GRBVar() = New GRBVar(nCategories - 1) {}
                For i As Integer = 0 To nCategories - 1
                    nutrition(i) = model.AddVar(minNutrition(i), maxNutrition(i), 0, _
                                                GRB.CONTINUOUS, Categories(i))
                Next

                ' Create decision variables for the foods to buy
                '
                ' Note: For each decision variable we add the objective coefficient
                '       with the creation of the variable.
                Dim buy As GRBVar() = New GRBVar(nFoods - 1) {}
                For j As Integer = 0 To nFoods - 1
                    buy(j) = model.AddVar(0, GRB.INFINITY, cost(j), GRB.CONTINUOUS, _
                                          Foods(j))
                Next

                ' The objective is to minimize the costs
                '
                ' Note: The objective coefficients are set during the creation of
                '       the decision variables above.
                model.ModelSense = GRB.MINIMIZE

                ' Nutrition constraints
                For i As Integer = 0 To nCategories - 1
                    Dim ntot As GRBLinExpr = 0
                    For j As Integer = 0 To nFoods - 1
                        ntot.AddTerm(nutritionValues(j, i), buy(j))
                    Next
                    model.AddConstr(ntot = nutrition(i), Categories(i))
                Next

                ' Solve
                model.Optimize()
                PrintSolution(model, buy, nutrition)

                Console.WriteLine(vbLf & "Adding constraint: at most 6 servings of dairy")
                model.AddConstr(buy(7) + buy(8) <= 6, "limit_dairy")

                ' Solve
                model.Optimize()

                PrintSolution(model, buy, nutrition)

                ' 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

        Private Shared Sub PrintSolution(ByVal model As GRBModel, ByVal buy As GRBVar(), _
                                         ByVal nutrition As GRBVar())
            If model.Status = GRB.Status.OPTIMAL Then
                Console.WriteLine(vbLf & "Cost: " & model.ObjVal)
                Console.WriteLine(vbLf & "Buy:")
                For j As Integer = 0 To buy.Length - 1
                    If buy(j).X > 0.0001 Then
                        Console.WriteLine(buy(j).VarName & " " & buy(j).X)
                    End If
                Next
                Console.WriteLine(vbLf & "Nutrition:")
                For i As Integer = 0 To nutrition.Length - 1
                    Console.WriteLine(nutrition(i).VarName & " " & nutrition(i).X)
                Next
            Else
                Console.WriteLine("No solution")
            End If
        End Sub
    End Class

Help and Feedback

Press `/` or click to search this documentation | Gurobi website | Gurobi community forum
Go to other Gurobi documentation | Gurobi download | Contact support