问题的关键是:“对于如何在CP模型的ortools中最恰当地编码这个约束,有什么想法吗?”
我试图解决的问题有点像这里概述的员工日程安排问题:
https://developers.google.com/optimization/scheduling/employee_scheduling
问题
我想建立一个课堂作业时间表,在一段时间内每天分配学生到教室(现在,每周一次,为期两年)。
我有一所有8个教室的学校。学生被分配到教室取决于他们的年龄。每个教室都有一个与之相关的年龄范围,例如:
注意,教室的年龄范围是重叠的。
学生应在下列限制的情况下被分配到教室:
F 218。
以下是我的数据:
学生=列表;每个列表包含关于1名学生的信息:(例如,
students = [['Student ID', 'Date of Birth', 'classroom_index'], ...]
其中:
每个出生日期对象的唯一id,student
教室=列表;每个列表包含关于1个教室的信息:(例如,
classrooms = [['classroom_index', 'ageMin', 'ageMax', 'capacity']...]
其中:
上可分配到教室的学生的最大数量)
dates =涵盖预测时间表期间的日期列表;在本例中,预测时间表在未来两年中每个星期一都有:
dates = [2019/11/25, 2019/12/2, ...]
现状:
按照上面链接的员工计划代码的结构,这就是我所拥有的:
声明模型
model = cp_model.CpModel()创建变量
classroom_assignments = {}
for i, d in enumerate(dates):
for s in students:
for c in classrooms:
classroom_assignments[(i, s[0], c[0])] = model.NewBoolVar('classroom_assignments_i%is%ic%i' % (i, s[0], c[0]))把学生分配到教室
## The sum of students assigned to a classroom each day must be <= the capacity of that classroom
for i, d in enumerate(dates):
for c in classrooms:
model.Add(sum(classroom_assignments[(i, s[0], c[0])] for s in students) <= c[3])
## The sum of classrooms that a student is assigned to each day must be exactly 1
for s in students:
for i, d in enumerate(dates):
model.Add(sum(classroom_assignments[(i, s[0], c[0])] for c in classrooms) == 1)
## The sum of classrooms that a student is assigned to each day where the student's age is outside the min/max range for the classroom must be exactly 0
for s in students:
for i, d in enumerate(dates):
d_diff = dateutil.relativedelta.relativedelta(d, s[1])
age = (d_diff.years * 12)
model.Add(sum(classroom_assignments[(d, s[0], c[0])] for c in classrooms) == 1 if c[1] <= age and c[2] >= age)上面最后一个for循环是我定义约束#3的尝试,它抛出并出错:
File "<ipython-input-65-205499abc4dd>", line 15
model.Add(sum(classroom_assignments[(d, s[0], c[0])] for c in classrooms) == 1 if c[1] <= age_months and c[2] >= age_months)
^
SyntaxError: invalid syntax对于如何在CP模型的ortools中最恰当地编码这个约束,有什么想法吗?
我试图提供尽可能多的相关信息,但如果您需要更多的信息或澄清,请告诉我。
发布于 2019-11-19 15:31:37
看起来是一个简单的语法错误,用于理解的过滤器在错误的范围内。
model.Add(
sum(
classroom_assignments[(d, s[0], c[0])]
for c in classrooms
if c[1] <= age_months and c[2] >= age_months
)
== 1
)https://stackoverflow.com/questions/58937460
复制相似问题