' Copyright 2025, Gurobi Optimization, LLC' Want to cover four different sets but subject to a common budget of' elements allowed to be used. However, the sets have different priorities to' be covered; and we tackle this by using multi-objective optimization.ImportsGurobiClassmultiobj_vbSharedSubMain()Try' Sample dataDimgroundSetSizeAsInteger=20DimnSubsetsAsInteger=4DimBudgetAsInteger=12Dim[Set]AsDouble(,)=NewDouble(,){_
{1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},_
{0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1},_
{0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,1,1,0,0},_
{0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0}}DimSetObjPriorityAsInteger()=NewInteger(){3,2,2,1}DimSetObjWeightAsDouble()=NewDouble(){1.0,0.25,1.25,1.0}DimeAsInteger,iAsInteger,statusAsInteger,nSolutionsAsInteger' Create environmentDimenvAsNewGRBEnv("multiobj_vb.log")' Create initial modelDimmodelAsNewGRBModel(env)model.ModelName="multiobj_vb"' Initialize decision variables for ground set:' x[e] == 1 if element e is chosen for the covering.DimElemAsGRBVar()=model.AddVars(groundSetSize,GRB.BINARY)Fore=0TogroundSetSize-1DimvnameAsString="El"&e.ToString()Elem(e).VarName=vnameNext' Constraint: limit total number of elements to be picked to be at most' BudgetDimlhsAsNewGRBLinExpr()Fore=0TogroundSetSize-1lhs.AddTerm(1.0,Elem(e))Nextmodel.AddConstr(lhs,GRB.LESS_EQUAL,Budget,"Budget")' Set global sense for ALL objectivesmodel.ModelSense=GRB.MAXIMIZE' Limit how many solutions to collectmodel.Parameters.PoolSolutions=100' Set and configure i-th objectiveFori=0TonSubsets-1DimvnameAsString=String.Format("Set{0}",i)DimobjnAsNewGRBLinExpr()Fore=0TogroundSetSize-1objn.AddTerm([Set](i,e),Elem(e))Nextmodel.SetObjectiveN(objn,i,SetObjPriority(i),SetObjWeight(i),_
1.0+i,0.01,vname)Next' Save problemmodel.Write("multiobj_vb.lp")' Optimizemodel.Optimize()' Status checkingstatus=model.StatusIfstatus=GRB.Status.INF_OR_UNBDOrElse_
status=GRB.Status.INFEASIBLEOrElse_
status=GRB.Status.UNBOUNDEDThenConsole.WriteLine("The model cannot be solved "&_
"because it is infeasible or unbounded")ReturnEndIfIfstatus<>GRB.Status.OPTIMALThenConsole.WriteLine("Optimization was stopped with status {0}",status)ReturnEndIf' Print best selected setConsole.WriteLine("Selected elements in best solution:")Console.Write(vbTab)Fore=0TogroundSetSize-1IfElem(e).X<0.9ThenContinueForEndIfConsole.Write("El{0} ",e)NextConsole.WriteLine()' Print number of solutions storednSolutions=model.SolCountConsole.WriteLine("Number of solutions found: {0}",nSolutions)' Print objective values of solutionsIfnSolutions>10ThennSolutions=10EndIfConsole.WriteLine("Objective values for first {0} solutions:",nSolutions)Fori=0TonSubsets-1model.Parameters.ObjNumber=iConsole.Write(vbTab&"Set"&i)Fore=0TonSolutions-1model.Parameters.SolutionNumber=eConsole.Write("{0,8}",model.ObjNVal)NextConsole.WriteLine()Nextmodel.Dispose()env.Dispose()CatcheAsGRBExceptionConsole.WriteLine("Error code = {0}",e)Console.WriteLine(e.Message)EndTryEndSubEndClass