zoukankan      html  css  js  c++  java
  • 第6章 约束满足问题CSP

    第六章 约束满足问题CSP

    一、问题定义

    问题定义

    状态空间,状态被定义为在值域Di中的变量Xi;

    当前状态;

    转移模型;

    目标测试,每个变量都有自己的赋值同时满足约束条件;

    评估函数。

    三个成分

    X变量集合

    [{X_1,...,X_n} ]

    D值域集合

    [{D_1,...,D_n} ]

    ,每个变量都有自己的值域。

    C是描述变量取值的约束集合

    特点

    CSP的解是相容的、完整的赋值。

    相容:不违反任何约束条件的赋值称为相容的或合法的赋值。

    完整赋值:每个变量都已赋值。

    约束图

    结点为变量,边表示两者间有约束关系。

    形式化

    离散变量

    有限值域:n个变量,值域集合大小为d,e.g. 布尔变量
    无限值域:整数,字符串等

    连续变量
    e.g.如哈勃望远镜的实验日程安排,每次观察的开始,结束时间
    线性约束,二次规划求解

    一元约束:只涉及一个变量,SA!=green

    二元约束:涉及两个变量,SA!=WA

    高阶约束:涉及3个或者3个以上变量

    全局约束:变量个数任意的约束称为全局约束

    举例

    变量:WA, NT, Q, NSW, V, SA, T

    值域:{red,green,blue}

    约束条件:相邻的区域必须是不同的颜色

    解之一:WA = red, NT = green,Q = red, NSW =green, V = red, SA = blue, T = green

    二、推理——约束传播

    思想

    使用约束来减小一个变量的合法取值范围,从而影响到跟此变量有约束关系的另一变量的取值,如此进行。

    相容

    结点相容

    单个变量值域中的所有取值满足一元约束

    Eg., SA!=green 转化为SA的值域为{red,blue}

    弧相容

    某变量值域中的所有取值满足该变量的所有二元约束

    e.g. Y=X^2, X,Y都是数字
    弧相容<(X,Y),{(0,0),(1,1),(2,4),(3,9)}>

    通用弧相容

    Xi相对于某n元约束是相容的

    e.g. 所有变量值域{0,1,2,3},约束X<Y<Z,则如果X值域缩小为{0,1}称X是通用弧相容的。

    弧相容算法

    首先,工作集中包含CSP中所有的弧。AC-3从工作集中弹出弧(Xi,Xj),首先使Xi相对于Xj弧相容。如果Di没有变化则继续处理下一条弧,否则每个指向Xi的弧(Xk,Xi)都必须重新插入工作集中准备检验。之所以这么做是因为Di的改变可能引起Dk的改变。如果Di成为空集,则无相容解。否则继续检查,直到工作集中没有弧。

    function ac_3 (X, D, C){
        while (!worklist_empty()){
            (Xi,Xj)=remove_first(worklist)
            if revise(csp,Xi,Xj){
                if (sizeof(Di)==o){
                    return false;
                }
                for each Xk in Xi.NEIGHBORD-{Xj} do{
                    add(Xk,Xi)to worklist;
                }
            }
        }
        return true;
    }
    function revise(csp,xi,xj){
        revised=false;
        for each x in Di{
            if(no value y in Dj allows(x,y) to satisfy the constraint between Xi and Xj){
                delete x from Di;
                revised=true;
            }
        }
        return revised;
    }  
    

    时间复杂度

    [O(cd^3) ]

    c个二元约束,变量值域最大为d个元素

    路径相容

    两个变量集合{Xi,Xj}对于第三个变量Xm是相容的,指{Xi,Xj}的每一个相容赋值{Xi=a,Xj=b}, Xm都有合适的取值同时使得{Xi,Xm},{Xm,Xj}是相容的。

    e.g. 检查{WA,SA}对于NT在值域{red,blue}的条件下是否是相容的。

    k相容

    K相容:如果对于任何k-1个变量的赋值,第K个变量总能被赋予一个和前面k-1个变量相容的值。

    如果一个图是k相容的,k-1相容的,…,直到1相容的,那么此CSP是强k相容的。

    三、回溯搜索

    通用搜索模式

    状态是由赋值的变量决定的

    通用的搜索模式
    初始状态:设为空{}
    步骤:给一个没有赋值的变量赋值,该赋值不与当前已赋值的变量相冲突
    目标测试:如果所有赋值完成且满足终止状态,则搜索结束,否则搜索失败

    CSP适用于通用的搜索模式,并采用深度搜索方法

    回溯搜索

    思想

    对于CSP采用深度优先的单个变量赋值,当检测到不相容时,返回上一次赋值。

    特点

    变量的赋值顺序是可以交换的,在每一个结点只需要考虑一个变量的赋值,在算法之前需要固定变量的赋值顺序,叶子结点数减少到d^n。

    提高算法效率的策略

    选择变量赋值的顺序

    选择值域中赋值的顺序

    更早地检测不可避免的失败

    最受约束变量

    优先选择最少剩余值的变量进行赋值

    约束最多变量

    优先选择最能约束其他变量的变量进行赋值

    最少约束值方法

    选择使得剩余变量赋值空间更大的值

    前向检验

    思想

    追踪未赋值变量的剩余合法赋值;当任何一个剩余变量没有合法赋值时搜索终止。

    特点

    前向检测从赋值变量向未赋值变量传播信息,但不能对失败提供早期检测。

    改进MAC(维护弧相容)

    当xi赋值后,从与xi邻接的弧中所有未赋值变量xj开始进行约束传播,一旦某变量的值域为空则回溯

    智能回溯

    Solution:建立冲突集,回溯到冲突集中时间最近的赋值,SA的冲突集为{Q,NSW,V},所以回溯到V

    四、问题结构

    独立的子问题

    不相连的结构

    e.g. Tasmania 与其他地区不相连

    独立性子问题通过寻找连通子图来确定

    拓扑排序

    适用

    求解树结构的CSP

    思想

    任意选择一个变量为树的根,选择变量顺序使每个变量在树中出现在父结点之后。

    特点

    n个结点n-1条弧,O(n)步将此图改造成直接弧相容,每一步比较两个变量的d个可能取值,所以总时间为O(nd^2)。

    约束图到树

    基于删除结点的方法

    从CSP的变量中选择子集S(SA),使得约束图在删除S后成为一棵树,S称为环割集

    对于满足S所有约束的每个可能赋值

    1. 求CSP剩余变量的值域,然后从中中删除与S的赋值不相容的值
    2. 如果去掉S后的剩余CSP有解,把解和S的赋值一起返回

    基于合并结点的方法


    把约束图分解成相关联的子问题

    对每个子问题单独求解,再把结果合并起来

    树分解的三个条件

    每个变量至少出现在一个子问题中

    每个约束至少出现在一个子问题中

    如果一个变量出现在两个子问题中,那么它必须出现在连接在这两个子问题的路径上的所有子问题中(?)

  • 相关阅读:
    PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
    PAT 甲级 1050 String Subtraction (20 分) (简单送分,getline(cin,s)的使用)
    PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***...
    PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)
    PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)...
    PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)
    R语言实现金融数据的时间序列分析及建模
    ES6 | class类的基本语法总结
    less使用总结
    umi 的项目中如何修改 favicon
  • 原文地址:https://www.cnblogs.com/Gru-blog/p/12109837.html
Copyright © 2011-2022 走看看