问题描述
我在Pyomo中相当虚构,并试图为我的MIP建立约束。正在使用以下方法建立约束条件
def one_tour_per_movement_rule(mdl,i):
return(sum(mdl.a[i,j] * mdl.X[j] for j in mdl.J) == 1)
mdl.one_tour_per_movement_rule = pe.Constraint(mdl.II,rule=one_tour_per_movement_rule)
但是要花很多时间才能运行,最终崩溃。这不是大问题:
len(mdl.X) = 250000,i <= 3500
任何建议我做错了。
下面是整个代码:
import pyomo.environ as pe
from __config__ import pr_glpk_executable
from lib import load_obj
from copy import deepcopy
from datetime import datetime
# Examples: https://github.com/Pyomo/Pyomogallery/wiki
if OptData is None:
OptData = load_obj('opt_data')
dict_Movements = deepcopy(OptData.dict_Movements)
dict_Tours = deepcopy(OptData.dict_Tours)
MovPerTour = deepcopy(OptData.MovPerTour)
list_Movements = list(dict_Movements.keys())
list_Tours = list(dict_Tours.keys())
dict_tour_cost = {x: float(dict_Tours[x]['tour_cost']) for x in list_Tours}
print('Creating model ...')
# Create a concrete model
mdl = pe.ConcreteModel(name='TourOptimization')
print('Initliazing sets ...')
# Define sets ##
# Sets
# II Movements
# J Tours;
mdl.II = pe.Set(initialize=list_Movements,doc='Set of movements')
mdl.J = pe.Set(initialize=list_Tours,doc='Set of Tours')
# Create Tour selection variables
mdl.X = pe.Var(mdl.J,within=pe.Binary,doc='Decision variable on whether a tour is selected or not')
# Define parameters
print('Define cost parameters ...')
mdl.c = pe.Param(mdl.J,initialize=dict_tour_cost,default=0)
print('Define parameters alpha ... stated at {}'.format(datetime.Now()))
mdl.a = pe.Param(mdl.II,mdl.J,initialize=MovPerTour,default=0,mutable=True)
print('Define Objective func ... stated at {}'.format(datetime.Now()))
def obj_rule(mdl):
return sum(mdl.c[j] * mdl.X[j] for j in mdl.J)
mdl.objective = pe.Objective(rule=obj_rule,sense=pe.minimize)
print('Define Constrains ... stated at {}'.format(datetime.Now()))
def one_tour_per_movement_rule(mdl,rule=one_tour_per_movement_rule)
print('Solving model ... stated at {}'.format(datetime.Now()))
solver = pe.solverFactory('glpk',executable=pr_glpk_executable)
results = solver.solve(mdl)
print(results)
print('#'*50)
# sends results to stdout
results.write()
print("\ndisplaying Solution\n" + '-'*60)
mdl.X.display()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)