本教程说明如何使用 Modeling Assistant 为房屋建筑调度问题定义,规划和运行模型。 DO-samples中还提供了包含数据的已完成模型,请参阅 Decision Optimization 试验样本 (Python, OPL , Modeling Assistant)。
问题
您需要为一个房屋建造项目规划并安排活动和承包人。 您的调度必须在特定日期开始。 所有的活动(砌筑、木工、管道布设,等等)都必须纳入安排,而且各项活动必须按指定的顺序进行(例如,屋顶完工后才能安装窗户)。 每位承包人都可以执行某些必要活动,而且具有不同的技能水平。 您的调度必须确定建造项目的最佳(最早)结束时间(请确保已将所有活动纳入安排),并决定分配哪位承包人来完成每一项活动。 另外,您希望了解如何优化此项目中各位承包人的技能水平。
数据
此项目中的数据如以下电子表格所示。 对于每一项活动,您掌握完成该活动所需的持续时间,必须在该活动之前完成的活动,以及有空并有资格执行该活动的承包人。
为方便演示,仅显示 10 项活动和 3 位承包人。 通过 Decision Optimization ,可以轻松更改数据并使用更大的数据集来解决相同的问题。
对于每项活动,还有关于每位承包人对于该项活动所具有的专业知识水平的数据。 数值越大表示承包人的专业知识水平越高。 承包人的技能水平为零表示不得分配其执行该项任务。 下表显示这个电子表格的部分内容。
另外,还有一个表,其中包含可用于此项目的承包人姓名(Joe、Jack,等等)。
获取本示例的数据文件
此示例中使用的数据文件在 DO-samples中提供。 通常,您会将文件作为数据资产存储在项目中,或者以本地方式存储在机器上。 但是,为了便于说明,您可以自行构建模型,在此示例中,您将首先将数据文件下载到机器上,然后将其导入到刚刚创建的项目中。 还提供了包含导入数据的完整模型公式作为示例,请参阅HouseConstructionScheduling在DO 样品。
- 将所有 DO-samples 下载并解压缩到您的机器上。
- 打开项目。
- 要打开数据窗格,请单击 添加数据 +。
- 选择 将数据文件放在此处或浏览以查找要上载的文件。
- 浏览已下载的 DO-samples 以在 datasets 文件夹中找到
house_activity.csv
,house_expertise.csv
和house_subcontractor.csv
。 - 单击 打开。 文件将作为数据资产上载到项目。
创建 方案
- 要求
- 要编辑和运行 Decision Optimization 模型,必须满足以下先决条件:
- 管理员 或 编辑者 角色
- 您必须在项目中具有 管理员 或 编辑者 角色。 共享项目的查看者只能看到实验,但无法修改或运行实验
- Machine Learning 服务
- 您必须具有与项目关联的 Machine Learning 服务。 您可以在创建 Decision Optimization 试验时添加一个。
- 部署空间
- 您必须具有与 Decision Optimization 试验相关联的部署空间。 您可以在创建 Decision Optimization 试验时选择部署空间。
要创建 方案:
- 打开项目或创建空项目。
- 选择 资产 选项卡。
- 选择新资产 > 解决优化问题在里面使用模型部分。
- 在打开的 新建 Decision Optimization 试验 窗口中,输入名称。
- 如果您还没有将 "watsonx.ai运行时间服务与项目关联起来,则必须先选择 "添加 "Machine Learning服务来选择或创建一个服务,然后再为 "试验选择部署空间。
- 单击 新建部署空间,输入名称,然后单击 创建 (或从下拉菜单中选择现有空间)。
- 单击 创建。 方案 1 随即与该模型一起创建,您在方案 1 中工作。
方案 指定要求解的数据与优化模型阐述的组合。 您可以使用不同的数据变体和模型规划创建不同的方案。
准备数据
此时将打开 试验 UI ,其中显示 准备数据 视图。 项目中的数据文件会显示在数据窗格中。 (如果需要,请单击 以打开数据窗格。) 选中三个房屋样本文件,然后单击导入。
现在,导入的数据文件在 准备数据 视图中显示为表。 下图显示了在 方案中导入的数据文件 house_activity.csv
, house_expertise.csv
和 house_subcontractor.csv
。
您可通过在表中滚动以查看所有数据。 另外,也可以通过单击特定数据表的以完全方式打开表图标来查看所有数据。 您可以直接在表中以及完整方式下编辑数据值。
选择 Modeling Assistant
- 单击侧边栏中的 构建模型 ,此时将显示一个弹出窗口,询问您要如何规划模型 (是要将辅助方式与 Modeling Assistant 配合使用,还是在 Python, OPL , LP (CPLEX) 或 CPO 代码中创建或导入模型。
- 选择 Modeling Assistant。
定义 决策域
在 " 模型 " 视图中: 选择问题的 决策域 。 在此情况下,选择调度。 当前定义的 决策域 为 调度, 资源分配, 选择和分配 和 供应和需求 域。
- 选择 域后,将显示一个弹出窗口,供您将数据映射到调度概念 任务 和 资源。 任务是您随时间推移而要规划和调度的任何内容。 必须至少定义一个要调度的任务。 在本示例中,您的任务是建造活动,例如砌筑。 资源可以是人力、机器、设备或任何要用于任务的内容。 在本例中,资源是承包人。
- 在“任务”下,单击选择任务,然后从下拉列表中选择
house_activity
。 然后,在“资源”下,单击选择资源并选择house_subcontractor
。 供您选择的可能任务及资源的名称取自已导入的数据。 在本示例中,您只需映射活动和承包人,但是,如果模型有需要,您可添加其他任务和资源映射。 您可以通过将鼠标悬停在映射上并选择 "删除" 图标来除去任何映射。 - 单击 继续。
任务使用资源的方式
在窗口中,针对每一项所要调度的任务,您有三个选项:
- 使用资源并分配:您可选中所有选项,并选择将活动分配给特定承包人。 这表示您想获取房屋建造活动序列最佳的房屋建造活动调度,确保将开始时间、持续时间和优先顺序等等纳入考量,而且将指定的承包人分配给活动。 缺省情况下,该选项被选中。
- 使用没有分配的资源: 您可以使用资源,并清除 在分配时 ... 复选框以选择不将特定合同工分配给您的活动。 这表示您想获取具有房屋建造活动最佳序列的房屋建造活动调度,确保将开始时间、持续时间和优先顺序等等纳入考量。 您仍然希望在获取的调度中考虑您可用的分包商的数量和类型 (例如, 3 个水管工, 2 个木工, ... ) , 但他们不必分配给特定人员 (例如 Joe , Jack 和 Jim)。
使用资源时,无论是否进行分配,您还可以决定向模型中添加进一步的时间型容量约束。 例如,可以对任意给定时间可并行使用的承包人数目指定限制,或者对某时间段内个别或总体的承包人可用工时指定限制。
有关无分配的调度示例,请参阅 DO-samples中的 BridgeScheduling 。
- 在没有资源的情况下继续:您可以取消选中所有选项,直接单击继续,在忽略所有资源限制的情况下调度任务。 这表示您想获取具有房屋建造活动最佳序列的调度,确保将开始时间、持续时间和优先顺序等等纳入考量,但不考虑承包人。
对于本示例:
- 选择具有所有选项的缺省设置 (使用资源 ... ) 分配时 ...) 然后单击 继续 。
现在,您想解决的问题已表达为简洁的陈述。
- 单击 完成。
您将返回到 "模型" 视图。 您随时可以单击“编辑意图”(铅笔)图标并重新定义映射和调度选项,以重新编辑问题定义。
模型规划
现在,您已指定要解决的问题, Modeling Assistant 在此模型 视图中为您提供了部分完成的阐述。 目标 和 约束 窗格包含将运行的模型。 " 添加到模型 " 窗格包含可以包含在模型阐述中的更多建议。 如果已调整窗口大小,那么可能在“目标和约束”下显示“添加到模型”窗格。
模型由所要实现的目标(最大化或最小化)以及必须满足的一些约束所组成。 对于此类调度问题,您的目标是制定最佳的调度。 在本例中,最佳调度就是可以最大限度减少完成所有活动所用时间的调度。 (您想尽快完成房屋建造,因为这可以缩减成本。) 此目标与一些标准调度约束已自动添加到模型中。 您还可以使用 "目标搜索" 字段来搜索目标和约束。
- 此调度从您为建造项目定义的开始时间开始执行
- 每位承包人一次只能分配给一项任务。
- 每项活动都获分配一位承包人
- 所有活动都存在于调度中,换言之,在调度中不会省略任何活动
- 遵守每项活动的持续时间
约束可能会以不同的顺序显示。 此外,还有一项约束会自动添加到所有含任务分配的调度问题。 这使您能够接受或拒绝分配在调度的活动期间没空的承包人。 在本示例中,不会对没空的时间段加以考虑,因此请按原样保留缺省情况下出现的此项约束。
某些约束有更多详细信息,您可通过单击每一行上的箭头来显示或隐藏这些详细信息。 约束旁边的条形表示存在必须添加的值或定义。 您可通过单击带下划线的词条并输入内容或从下拉菜单中选择来添加项,而且必须先完成模型才能运行,但在运行前,请先按本节稍后所述复制方案,以保存一个副本。
在方案的模型 视图 中,如果单击 Modeling Assistant旁边的 "替换" 图标 ,那么将返回到您选择是使用 Modeling Assistant 还是在 Python notebook 中使用 Python 或 OPL 创建模型,还是导入现有模型的屏幕。 如果您选择在此阶段替换模型,那么会覆盖当前模型,您的更改会丢失。 如果您想保留一份进行中的当前工作,请先创建新方案,再更改模型。
复制方案
要保留此模型的副本,请建立此方案的副本:
- 如果方案窗格未打开,请单击方案图标。
- 单击方案 1 旁边的三个点,并选择复制。
- 例如,输入新方案的名称 Scenario 2,然后单击 创建。 您在方案 2 中继续工作。
完成模型
- 如有必要,通过单击该行上的箭头,展开持续时间约束,以显示完整定义。 选择突出显示的 definition ,然后选择列名
Duration in days
。 缺省持续时间单位以缺省持续时间单位表示随即添加到该约束末尾。 您可通过单击缺省持续时间单位并选择天进行修改,但缺省单位为天。 您也可以在设置面板中,修改缺省持续时间单位,并定制定义日期和时间的方式。 您完成持续时间约束后,该行便不再突出显示。 - 在“调度开始时间”约束中,单击显示的日期。 然后,输入日期(或日期和时间),并从下拉菜单中选择该日期,以替换当前显示的日期。 如果输入不含时间的日期,那么会使用缺省时间 00:00。
输入值之后,约束将不再突出显示。 但是,该模型尚未完成。 您可能希望该调度将各项任务的优先顺序纳入考量,确保每项活动只能在那些必须在其之前完成的活动完成后开始。 您稍后会添加此约束。
如果您的模型有其他目标和约束,您可使用在我的目标和约束中查找搜索字段进行浏览或过滤。
通过单击语句旁边的 3 个垂直点,您可选择禁用或移除模型中的任何一个目标或约束。 此菜单还使您能够通过将语句上移和下移来重新组织其顺序,您还可以复制语句。
完成模型后,或者在没有任何目标或约束仍突出显示时,您可运行该模型,以寻找可根据模型目标和约束确定最优调度的解决方案。
运行模型
您可以在 构建模型 查看 中通过单击建议旁边的 设置 选项卡来更改模型的求解时间限制。 对于本示例,请使用缺省限制。 还可以使用 运行配置 参数来设置其他参数 (请参阅 在 Decision Optimization 试验中配置方案的运行参数 以获取更多信息)。
在方案 2 中,单击 运行 按钮。 找到初始目标值后,将在 求解进度 图中显示 组合目标 。 如果您希望在获得最优解之前结束运行,您可单击停止以退出。 找到最优解后,将打开 浏览解 视图 。
您的解决方案
运行完成后,您可以在 Explore 解决方案 视图中查看结果。 您还可以单击 引擎统计信息 或 日志 以查看解决方案图表并检查日志文件。 浏览解 视图 中的第一个选项卡显示目标 (如果有多个目标) 及其值和权重。 解表选项卡提供最佳调度,以及活动到承包人的分配。
您还可以 csv
文件形式下载解决方案表。
如果模型中存在任何有冲突的约束,那么这些约束会显示在冲突选项卡中,并提供求解该模型所必需的松驰。
在 可视化 视图中,单击 甘特图 以将解决方案显示为甘特图。
创建新方案 - 不同的模型,相同的数据
虽然您已解析该模型,现在已有各项活动的最优调度并已分配承包人,但是尚未考虑各项活动的优先顺序,进行分配时也未考虑承包人的技能水平数据。 方案使您能够分析和比较不同的模型及数据。
首先,检查具有一项额外约束的新方案:
在模型 视图的 " 建议 " 窗格中提供了其他目标和约束。 您可单击这些目标和约束,将其添加到模型中。 要查看未列出的其他建议,请开始在搜索字段中输入,然后按 Enter 键或刷新按钮。 然后,您可进行浏览并从显示的提议中添加。
要向模型中添加优先顺序约束,以确保各项活动之间不会出现时间延迟,请完成下列步骤:
- 复制 Scenario 2,并将其命名为 Scenario 3。 然后关闭方案窗格。
- 在模型 视图的 "建议" 窗格中,输入自然语言 activity after preceding activities,例如,在搜索字段中输入,然后单击 Enter 键。
- 从新建议列表中,单击每个 house_activity 在先前活动结束后开始,以将其添加到约束中。
新的优先顺序约束随即显示在模型规划中。
- 重新运行该模型(方案 3)并查看新的解决方案。 没有此约束的情况下解析模型时,您可以将这个解决方案与方案 2 中获得的解决方案作比较。 要比较解决方案,请打开 打开方案窗格 窗格,然后单击每个方案。 您还可以在 可视化 视图 中单击甘特图,并比较显示为每个方案的甘特图的解。
- 复制方案 3 并将其称为方案 4。 然后关闭方案窗格。
要将技能水平最高的承包人分配给活动,请完成下列步骤:
- 在模型 视图中,在建议搜索字段中输入 overall
quality 以查找以下目标并将其添加到模型中:
根据分配值表,最大程度地提高 house_subcontractor-house_activity 分配的总体质量。
单击带下划线的 <table of assignment value> ,然后输入或选择 house_expertise。
现在,您的新目标是根据 house_expertise 最大程度地提高 house_subcontractor-house_activity 分配的总体质量。 展开目标并选择 Activity 作为任务,选择 Subcontractor 作为资源,选择 Skill level 作为值 (表列) 以完成定义。
现在,您已有两个目标。 您可以决定这两个目标是同等重要,还是具有不同的权重。 通过使用相邻滑块,可以增大或减小每个目标的权重。 请将两个滑块都调整到 5,以使两个目标同等重要。 您还可以为目标添加比例因子。 对于此示例,请将比例因子保留为 1。 有关更多信息,请参阅 解决方案中显示的权重和比例因子。
- 要确保承包人仅承接他们获准执行的任务,请添加一个新约束。 输入建议,例如, subcontractor must be one of possible subcontractors。 您还可以将按类别显示设置为开启(在开关上显示一个勾号),并选择过滤器分配以查看与分配相关的建议。
- 从已过滤的建议中,查找并添加以下约束:对于每个 house_subcontractor-house_activity 分配,分配的 house_subcontractors 必须是 house_activity 的可能的承包人之一。
- 运行该模型
新的解决方案现在会显示承包人的新分配。
有关模型 视图 的更多信息
建议过滤器
您还可以对建议进行过滤,以查找目标和约束。 将按类别显示设置为开启(在开关上显示一个勾号),这将打开一个窗格,供您选择感兴趣的各种类别,并将过滤器应用于建议列表。 过滤器可使您查看更少的建议。 如果单击搜索字段旁边的显示图标,那么可以看到调度域的所有可能的表达式 (包括已禁用的表达式)。 将鼠标指针悬停在每个表达式的信息图标上,即可获得描述。 对于已禁用的项,悬停在表达式本身上时,还可获得针对该模型禁用的原因说明。
设置 选项卡
模型 视图 中的 "设置" 选项卡列出了可以编辑的不同调度和优化参数。 在本示例中,将会显示缺省持续时间单位、优化运行时间和日期/时间格式。 在这里,您可指定定制的日期/时间格式,以适合您的数据。
数据模式选项卡
"数据模式" 选项卡 视图 按表列出 Modeling Assistant 已导入并从解决调度问题所需的输入数据中推断的所有信息。 您可以编辑该模式中的某些条目,这些条目将更新该模型,并提示您接受隐式模型更改或取消编辑。 此选项卡对于专家用户进行数据调试可能非常有用。 例如,如果已将包含标识的列推断为“数字”,那么可能最好将其更改为“名义”,这样就可以将其用作主键。
决策 选项卡
您可以通过将设置选项卡中的可视化和编辑决策设置为 true
,使此选项卡变为可视。 “决策”选项卡显示模型中定义的决策(或意图)。 您还可以在此处添加定制决策。 有关更多信息,请参阅 定义定制决策。
从方案生成 Python Notebook
如果要从使用 Modeling Assistant创建的模型生成 Python notebook :
- 如果方案窗格尚未打开,请单击“方案”图标。
- 单击其中一个方案旁边的三个点,然后选择生成 notebook。
- 输入 Notebook 的名称,然后单击 生成。
将在项目中创建此模型的 Python Notebook 。
概述 窗格
您可以在 概述 窗格中一目了然地查看所有方案的摘要信息。 通过选择方案并单击三个点,您可以针对此 视图中的任何所选方案执行诸如复制,重命名,生成 Python Notebook,导出方案或将其保存以进行部署等操作。 请参阅 查看 Decision Optimization 试验中的所有方案 ,以获取有关如何配置此窗格的更多信息。
可视化视图
在 " 可视化视图 " 中,您可以定制要从任何场景中显示的内容。 您可查看输入数据和解决方案,以及添加注释。 例如,对于这个房屋教程,您可以看到最优解调度的甘特图。
可以使用表窗口小部件和图表窗口小部件,以定制这些视图的布局。 您可以添加标题,以及更改注释、表或图表的背景色和其他属性。 可以选择不同类型的图表,例如折线图、条形图,等等。 您可以定义在这些图表中聚集数据的方式,以及使用 calculate
属性来定义如何在图表中表示特定的数据值。
如果您选择表或图表窗口小部件,那么将会使用部分输入数据来显示缺省实例。 要更改此对象的内容和格式,请单击铅笔图标,并通过图形编辑器或通过编辑 json
文件来编辑该窗口小部件。
您可以使用此 视图 来直观地比较方案。
有关更多信息,请参阅 Decision Optimization 试验中的 "可视化" 视图。