一、约束编程简介(Constraints Programming)

news2024/10/6 22:20:15

文章目录

  • 1、约束编程求解器
  • 2、值域+传播器
  • THE END

1、约束编程求解器

\qquad 约束编程是一种编程范式,旨在解决那些需要满足一系列约束条件的问题。在约束编程中,问题被定义为一组变量和约束条件,而不是指定解决问题的算法步骤。通过定义变量之间的关系和约束条件,约束编程系统能够自动找到满足所有约束条件的解。
\qquad 在约束编程中,变量通常定义在一个特定的域中,该域包含了变量可能的取值范围。约束条件定义了变量之间的关系,可以是等式、不等式、逻辑关系等。这些约束条件可以是显式指定的,也可以是通过问题的规范隐含地定义的。
\qquad 约束编程的求解器使用各种算法和技术来搜索满足所有约束条件的解。这些算法可以是基于回溯的,通过尝试不同的变量赋值和约束条件的满足程度来逐步搜索解空间。还可以使用启发式搜索、优化算法等方法来加速搜索过程。
\qquad 约束编程可以应用于各种领域和问题,如排程问题、资源分配、路线规划、布局设计等。它的优势在于可以简化问题的建模过程,提供一种声明式的方式来描述问题,而不需要指定详细的求解步骤。此外,约束编程还能够处理复杂的约束条件和大规模问题。
\qquad 一些常见的约束编程语言和工具包括Prolog、ECLiPSe、MiniZinc、Choco等。这些工具提供了丰富的约束库和求解器,可以帮助开发人员更轻松地建模和求解约束问题。
\qquad 下面通过一个女娲补天问题来直观理解约束编程。
在这里插入图片描述
\qquad 在一个9×9的矩阵中有一些数字和一些空格,需要在空格中填上1-9数字中的一个,使得每一行不能出现重复数字;每一列不能出现重复数字,每一个3×3的小方格中不能出现重复数字。这时候使用约束编程可以设定一个变量 y i , j y_{i,j} yi,j表示每一个小格 i i i是否放某个数字 j j j,之后通过约束推理和传播,解方案搜索(猜测)的方法一步步找到可行解,若某次搜索过程中无法找到可行方案,则回溯并撤回之前做的决定。重复上述过程,直到找到可行解,输出结果。从而可以知道约束编程的核心组成部分便是约束传播搜索
\qquad 约束传播时,需要一次检查每一个约束,分析约束中的变量的可能数值并减少变量的可行域,重复上述过程知道没有进一步减少变量可行域的可能。
\qquad 搜索时,需要通过猜测做出一个决定,之后将这个决定的影响在不同的约束中进行传播。重复上述过程,直至找到一个解或者失败(某些约束不能满足),若出现失败的情况,则需要回溯到之前做过的决定,并撤回改用其他决定。

2、值域+传播器

\qquad 值域:代表变量的可能数值。每一个变量 X X X的值域记作 D ( X ) D(X) D(X),通常 D ( X ) D(X) D(X)是有限的,但可能回非常大。实质上,每一个变量 X X X代表了一个选择(猜测),值域 D ( X ) D(X) D(X)代表了 X X X可能选择。当 D ( X ) = ∅ D(X)=\empty D(X)=时,表示当前变量没有可行域。
\qquad 赋值:一个赋值 θ \theta θ表示从变量到数值的映射,例如 { X → 3 , Y → 4 } \{X\rightarrow3, Y\rightarrow 4\} {X3,Y4}可以记作: θ ( X ) = 3 , θ ( Y ) = 4 , v a r s ( θ ) = { X , Y } \theta(X)=3, \theta(Y)=4, vars(\theta)=\{X,Y\} θ(X)=3,θ(Y)=4,vars(θ)={X,Y}。若对于每一个 X ∈ v a r s ( θ ) X\in vars(\theta) Xvars(θ)均满足 θ ( X ) ∈ D ( X ) \theta(X)\in D(X) θ(X)D(X),则称一个赋值 θ ∈ D \theta \in D θD
\qquad 一个解:是一个能够满足问题中所有约束的赋值。
\qquad 赋值域 D θ ( X ) = { t h e t a ( X ) } , X ∈ v a r s ( θ ) D_{\theta}(X)=\{theta(X)\}, X \in vars(\theta) Dθ(X)={theta(X)},Xvars(θ)
\qquad 一个约束 C C C是一个对变量集合 v a r s ( C ) vars(C) vars(C)的赋值集合(约束的解),如 下示例所示:
在这里插入图片描述
\qquad 传播器:一个传播器代表一个约束;可以利用传播器推断出在当前给定的值域下,变量的哪些数值是不可行的。
\qquad 一个关于约束 C C C传播器是一个从值域映射到另外一个值域的函数: D ′ = f ( D ) D'=f(D) D=f(D)
\qquad 传播器需要满足以下性质

  • 单调递减:即传播器只能加约束的值域变得越来越小,不能增大约束的值域: f ( D ( X ) ) ⊆ D ( X ) f(D(X)) \subseteq D(X) f(D(X))D(X)
  • 正确性:不会从 D D D中移除一个将会出现在约束 C C C的解中的数值,如若 θ \theta θ是C中某个变量的映射, θ ∈ D \theta \in D θD,则一定需要满足 θ ∈ f ( D ) \theta \in f(D) θf(D)
  • 检查性:当某个约束 C C C中所有的变量都被固定了,那么传播器会返回一个空的值域;若被固定的所有变量恰好可以组成约束 C C C的解,则传播器返回这个解,即 f ( D θ ) = D θ f(D_{\theta})=D_{\theta} f(Dθ)=Dθ当且仅当 θ \theta θ C C C的一个解。
    \qquad 如下是一个传播器的例子:
    在这里插入图片描述
    \qquad 值域传播器:对于约束 C C C,最强的传播器会移除值域 D D D中所有不属于 C C C的解的值,称这种最强的传播器为值域传播器,记为 f ( D ) ( X ) = D ( X ) ∩ { θ ( X ) ∣ θ ∈ C , θ ∈ D } f(D)(X)=D(X)\cap \{\theta(X)|\theta \in C, \theta \in D\} f(D)(X)=D(X){θ(X)θC,θD}
    \qquad 支持和域相容:给定任意的 X i ∈ v a r s ( C ) X_i \in vars(C) Xivars(C),对全部的 v i ∈ D ( X i ) v_i \in D(X_i) viD(Xi),在 C C C的其他变量中均存在 v j ∈ D ( X j ) v_j \in D(X_j) vjD(Xj),使得 θ ∈ C \theta \in C θC,则 v j v_j vj被称作 v i v_i vi的支持。约束 C C C中所有变量均满足上述要求时,则称约束 C C C的变量之间域相容。下面是一个值域传播器的示例:
    在这里插入图片描述
    \qquad 对于线性方程 ∑ i a i X i = b \sum_i a_iX_i=b iaiXi=b来说,设计一个值域传播的时间复杂度是一个 N P NP NP难的问题;但是对于一个线性不等式 ∑ i a i X i ≤ b \sum_i a_iX_i\leq b iaiXib来说,设计一个值域传播器的时间复杂度为 O ( n ) O(n) O(n)

THE END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XXE漏洞复现步骤

0X00XXE注入定义 XXE注入,即XML External Entity,XML外部实体注入。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。所以攻击者可以通过 XML 实体传递自己构造的恶意值,是处理程序解析它…

Nginx-负载均衡详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是负载均衡 功能介绍配置过程1.修改nginx配置文件添加服务组修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功5.还可以配置其他策略轮询权重最少连接数 常用命令总结提升 概念说明 了解ngi…

MySQL:环境安装和数据库基础

环境安装 说明: • 安装与卸载中,用户全部切换成为root,⼀旦 安装,普通用户能使⽤的 • 初期练习,mysql不进行用户管理,全部使⽤root进行,尽快适应mysql语句,后⾯学了用户管 理&a…

实例讲解,一文弄懂workqueue和waitqueue

本期主题: 讲清workqueue和waitqueu: 从中断讲起waitqueue是什么workqueue总结 往期链接: linux设备驱动中的并发linux设备驱动中的编译乱序和执行乱序linux设备驱动之内核模块linux字符驱动linux字符驱动之ioctl部分linux字符驱动之read、…

数据结构07:查找[C++][朴素二叉排序树BST]

图源:文心一言 考研笔记整理8k字,小白友好、代码可跑,请小伙伴放心食用~~🥝🥝 第1版:查资料、写BUG、画导图、画配图~🧩🧩 参考用书:王道考研《2024年 数据结构考研复习…

【MATLAB第45期】基于MATLAB的深度学习SqueezeNet卷积神经网络混凝土裂纹图像识别预测模型

【MATLAB第45期】基于MATLAB的深度学习SqueezeNet卷积神经网络混凝土裂纹图像识别预测模型 引言 该文章展示如何微调名为SqueezeNet的预训练深度卷积网络,以执行裂纹图像分类预测。并使用一种称为Grad-CAM的技术来解释和分析分类输出。文章使用L.Zhang介绍的混凝土…

C++初阶之C++入门最全详解

C入门 1. C关键字(C98)2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.1.1 参数类型不同5.1.2 参数个数不同5.1.3 参数类型顺序不同 5.2 C支持函数重载的原理…

Spring Cloud Alibaba Seata(二)

目录 一、Seata 1、Seata-AT模式 1.1、具体案例 1.2、通过Seata的AT模式解决分布式事务 2、Seata-XA模式 3、Seata-TCC模式 4、Seata-SAGA模式 一、Seata 1、Seata-AT模式 概念:AT模式是一种无侵入的分布式事务解决方案,在 AT 模式下&#xff0c…

git修改默认主分支main为master和设置git默认创建的项目默认分支都为master

文章目录 前言一、设置新建仓库默认分支为master1.点击GitHub右上角的头像2. 选中settings(设置)3.点击Repositories(存储库)4.更改main为master后点击update 二、设置已建仓库的默认分支为master1.找到你要改的项目点击settings&…

STL序列式容器的概念

文章目录 1 迭代器2 什么是序列式容器3 序列式容器容器中常见的函数成员参考 1 迭代器 迭代器和C指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读写操作。 迭代器类别 …

ThreeJS案例一——在场景中添加视频,使用人物动作以及用键盘控制在场景中行走的动画

准备 首先我们需要两个模型,一个是场景模型,另一个是人物模型。 人物模型我这里用的Threejs官网中的给的模型,名称是Xbot.glb。 当然人物模型也可以自己去这个网站下载sketchfab,下载后给模型添加动画mixamo 下载模型动画 先让…

C++ STL vector容器用法

文章目录 1 vector初始化方法2 vector容器迭代器3 data()函数4 emplace_back()和push_back()的区别5 insert()函数6 vector删除元素参考 1 vector初始化方法 方式1&#xff1a; std::vector<double> values;//创建空的vcetor values.reserve(20); //设置容器的内存分配…

【实战】 JWT、用户认证与异步请求(1) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1.login2.middleware of json-server3.jira-dev-tool&#xff08;imooc-jira-tool&#xff09;安装问…

《流浪地球 2》的硬核黑科技

电影中&#xff0c;由刘德华饰演的量子计算机工程师图恒宇有一个惊心动魄的情节。为了同步启动全球地球发动机&#xff0c;需要重启互联网&#xff0c;避免地壳破碎和地质灾害。而重启互联网的关键则是要启动“根服务器”。电影中没有具体交代是什么根服务器&#xff0c;但是当…

Ubuntu18.04屏幕分辨率问题

本篇博客最早发布于实验室公共博客&#xff0c;但已无人维护&#xff0c;现迁移至个人博客 起因 本来昨天还好好的&#xff0c;过了一夜&#xff0c;就变了&#xff0c;像极了咳咳(自行脑补) redwallbot-2小车上固定的屏幕&#xff0c;屏幕分辨率本来应该是1920x1080的&#…

DevOps系列文章之 linux安装ftp

第一步 1、用root 进入系统 2、使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp&#xff0c;若安装了vsftp&#xff0c;使用这个命令会在屏幕上显示vsftpd的版本 3、使用命令rpm -e vsftpd 即可卸载ftp 4、再使用rpm -qa|grep vsftpd 查看系统是否已删除ftp&#xff0…

【小技巧】vscode 在 JS 文件中补全 HTML标签

文章目录 vscode中有很多插件可以支持 HTML 标签自动补全&#xff0c;在.vue和.html文件中都没有问题&#xff0c;但是在使用react时&#xff0c;HTML标签是写在js或者是ts文件中&#xff0c;插件就不起作用了 解决方案&#xff1a; 在设置中插入这段设置代码 "emmet.i…

uniapp 微信小程序sourcemap映射

uniapp 微信小程序sourcemap映射 错误捕获 由于微信小程序中没有window对象&#xff0c;不能通过window.onerror和window.onunhandledRejection方法进行全局的监听。不过我们也可以使用以下几种方法。 使用try…catch 将可能出现的错误的代码使用try...catch包裹 try{cont…

【C++】一文读懂C++中的异常处理机制

文章目录 C 中的异常处理机制1.1 什么是异常&#xff1f;1.2 调用abort()1.3 返回错误码1.4 异常机制1.5 将对象用作异常类型1.6 异常规范和C111.7 栈解退1.7.1 return和throw的区别1.7.2 什么是栈解退 1.8 其他异常特性1.9 excepyion类1.9.1 stdexcept异常类1.9.2 bad_alloc异…

329款超有设计感的英文字体合集

一组超有设计感的英文字体合集&#xff0c;总共329个字库包含多种字体风格&#xff1a;手写字体、签名字体、复古字体、笔刷字体、漫画字体等无衬线字体。适用于签名、文具、标志、排版引言、杂志或书籍封面。素材获取&#xff1a;取括号内容&#xff0c;&#xff08;scwan&…