fixanddive_vb.vb


版权2023、Gurobi优化LLC狗万app足彩“实现一个简单的MIP启发式。放松模型,基于fractionality排序变量,并修复的25%部分变量接近整数变量。重复,直到放松是整数可行或“线性不可行。进口系统System.Collections进口。一般进口Gurobi类fixanddive_vb”比较类用于排序变量列表基于松弛的fractionality私人类FractionalCompare:实现IComparer (GRBVar)公共函数比较(按值传递v1 GRBVar,按值传递v2 GRBVar)作为整数_实现IComparer (Gurobi.GRBVar)。比较尽可能暗sol1双= Math.Abs (v1.X)暗sol2双= Math.Abs(需)暗frac1双=数学。Abs (sol1 -数学。地板(sol1 + 0.5))暗frac2双=数学。Abs (sol2 -数学。地板(sol2 + 0.5))如果frac1 < frac2然后返回1 ElseIf frac1 > frac2然后返回1否则返回0结束如果抓住e GRBException控制台。WriteLine(错误代码:& e。ErrorCode &”。“& e.Message)结束返回0结束函数结束类共享子主要(如果参数值传递参数arg作为String ())。长度< 1然后控制台。WriteLine(用法:fixanddive_vb文件名)返回结束如果尽可能的阅读模式昏暗env新GRBEnv()的模型作为新GRBModel (env, args (0))收集整数变量和放松他们的intvars新列表(GRBVar)()为每一个v GRBVar model.GetVars()如果v。VType < >伽马线暴。CONTINUOUS Then intvars.Add(v) v.VType = GRB.CONTINUOUS End If Next model.Parameters.OutputFlag = 0 model.Optimize() ' Perform multiple iterations. In each iteration, identify the first ' quartile of integer variables that are closest to an integer value ' in the relaxation, fix them to the nearest integer, and repeat. For iter As Integer = 0 To 999 ' create a list of fractional variables, sorted in order of ' increasing distance from the relaxation solution to the nearest ' integer value Dim fractional As New List(Of GRBVar)() For Each v As GRBVar In intvars Dim sol As Double = Math.Abs(v.X) If Math.Abs(sol - Math.Floor(sol + 0.5)) > 0.00001 Then fractional.Add(v) End If Next Console.WriteLine("Iteration " & iter & ", obj " & _ model.ObjVal & ", fractional " & fractional.Count) If fractional.Count = 0 Then Console.WriteLine("Found feasible solution - objective " & _ model.ObjVal) Exit For End If ' Fix the first quartile to the nearest integer value fractional.Sort(New FractionalCompare()) Dim nfix As Integer = Math.Max(fractional.Count / 4, 1) For i As Integer = 0 To nfix - 1 Dim v As GRBVar = fractional(i) Dim fixval As Double = Math.Floor(v.X + 0.5) v.LB = fixval v.UB = fixval Console.WriteLine(" Fix " & v.VarName & " to " & fixval & _ " ( rel " & v.X & " )") Next model.Optimize() ' Check optimization result If model.Status <> GRB.Status.OPTIMAL Then Console.WriteLine("Relaxation is infeasible") Exit For End If Next ' 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