目录
9 Issues in constraint programming
9.1 Modeling
- Q: 举例说明不同的modeling
A: 举例:是否引入辅助变量。
举例:不同的语法表示同样语义(如all_different
)
举例:增加新标识符(“新语法”)表示相同语义,并引入对应新规则。 - Q: 一些总体原则
- 更()的变量,更简单(容易表达,容易传播的)约束
- 传播需要预处理少,威力大(类比游戏技能)
- 涉及()逻辑运算,则容易()
A: 少,析取,分类讨论组合爆炸
- Q: 为什么需要Global constraints?
A: Global constaints语法复杂。但可能有些定制手段,方便传播。
比如all_different
,(任务安排)的cumulative
,sortedness
等(可以用跟排序有关的算法)
9.2 Constraint programming languages
- Q: 简要阐述“two-level architecture”
A: 提示:回忆\(\mathcal C, \mathcal D\mathcal E\),一个是约束集合,一个是变量集合。
除了要维护变量集合,还要维护约束集合(新加入时用指定求解器传播,传播失败则回溯……等等) - Q: 如何解决constraint variables相比一般变量需要更复杂的结构和专门处理?
A: logic programming中logic variable
或专门定义类(C++)等
9.3 Constraint propagation
- Q: local consistency相关(一般)算法在具体问题可能效率低,但是这些local consistency notions()
A: 可以启发(特殊)算法设计,帮助证明正确性等等。
9.4 Constraint solvers
- Q: 和纯理论相比,在实际中有哪些加速constraint solvers效率的方法?
A: 采用更底层的手段写,而不是“调包写”(即:手动优化,造出一个“黑箱”优化器给上层用)
考虑incrementality(对于基于“偏序集”迭代的那些方法可以机械地modify. 对于complete solvers往往“一题一法”) - Q: 归纳和子句有何关系?
A: 往往一个子句表示“归纳起点”,一个子句表示归纳过程。 - Q: 举例说明简化约束语法的方法。
A: 如设法减少用到的函项、谓词、变量数量。
通过某些“规范化”的形式表示(例如针对线性方程)
9.5 Search
- Q: versioning和回溯有什么关系?这对你的工作有什么启发?
A: 做好版本管理,github分支等,出问题就回溯(血泪教训) - Q: best-first和limited discrepancy联合起来有何意义,具体如何执行?
A: 总体上讲和best-first思想相近:“先看那些最好,最好不行就稍微偏一点点再看……”
具体可能类似于\(000,(100,010,001)\)这种“对角线”感觉。 - Q: local-search和上题有何联系?
A: 上面的有点像特定点("best")开始的local-search(只不过wave相比move来说,一次包含更多proposal) - Q: 如何逃脱爬山算法中的局部极值?
A: 比如重新定义邻居(升维),强行逃,重启等。
例:皇后问题中,“调换行”或“单独改一个皇后的行数”都是可能的“邻居”定义。
例:“强行逃”:禁忌搜索。可“强行逃”,通过维护“禁忌”防止循环。
例:模拟退火 - Q: 基于神经网络的方法中,改变边权会改变什么?
A: 各个节点(根据边权)更新的流程。
注:这里的神经网络意思和现在流行的那些深度学习不太一样。但是共同点是每个node都根据权作简单处理。 - Q: 进化算法有什么不足?
A: 没有保证,玄学,收敛慢,发散……
9.6 Over-constrained problems
- Q: 无解,但要找到一个相对来说比较好的解。这种相对好有什么常见标准?
A: 比如部分约束可“放松”。比如给约束“赋权”(有些可放松有些不可放松相当于有些权1有些权无穷)
比如约束是否满足变成“模糊”的(满足度,\([0,1]\))
比如所有约束排序,前面的重要,先保证(“字典序”定义“优劣”)
比如把违反了的约束作为元素进行代数运算(这就比较一般化了,范围很广) - Q: 为了防止“短视”抹去解,应该怎么调整传播方式?
A: 改consistency定义(如arc consistency counts)