制定并运行Decision Optimization模型:房屋施工进度安排
本教程说明如何使用 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 模型,必须满足以下先决条件:
- 管理员 或 编辑者 角色
- 您必须在项目中具有 管理员 或 编辑者 角色。 共享项目的查看者只能看到实验,但无法修改或运行实验
- 部署空间
- 您必须具有与 Decision Optimization 试验相关联的部署空间。 您可以在创建 Decision Optimization 试验时选择部署空间。
- 打开项目或创建空项目。
- 选择 资产 选项卡。
- 选择新资产 > 解决优化问题在里面使用模型部分。
- 在打开的 新建 Decision Optimization 试验 窗口中,输入名称。
- 单击 新建部署空间,输入名称,然后单击 创建 (或者从下拉菜单中选择现有空间)。
- 单击 创建。 方案 1 与模型一起创建,您可以在方案 1 中工作。
方案 指定要求解的数据与优化模型阐述的组合。 您可以创建具有不同数据变体和模型公式的不同方案。
准备数据
此时将打开 试验 UI ,其中显示 准备数据 视图。 您在项目中拥有的数据文件将显示在数据窗格中。 (如果需要,请单击
以打开数据窗格。) 选择三个房屋样本文件,然后单击 导入。
现在,导入的数据文件在 准备数据 视图中显示为表。 下图显示了在 方案中导入的数据文件 house_activity.csv, house_expertise.csv和 house_subcontractor.csv 。

您可以通过在表中滚动来查看所有数据。 您还可以通过单击特定数据表的 以完整方式打开表 图标来查看所有数据。 您可以直接在表中以及以完整方式编辑数据值。
选择 Modeling Assistant
- 单击侧边栏中的 构建模型 ,此时将显示一个弹出窗口,询问您要如何规划模型 (是要将辅助方式与 Modeling Assistant 配合使用,还是在 Python, OPL , LP (CPLEX) 或 CPO 代码中创建或导入模型。
- 选择 Modeling Assistant。
定义 决策域
在 " 模型 " 视图中: 选择问题的 决策域 。 在这种情况下,请选择 调度。 当前定义的 决策域 包括 调度, 资源分配, 选择和分配 以及 供应和需求 域。
- 选择 域后,将显示一个弹出窗口,供您将数据映射到调度概念 任务 和 资源。 任务是您想要规划和调度的随时间变化的任务。 必须至少定义一个要调度的任务。 在此示例中,您的任务是诸如砌筑之类的施工活动。 资源可以是人员,机器,设备或您要用于任务的任何内容。 在这种情况下,您的资源是您的分包商。
- 在 "任务" 下,单击 选择任务 ,然后从下拉列表中选择
Activity。 然后在 "资源" 下单击 选择资源 ,然后选择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 键或刷新按钮。 然后,您可以从显示的命题进行浏览和添加。
要向模型添加优先顺序约束以确保活动之间没有时间延迟,请执行以下操作:
- 复制方案 2 并将其称为方案 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。 您还可以将 按类别显示 设置为 on (在交换机上显示记号) ,然后选择过滤器 分配 以查看与分配相关的建议。
- 从过滤后的建议中,查找并添加以下约束: 对于每个 house_subcontractor-house_activity 分配,分配的 house_subContractors 必须是 house_activity 的可能分包商之一。
- 运行模型
新解决方案现在显示新的分包商分配。
有关模型 视图 的更多信息
建议 过滤器
您还可以过滤建议以查找目标和约束。 将 按类别显示 设置为 on (在交换机上显示刻度标记) ,这将打开一个窗格,供您选择各种感兴趣的类别并将过滤器应用于建议列表。 这些过滤器使您能够查看更少的建议。 如果单击搜索字段旁边的显示图标,那么可以查看调度域的所有可能的表达式 (包括已禁用的表达式)。 将鼠标悬停在每个表达式的信息图标上可提供描述。 对于将鼠标悬停在表达式本身上的已禁用术语,还提供了对此模型禁用该术语的原因的说明。
设置 选项卡
模型 视图 中的 "设置" 选项卡列出了可以编辑的不同调度和优化参数。 在此示例中,将显示缺省持续时间单位,优化运行时间和日期/时间格式。 您可以在此处指定定制的日期/时间格式以适合您的数据。
数据模式 选项卡
"数据模式" 选项卡 视图 按表列出 Modeling Assistant 已导入的所有信息,并从解决调度问题所需的输入数据中推断这些信息。 您可以编辑模式中的某些条目,这些条目将更新模型并提示您接受隐含的模型更改或取消编辑。 这对于用于数据调试目的的专家用户很有用。 例如,如果包含标识的列已推断为数字,那么将其更改为名义可能有用,以便可以将其用作主键。
决策 选项卡
您可以通过将 设置 选项卡中的 可视化和编辑决策 设置为 true来使此选项卡可视。 "决策" 选项卡显示模型中定义的决策 (或意向)。 您还可以在此处添加定制决策。 有关更多信息,请参阅 定义定制决策。
从方案生成 Python Notebook
如果要从使用 Modeling Assistant创建的模型生成 Python notebook :
- 如果方案窗格未打开,请单击 "方案" 图标。
- 单击其中一个方案旁边的三个点,然后选择 生成 Notebook。
- 输入 Notebook 的名称,然后单击 生成。
将在项目中创建此模型的 Python Notebook 。
概述 窗格
您可以在 概述 窗格中一目了然地查看所有方案的摘要信息。 通过选择方案并单击三个点,您可以针对此 视图中的任何所选方案执行诸如复制,重命名,生成 Python Notebook,导出方案或保存方案以进行部署等操作。 请参阅 查看 Decision Optimization 试验中的所有方案 ,以获取有关如何配置此窗格的更多信息。
可视化视图
在 可视化视图 中,您可以定制要从任何方案中显示的内容。 您可以查看输入数据,解决方案和添加注释。 例如,对于此房屋教程,您可以看到最佳解法调度的甘特图。
您可以使用表窗口小部件和图表窗口小部件来定制这些视图的布局。 您可以添加标题,更改背景色以及注释,表或图表的其他属性。 您可以选择不同类型的图表,如折线图,条形图等。 您可以定义如何在这些图表中聚集数据,并使用 calculate 属性定义如何在图表中表示特定数据值。
如果选择表或图表窗口小部件,那么将使用某些输入数据来显示缺省实例。 要更改此对象的内容和格式,请单击画笔图标并使用图形编辑器或通过编辑 json 文件来编辑窗口小部件。
您可以使用此 视图 来直观地比较方案。
有关更多信息,请参阅 Decision Optimization 试验中的可视化视图。