multiobj.py


multiobj.py


#!/usr/bin/env python3.7 # Copyright 2021, 狗万app足彩Gurobi Optimization, LLC #想覆盖三个不同的集合,但受制于#元素允许使用的共同预算。然而,这些设置有不同的优先级要覆盖;我们用多目标优化来解决这个问题。import gurobipy as gp from gurobipy import GRB import sys try:#示例数据Groundset =范围(20)子集=预算范围(4)= 12组= [[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]]SetObjPriority = [3 2 21] SetObjWeight =[1.0, 0.25, 1.25, 1.0] #创建初始模型model = gp.Model('multiobj') #初始化地面集的决策变量:# x[e] == 1如果选择元素e覆盖。Elem =模型。addVars (Groundset vtype =伽马线暴。addconstr (element .sum() <= Budget, name='Budget') #设置所有目标模型的全局意义。ModelSense =伽马线暴。MAXIMIZE # Limit how many solutions to collect model.setParam(GRB.Param.PoolSolutions, 100) # Set and configure i-th objective for i in Subsets: objn = sum(Elem[k]*Set[i][k] for k in range(len(Elem))) model.setObjectiveN(objn, i, SetObjPriority[i], SetObjWeight[i], 1.0 + i, 0.01, 'Set' + str(i)) # Save problem model.write('multiobj.lp') # Optimize model.optimize() model.setParam(GRB.Param.OutputFlag, 0) # Status checking status = model.Status if status in (GRB.INF_OR_UNBD, GRB.INFEASIBLE, GRB.UNBOUNDED): print("The model cannot be solved because it is infeasible or " "unbounded") sys.exit(1) if status != GRB.OPTIMAL: print('Optimization was stopped with status ' + str(status)) sys.exit(1) # Print best selected set print('Selected elements in best solution:') selected = [e for e in Groundset if Elem[e].X > 0.9] print(" ".join("El{}".format(e) for e in selected)) # Print number of solutions stored nSolutions = model.SolCount print('Number of solutions found: ' + str(nSolutions)) # Print objective values of solutions if nSolutions > 10: nSolutions = 10 print('Objective values for first ' + str(nSolutions) + ' solutions:') for i in Subsets: model.setParam(GRB.Param.ObjNumber, i) objvals = [] for e in range(nSolutions): model.setParam(GRB.Param.SolutionNumber, e) objvals.append(model.ObjNVal) print('\tSet{} {:6g} {:6g} {:6g}'.format(i, *objvals)) except gp.GurobiError as e: print('Error code ' + str(e.errno) + ": " + str(e)) except AttributeError as e: print('Encountered an attribute error: ' + str(e))