此 Decision Optimization Modeling Assistant 示例显示如何创建使用 Python的高级定制约束。
开始之前
- 要求
- 要编辑和运行 Decision Optimization 模型,必须满足以下先决条件:
- 管理员 或 编辑者 角色
- 您必须在项目中具有 管理员 或 编辑者 角色。 共享项目的查看者只能看到实验,但无法修改或运行实验
- 部署空间
- 您必须具有与 Decision Optimization 试验相关联的部署空间。 您可以在创建 Decision Optimization 试验时选择部署空间。
在 Decision Optimization Modeling Assistant中打开任何 Decision Optimization 模型。 此示例使用 DO-samples中提供的 Shift
Assignment 样本,并使用 AssignmentWithOnCallDuties 方案。 此样本中的 AssignmentWithCustomRule 方案显示已添加此定制约束的已完成模型。
关于此任务
Modeling Assistant 为您的问题域提供了许多可定制的约束建议。 但是,您可能想要表达针对给定域预定义的约束之外的约束。 您可以通过使用使用 Python DOcplex的更高级定制约束来实现此目的。 此示例说明如何创建这些实例。
此视频提供了一种直观方法来了解本文档中的概念和任务。 在 Decision Optimization 试验 中装入示例后,可以关注视频。
视频免责声明: 此视频中的一些次要步骤和图形步骤可能与您的平台不同。 用户界面也经常得到改进。
请参阅此 Decision Optimization 博客 中的更多信息,了解在 IBM Data Science 社区页面上找到的使用 Python 的定制约束。
程序
要创建新的高级定制约束:
- 在打开的 Modeling Assistant 模型的 构建模型 视图 中,查看 建议 窗格。 单击搜索字段旁边的 全部显示 图标。 然后,将按类别列出所有建议。 展开 其他 部分以找到 新建定制约束,然后单击该约束以将其添加到模型中。 或者,如果未显示所有建议和类别,那么可以在搜索字段中输入 custom 以查找相同的建议,然后单击该建议以将其添加到模型中。
这样会将新的定制约束添加到模型中。

- 单击 输入约束。 将 [方括号] 用于数据,概念,变量或参数 ,并输入要指定的约束。 例如,输入 No [employees] has [onCallDuties] for more than [2] consecutive days 并按 Enter 键。
将显示该规范以及缺省参数 (
parameter1, parameter2, parameter3) ,供您定制。 这些参数将传递到实现此定制规则的 Python 函数。

- 编辑规范中的缺省参数以提供更有意义的名称。 例如,将参数更改为
employees, on_call_duties,然后 limit 并单击 Enter 键。
- 单击函数名并输入函数的名称。 例如,输入 limitConsecutiveAssignments 并单击 Enter 键。
将添加函数名,并显示
编辑 Python 按钮。

- 单击 编辑 Python 按钮。
此时将打开一个新窗口,其中显示可以编辑以实现定制规则的 Python 代码。 您可以在代码中看到定制参数,如下所示:

请注意,代码是使用您在定制规则中定义的相应数据帧和表列名记录的。 未记录此限制,因为这是数字值。
- 可选: 您可以直接在此窗口中编辑 Python 代码,但在此处使用代码之前,您可能会发现在 Notebook 中编辑和调试代码很有用。 在这种情况下,请立即在 " 方案 " 窗格中关闭此窗口,展开三个垂直点,然后为此包含定制规则的方案选择 生成 Notebook 。 输入此笔记本的名称。
将在可供您编辑和调试的项目资产中创建 Notebook。 完成编辑,运行和调试后,可以将定制函数的代码复制回 " Modeling Assistant" 中的 " 编辑 Python " 窗口中。
- 在 Modeling Assistant 定制规则 编辑 Python 窗口中编辑 Python 代码。
例如,您可以在 Python 中定义连续几天的规则,如下所示:
def limitConsecutiveAssignments(self, mdl, employees, on_call_duties, limit):
global helper_add_labeled_cplex_constraint, helper_get_index_names_for_type, helper_get_column_name_for_property
print('Adding constraints for the custom rule')
for employee, duties in employees.associated(on_call_duties):
duties_day_idx = duties.join(Day) # Retrieve Day index from Day label
for d in Day['index']:
end = d + limit + 1 # One must enforce that there are no occurence of (limit + 1) working consecutive days
duties_in_win = duties_day_idx[((duties_day_idx['index'] >= d) & (duties_day_idx['index'] <= end)) | (duties_day_idx['index'] <= end - 7)]
mdl.add_constraint(mdl.sum(duties_in_win.onCallDutyVar) <= limit)
- 单击 运行 按钮以使用定制约束运行模型。
运行完成后,您可以在 Explore 解决方案 视图中查看结果。