Try our new documentation site (beta).
Filter Content By
Version
Text Search
${sidebar_list_label} - Back
Filter by Language
diet_vb.vb
' Copyright 2024, 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