我正在研究具有两个决策变量 X 和 Y 的优化问题。
X 是一个二进制变量,它应该告诉我是否需要制作产品(我有 10 个产品)。变量 Y 是我在每个产品约束的最大小时数内可以生产的优化小时数。
目标函数
我正在尝试最大化二元决策变量 X 与该产品的生产“紧迫性”的总和,以便模型选择最紧迫的产品并尽可能多地生产。
约束条件:
我最多只能花 35 个小时来制作这些物品,即。所有产品的所有小时数的总和应小于或等于 35。我不能在这里使用等式约束,因为将来可能会遇到“最大小时数”的总和小于 35。
如果我们可以完成更多的产品,而不是生产一点点的东西,这也是更好的(这里不包括约束)。
此外,我不想生产超过个别产品所需的时间(“最大时间”)。
问题
我希望通过选择最紧急的产品并尽可能多地生产来看到总小时数接近或等于最大小时数(35)。但是,该模型并没有这样做。我不确定我的表述是否正确。可以提供一些建议吗?
谢谢
code
# import pyomo.environ as pyo
from pyomo.environ import *
from pyomo.opt import SolverFactory
line=[3]
product=[1,2,3,4,5,6,7,8,9,10]
data={3: {1: {'urgency': 0.0, 'max_hours': 0},
2: {'urgency': 0.0, 'max_hours': 0},
3: {'urgency': 0.36, 'max_hours': 5},
4: {'urgency': 0.23, 'max_hours': 2},
5: {'urgency': 0.32, 'max_hours': 6},
6: {'urgency': 0.67, 'max_hours': 10},
7: {'urgency': 10, 'max_hours': 22},
8: {'urgency': 0.73, 'max_hours': 4},
9: {'urgency': 0.81, 'max_hours': 3},
10: {'urgency': 0.43, 'max_hours': 4}}}
model = pyo.ConcreteModel()
model.x = pyo.Var(line,product, domain=pyo.Binary)
model.y = pyo.Var(line,product, within=Integers, bounds=(0,None))
model.cost = pyo.Objective(expr = sum([model.x[l,p]*data[l][p]['urgency'] for l in [3] for p in product]),sense=maximize)
model.c3 = pyo.Constraint(expr =sum(model.x[l,p]*model.y[l,p] for l in [3] for p in product)<=35)
model.constraint_prod = pyo.ConstraintList()
for l in [3]:
for p in product:
model.constraint_prod.add(expr=data[l][p]['max_hours']>=model.x[l,p]*model.y[l,p])
solver = SolverFactory('bonmin', executable='/libraries/Default_env_39400/bin/bonmin')
solver.solve(model)
model.pprint()