340 likes | 573 Views
Xpress-Kalis 入门. 林森科技 2007.6. 概述. 约束规划的基本概念 建模基础 约束 枚举. 约束规划的基本概念. 一个约束规划( CP )问题由带有域的决策变量和在这些变量上的约束来定义。问题的定义通常由分支策略(也指枚举或者搜索策略)完成。 针对不同的约束采用不同的策略 约束传播:无论何时变量域被修改,即触发这个变量上所有约束的一个重求值. 约束传播示例. 建模. 用 Xpress-Kalis 创建和求解简单 CP 模型 理解和分析软件产生的输出 扩展带有数据处理的模型 定义一个目标函数 修改缺省分支策略. 模型示例.
E N D
Xpress-Kalis入门 林森科技 2007.6
概述 • 约束规划的基本概念 • 建模基础 • 约束 • 枚举
约束规划的基本概念 • 一个约束规划(CP)问题由带有域的决策变量和在这些变量上的约束来定义。问题的定义通常由分支策略(也指枚举或者搜索策略)完成。 • 针对不同的约束采用不同的策略 • 约束传播:无论何时变量域被修改,即触发这个变量上所有约束的一个重求值
建模 • 用Xpress-Kalis创建和求解简单CP模型 • 理解和分析软件产生的输出 • 扩展带有数据处理的模型 • 定义一个目标函数 • 修改缺省分支策略
模型示例 考虑下面的问题:我们希望在三个时间空挡(从1到3)安排四个会议A,B,C和D。由同一部分人参加的会议,不能在同一时间举行,即:会议A不能与会议B或者D在同一时间,会议B不能与会议C或者D在同一时间。
为了更加正式,我们可以象下面那样写出这个问题,这里planm()表示会议m的时间空挡――这些是我们问题的决策变量。为了更加正式,我们可以象下面那样写出这个问题,这里planm()表示会议m的时间空挡――这些是我们问题的决策变量。
通用结构 • 使用Kalis约束求解器 • 定义决策变量队列 • 设置变量的域 • 定义约束 • 使用函数cp_find_next_sol 求解问题
模型示例 一个科技大学需要在学期末用几个可选择的模块为课程编排考试时间。每一场考试时间为2小时。考试在两天内完成,每天的考试时间段为:8:00–10:00, 10:15–12:15, 14:00–16:00, 和16:15–18:15,也就是总共八个时间段。对于每一个考试,如果因为参加考试的人是相同的学生则考试不能发生在同一时间,这个不相容的考试集合如下表2.1所示
模型描述 • 设置变量的域 • 定义一个不相容队列
优化 • 我们最小化时间安排 • 引入新决策变量numslot ,它定义为大于每个plan的值 • 这样我们最小化numslot就得到了plan安排的最少时间 • 使用函数cp_minimize(numslot)
枚举 • 自定义枚举策略 • cp_set_branching(assign_var(KALIS_SMALLEST_DOMAIN, KALIS_MIN_TO_MAX)) • KALIS_SMALLEST_DOMAIN从域值区间最小的变量出发 • KALIS_MIN_TO_MAX从最小值到最大值进行搜索
IVE搜索树显示 • 可行解被绿色正方形表示 • 最佳解被略大的正方形标记 • 在树上的搜索框中通过指明变量名称来突出给定变量分支
第3章 约束 • all_different,全不同约束 • abs和距离约束 • element元素 约束
all_different全不同约束:Sudoku难题 • Sudoku难题,起源于日本,最近在许多西方报纸中出现过。这些难题的观点是完成一个给定的,部分地用数字1到9填充的9×9棋盘,按照这种方法――即行,列或者3×3正方形不包含重复数字。表3.1和3.2显示了这个难题的例子。同时聪明地解决这个难题,可以通过CP方法来进行。
在例子中,我们用集合XS = {A, B, . . . , I}标注棋盘的列,用集合YS = {1, 2, . . . , 9}标注行。对于在XS中的每一个x和在YS中的y,我们定义一个决策变量vxy,它取位置为(x,y)处的数为其值。
表示方法 • all_different(union(x in {’G’,’H’,’I’}, y in {1+3*i,2+3*i,3+3*i}) {v(x,y)}) • 缺省是KALIS_FORWARD_CHECKING ,前向检查策略 • 还可以采用KALIS_GEN_ARC_CONSISTENCY 通用弧一致策略
abs和距离:频率分配 我们根据离散频率带宽的需求给出了一个单元(节点)网络。每个单元对一些频率(带宽)有一定的需求。图3.1显示了网络的结构。由边连接的节点被看做是邻居。它们不能被赋予相同的频率以避免干扰。另外,如果一个单元使用几个频率,所有频率必须至少相差2。目标最小化网络中使用的频率数。
模型表述 • 定义节点集合 • 定义频率集合 • 定义频率需求集合 • 定义连接集合
实现 • distance(use(c), use(d)) >= 2 • 或者abs(use(c) - use(d)) >= 2
分离表达 • 分离表达式 • 约束表达形式
实现 • disjunctive(union(j in JOBS) {start(j)}, DURS, Disj, 1) • Star表示起始时间的矩阵 • DURS整数表达的持续时间 • Disj空矩阵,最后的结果 • 1,表示资源可占有数
Strategy(1):= settle_disjunction(Disj) • 从左到右进行搜索
第4章枚举 • 预定义搜索策略 • 中断和重新开始枚举的方法 • 搜索回退 • 用户搜索策略的定义
预定义搜索策略(域策略) • KALIS_INPUT_ORDER 按照给定顺序的变量, • KALIS_LARGEST_MAX 按照上限最大的变量, • KALIS_LARGEST_MIN 按照下限最大的变量, • KALIS_MAX_DEGREE 按照变量涉及的约束数, • KALIS_MAXREGRET_LB 按照下限和次最小值间的差异递减的顺序, • KALIS_MAXREGRET_UB 按照上限和次最大值间的差异递减的顺序, • KALIS_RANDOM_VARIABLE 按照随机选择, • KALIS_SDOMDEG_RATIO 按照域值和搜索深度比率递增的顺序, • KALIS_SMALLEST_DOMAIN 按照域值递增的顺序, • KALIS_SMALLEST_MAX 按照上限最小的变量, • KALIS_SMALLEST_MIN 按照下限最小的变量。
值策略 • KALIS_MAX_TO_MIN 以降序排列进行枚举, • KALIS_MIDDLE_VALUE 在变量域的中间值枚举第一个值, • KALIS_MIN_TO_MAX 以升序排列进行枚举, • KALIS_NEAREST_VALUE 选择接近先前由settarget指定的目标值, • KALIS_RANDOM_VALUE 从变量域内选择随机值。