fixddive.py.py.


fixddive.py.py.


#!/ usr / bin / env python3.7#版权所有2021,guro狗万app足彩bi优化,llc#实施简单的MIP启发式。放宽模型,基于Fractionality排序变量,并修复25%的#最接近整数变量的分数变量。#重复直到放松是整数可行或#线性不可行。导入Sys Import Gurobipy作为Gurobipy导入Grb#关键功能,用于基于放松分级def Sortkey(V1)排序变量:SOL = V1.x Return ABS(SOL-INT(SOL + 0.5))如果LEN(sys.argv)<2:打印('用法:fixanddive.py filename')sys.exit(0)#读取模型模型= gp.read(sys.argv [1])#收集整数变量并放松它们的intvars = [] for v在model.getvars():如果v.vtype!= grb.continured:intvars + = [v] v.vtype = grb.continuous model.params.outputflag = 0 model.optimize()#执行多个迭代。在每次迭代中,识别最接近#放松中最接近整数值的整数变量的第一个#四分位数,将它们固定到最接近的整数并重复。for iter in range(1000): # create a list of fractional variables, sorted in order of increasing # distance from the relaxation solution to the nearest integer value fractional = [] for v in intvars: sol = v.x if abs(sol - int(sol+0.5)) > 1e-5: fractional += [v] fractional.sort(key=sortkey) print('Iteration %d, obj %g, fractional %d' % (iter, model.objVal, len(fractional))) if len(fractional) == 0: print('Found feasible solution - objective %g' % model.objVal) break # Fix the first quartile to the nearest integer value nfix = max(int(len(fractional)/4), 1) for i in range(nfix): v = fractional[i] fixval = int(v.x+0.5) v.lb = fixval v.ub = fixval print(' Fix %s to %g (rel %g)' % (v.varName, fixval, v.x)) model.optimize() # Check optimization result if model.status != GRB.OPTIMAL: print('Relaxation is infeasible') break