我有一个有效的 Miniznic 模型来安排 1 位教授有 n 名学生的个人课程(单节课安排模型的优化问题)。该模型考虑了教授和学生的可用性(硬约束)和时间偏好(目标函数)。
现在,我想扩展模型并优化课程表,以最大限度地减少课程之间的差距。
例子:
Schedule : p L p p L L . . p p L L p L L p L p p . L p L L . L p L
Real Gaps : . L p p L L . . . . L L p L L p L . . . L p L L . L p L
在哪里
`p` = 0 == Teacher available, but no Lesson
`L` = 1 == Teacher gives lesson (to student)
`.` = -1 == Teacher not available
显然,p
in slot 1 不能算作间隙。同样,插槽 9 和 10 也没有间隙。消除所有错误间隙,
Schedule
最终应该看起来像Real Gaps
数组(注意:错误间隙用.
; 与不可用相同)。
结果将是一个间隙数组[2, 1, 1, 1, 1]
(每个间隙显示它持续的插槽数)。然后,基于这样的阵列,人们可以例如制定目标以最小化整体间隙槽。
在ruby
我能够制定一个算法来做我想要的:
def gap_array(schedule_arr)
# initialize variables
start_search = false # flag for break start
break_slots = 0 # counter of break slots
res_arr = [] # resulting array
schedule_arr.each do |slot|
if slot == 1 # start watching for break
start_search = true
end
#
if start_search
if slot == 0 # == break
break_slots += 1
elsif slot == 1 # == consecutive lesson slot
if break_slots > 0 # number of break_slots > 0
res_arr.append(break_slots)
break_slots = 0
end
else # == not available
break_slots = 0 # any break so far is discarded
start_search = false
end
end
end
return res_arr
end
如何在 Minizinc 中制定这样的算法?
谢谢!