我正在尝试为我的设备创建一个约束,即它一旦启动就必须不可中断。
我的设备有最短启动时间和最长启动时间,比如说 10:00 和 20:00。它也有持续时间,比如说 6 小时。
我现在的问题是,当我运行代码时,结果并不符合预期,它在 10,11,13,14,15,16 时给了我这些时间。它不应该跳过 12 并在 15 处停止,因为我希望它继续。我试图给它某种约束,即 StartTime+Duration = Endtime
这是我正在尝试修复的代码
for idx, appliance in enumerate(appliances):
if appliance['continuous']:
for i in range(appliance['time_min'], appliance['time_max'] - appliance['duration_time'] + 2):
A_eq[idx, i + idx * 24: i + idx * 24 + appliance['duration_time']] = 1
# Ensure continuity by adding the constraint that start + duration = end
A_eq[idx, i + idx * 24 + appliance['duration_time'] - 1] = -1
else:
for i in range(appliance['time_min'], appliance['time_max'] - appliance['duration_time'] + 1):
A_eq[idx, i + idx * 24: i + idx * 24 + appliance['duration_time']] = 1
任何帮助都很棒:) 对于 linprog 来说这是否可能,或者这是一个 milp 问题?
最好从代码中退一步。这个问题通常使用初创企业的概念来建模。启动是指机器从关闭 (0) 变为开启 (1)。我们只想看到 0 或 1 家初创企业。我们可以将其实现为:
start[t] >= x[t] - x[t-1]
sum(t, start[t]) <= 1
x, start: binary variables
在第一个月期间必须要小心。这是调度文献中众所周知的方法。