fixanddive.py


fixanddive.py


# !/usr/bin/env python3.7 #实现一个简单的MIP启发式。狗万app足彩放松模型,#基于分数对变量进行排序,并修复#分数变量中最接近整数变量的25%。#重复,直到松弛是整数可行或#线性不可行的。import sys import gurobipy as gp from gurobipy import GRB #用于基于松弛分数的变量排序的键函数def sortkey(v1): sol = v1。X return abs(sol-int(sol+0.5)) if len(sys.argv) < 2: print('Usage: fixanddiv .py filename') sys.exit(0) #读取模型model = gp.read(sys.argv[1]) #收集整型变量并放松它们连续:intvars += [v] v. vtype = GRB。CONTINUOUS model.Params.OutputFlag = 0 model.optimize() #执行多次迭代。在每次迭代中,识别最接近#松弛中的整数值的第一个#四分位数,将它们固定为最接近的整数,然后重复。iter的范围(1000):#创建部分变量的列表,增加#距离排序放松解决最近的整数intvars v的值分数=[]:索尔= v.X如果abs (sol - int(溶胶+ 0.5))> 1 e-5:部分+ = [v] fractional.sort(关键= sortkey)打印(“迭代% d, obj % g,分数% d ' % (iter,模型。ObjVal, len(分数))))如果len(分数)== 0:print('找到可行的解决方案-目标%g' % model.ObjVal)打破#修复第一个四分位数到最近的整数值nfix = max(int(len(分数)/4)for i in range(nfix):v =小数[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() #检查model的优化结果。地位! =伽马线暴。OPTIMAL: print('Relaxation is infeasible') break