其他分享
首页 > 其他分享> > IncRe[5] CTM 12 Constraint Programming 前半部分

IncRe[5] CTM 12 Constraint Programming 前半部分

作者:互联网

目录
本篇前置:

基础信息

12 Constraint Programming

CSP(约束满足问题):找值,使得满足一系列条件

Solving CSPs is related to deep questions of intractability. Problems that are known to be intractable will always need some search. The hope of constraint programming is that, for the problems that interest us, the search component can be reduced to an acceptable level.

某种意义上,最接近声明式的目的:只说做什么,不说怎么做
(其实logic也有这种想法)

三个核心思想

例程

declare X Y in
X::90#110
Y::48#53
declare A B in
A::0#10000
A=:X*Y
B::4500#10000
B=:X*Y
{Show A>:4000}
{Show A}
{Show B}

输出

1
A{4320#5830}
B{4500#5830}

image
前一部分是一些约束(书中称为propagators),后一部分是定义域。这样的\(S_1\)叫computation space
通过多次局部推理(即约束传播),缩减定义域至不能再减,然后不得不开始搜索(但搜索范围小很多了)。迭代进行两个过程
把在约束传播下稳定了的\(S_1\)分解成\(S_2\)和\(S_3\)
image
约束求解例程

declare
proc {Rectangle Sol}
 sol(X Y)=Sol
in
 X::1#9
 Y::1#9
 X*Y=:24
 X+Y=:10
 {FD.distribute naive Sol}
end
{Show {Search.base.all Rectangle}}

12.2 Programming techniques

\(SEND+MORE=MONEY\)问题:关注不等号\=:,关注一个特别的约束{FD.distinct Sol},关注ff(first fail)策略
约束求解的更多实际问题:建模。效率问题(改变约束形式,改变搜索策略……等等方法提高效率)
回文数相关问题中用第9章的choice和本章的约束求解算法,效率差别很大。原因是

To write a good specification, you have to understand the operational meaning of the constraints as well as the logical meaning. The latter is enough for showing correctness, but the former is essential to get good performance.

其实从更大角度来看,constraint logic programming就是一种operational semantics,且是效率很高,演绎能力很强的一种

12.3 The constraint-based computation model

A computation space collects together basic constraints and propagators

也就是encapsulation
propagator是一个可以往store添加约束的线程(从并发的思想理解约束传播!
computation space可以嵌套,子space可以看到所有父母的约束

借助computaion space,容易编写两方面策略:搜索策略和分类(distribution)策略。分类就是分几类,加什么约束去分。搜索就是深度优先,广度优先……等。怎么分类和怎么搜索可以是完全正交的(不管怎么分,我都深搜)。但是也可以有联系,比如记忆之前结果,动态改变分类和搜索策略等。

总结和问答练习

  1. Q: 把Rectangle相关的那个例程用第9章的choice改写(不使用本章的::=:等)
    A:
declare
fun {Digit}
 choice 1 [] 2 [] 3 [] 4 [] 5 [] 6 [] 7 [] 8 [] 9 end
end
declare
proc {Rectangle Sol}
 sol(X Y)=Sol
in
 X={Digit}
 Y={Digit}
 X*Y=24
 X+Y=10
end
{Show {Search.base.all Rectangle}}

注:本章没有指定choice(显式指定搜索方式),则需要其它地方指定怎么搜索(一般来说,搜索树是过程中动态创建和变化的。搜索策略需要写在约束求解器中)。具体地,Rectangle相关那个例程直接调包:{FD.distribute naive Sol}

  1. Q: 并行和并发有什么区别?
    A: image
    来自Erlang之父Joe Armstrong
    本章更关注约束求解的并发本质。实际上,为了提升效率,也可以引入并强调并行(比如把传播各自局限在一些变量,两个cpu核分别跑一部分变量相关的传播这样)

标签:12,Constraint,Programming,Sol,约束,搜索,choice,Rectangle
来源: https://www.cnblogs.com/minor-second/p/15696215.html