两种改进的模拟退火算法求解大值域约束满足问题1.0

0引言

约束满足问题(Constraint Satisfaction Problem,CSP)是人工智能研究领域中一个非常重要的分支,现已成为理论计算机科学、数学和统计物理学等交叉学科研究中的热点问题。人工智能、计算机科学和自动控制等领域中的许多问题都可以归结为约束满足问题。同时,约束满足问题在实际问题如模式识别、决策支持、物流调度及资源分配等领域也有着非常广泛的应用。

CSP由一个变量集合和一个约束集合组成。每个变量都有一个非空的可能值域,每个约束描述了一个变量子集与子集内各变量的相容赋值,所有约束的逻辑与构成了问题的一个实例。求解CSP,就是找到实例的解也就是找到满足所有约束的完全赋值(即对每个变量都进行赋值),或者在无解时使得可满足的约束数目最大化。拉丁方问题,N皇后问题,图着色问题,最小顶点覆盖,哈密顿回路问题以及合取范式的可满足性(Satisfiability,SAT)问题等都是约束满足问题。一般情况下,大多数的随机CSP都是NP-完全问题。近年来,大量的理论分析和算法实验表明:对于许多NP-完全问题,我们可以定义一个序参数(如约束密度,约束紧度等)按照随机实例的可满足性将其划分为亚约束区域和过约束区域。在亚约束区域,几乎所有的随机实例都是可满足的;而在过约束区域,几乎所有的随机实例都是不可满足的。一般认为,求解随机实例的难度在相变阈值点附近达到最高,难解实例大都分布在可满足概率突然转变的相变区域内。自从Cheeseman等人于1991年发现相变现象与难解性的联系以来,人们在CSP模型选择、算法设计和算法测试等方面进行了大量而深入的研究。

早期的许多理论研究和数值实验都是围绕四个标准的CSP模型展开的,由它们生成的随机实例被广泛地应用在算法测试中。但在1997年,D.Achlioptas等人指出这四种模型存在平凡的渐近无解性。为了克服这一缺点,人们提出了一些改进的CSP模型。如Y.Gao和J.Culberson等人在约束关系中加入特殊的结构,使生成的实例具有弧相容、路径相容、强3-相容或者弱4-相容的性质。虽然这些改进的模型能产生非平凡的难解实例,但是实例已不再是以简单、自然的方式生成的。2000年,K.Xu等通过对变量值域(随问题规模增加呈多项式级增长)和约束紧度(或约束密度)的限制提出了标准B模型的修改模型即RB模型。该模型避免了B模型不能产生难解实例的缺点。K.Xu等利用二阶矩方法严格证明了RB模型不但存在可满足性相变现象,而且可以得到精确的可满足性相变点。此后,针对RB模型的一系列研究相继展开。2006年,K.Xu等又从理论上证明RB模型的随机实例在相变区域具有指数级的树归结复杂性,即这些实例几乎是极其难解的。同时,实验上也验证了在相变阈值附近,随机实例的求解难度随着问题规模增加而呈指数级增长,并在相变阈值处达到顶峰。因此基于RB模型生成的难解算例被广泛地应用于各种算法竞赛作为测试算法的基准(benchmark)。由RB模型生成的随机实例的求解难度,甚至在问题规模仅为102量级时已极具挑战性。一方面,2011年,C.Zhao等引入统计物理中的有限尺度分析方法,给出了在有限尺度效应下,RB模型相变区域尺度窗口的上界。同时,受RB模型启发,J.Shen提出了一个值域固定的随机d-k-CSP模型,证明了在一定条件下该模型也存在精确的相变现象,并可以产生非平凡的具有小值域的随机实例。2015年,G.Zhou等弱化了k-CSP模型存在精确相变现象的条件。另一方面,2011年,C.Zhao等提出了由Belief Propagation引导的消息传递算法来求解由RB模型生成的变量具有大值域的随机实例。随后,C.Zhao等利用无序系统中的空腔方法,分别在文献中提出了一种基于变量熵的Belief Propagation算法,在文献[22]中提出了Reinforced Belief Propagation算法来求解RB模型的随机实例,并进一步指出了解空间的结构特征和算法求解复杂性之间的联系。

本文针对RB模型这一类具有较大值域的随机CSP,提出了两种改进的模拟退火算法(Simulated Annealing)即RSA和GSA。在RSA算法中,将温度控制引入到扰动策略中;在GSA算法中,初始解不再是随机生成的,而是利用改进的遗传算法(Genetic Algorithm)来得到模拟退火算法的初始解。将这两种算法用于求解RB模型的随机实例,数值结果表明:在约束紧度进入相变区域时,算法都能有效地找到实例的解。与随机游走算法对比,这两种算法都具有明显的优越性。在约束紧度临近相变点时,求解难度呈现指数级增加,这两种算法虽然不再能有效地找到实例的解,但是得到的最优解仅使得极少数的约束不能满足。因此,这两种改进的模拟退火算法对具有较大值域的随机CSP的求解起到了积极的促进作用。

1   RB模型

我们用三元组表示由RB模型生成的随机实例,其中是变量集合;是变量的取值集合即值域;是约束集合。我们由以下两步来生成RB模型的随机实例

Step1:随机可重复地挑选M个约束,每个约束限制了X的子集合的取值,中的元素是从X中随机挑选的个互异变量,这里是常数;

Step2:对于每个约束,随机不重复地从中选取-元赋值作为的不相容赋值集合,即若对-元赋值属于,则约束是不可满足的,反之就是可满足的。这里为常数)随着问题规模即变量数目N的增加呈多项式级增长,

为常数。

控制参数rp分别代表了约束密度和约束紧度,文献分别从理论和实验上证明RB模型存在精确的可满足性相变现象,同时在相变区域涌现出了大量难解实例。用表示由RB模型生成的随机实例可满足的概率,则有以下结论成立:

定理1,若,则

定理2,若,则

RB模型中,变量的值域随着N的增加呈多项式级增长,因此当N充分大时,变量的值域也会相应地变得较大。上述两个定理表明RB模型存在精确的可满足性相变现象,故RB模型是具有大值域并能产生非平凡随机CSP实例的模型。设计求解由RB模型生成的随机实例的算法,可以用来解决一类具有大值域的随机CSP。

时间: 2024-08-03 15:32:30

两种改进的模拟退火算法求解大值域约束满足问题1.0的相关文章

两种改进的模拟退火算法求解大值域约束满足问题2.0

2    两种改进的模拟退火算法 模拟退火算法(Simulatedannealing algorithm)是一种通用的概率算法,其思想源于固体退火过程:当固体物质温度很高时,固体内部粒子运动杂乱无序:而当温度逐渐降低时粒子又渐渐趋于有序运动.模拟退火算法往往用来求解优化问题的最小值问题,算法过程中会不断地对变量的当前赋值进行扰动,以产生新的赋值.如果新的赋值使得目标函数值变小,则接受新的赋值为当前赋值.反之,则以概率接受新的赋值,其中T是当前温度,为新赋值目标函数值,为当前赋值目标函数值,重复上

两种改进的模拟退火算法求解大值域约束满足问题6.0

两种改进的模拟退火算法求解大值域约束满足问题5.0

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

两种计算自然对数的算法比較

引言 前一段时间.我写了两篇计算自然对数的算法的随笔,分别使用椭圆θ函数-算术几何平均法和泰勒级数展开式来计算. 那么这两种算法的性能怎样呢?在參考资料[3]中有下面说法:   上面的 elliptic method 就是椭圆θ函数-算术几何平均法.Taylor's method 2 就是我使用的泰勒级数展开式.能够看出,elliptic method 在计算精度大时占绝对优势.但在计算精度小时并不占优.而在我们的应用中,要计算的 decimal 数据类型的精度仅仅有 28 位有效数字,即上面的

两种计算自然对数的算法比较

引言 前一段时间,我写了两篇计算自然对数的算法的随笔,分别使用椭圆θ函数-算术几何平均法和泰勒级数展开式来计算.那么这两种算法的性能如何呢?在参考资料[3]中有以下说法:   上面的 elliptic method 就是椭圆θ函数-算术几何平均法,Taylor's method 2 就是我使用的泰勒级数展开式.可以看出,elliptic method 在计算精度大时占绝对优势,但在计算精度小时并不占优.而在我们的应用中,要计算的 decimal 数据类型的精度只有 28 位有效数字,即上面的 P

js实现两种实用的排序算法——冒泡、快速排序

零:数据准备,给定数组arr=[2,5,4,1,7,3,8,6,9,0]; 一:冒牌排序 1思想:冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置       要实现上述规则需要用到两层for循环,外层从第一个数到倒数第二个数,内层从外层的后面一个数到最后一个数 2特点:排序算法的基础.简单实用易于理解,缺点是比较次数多,效率较低. 3实现: var times=0; var bubbleSort=function(arr){ for(var

模拟退火算法求解旅行商问题(附c和matlab源代码)

前几天在做孔群加工问题,各种假设到最后就是求解旅行商问题了,因为原本就有matlab代码模板所以当时就改了城市坐标直接用了,发现运行速度惨不忍睹,最后用上了两个队友的电脑一起跑.这次模拟结束后在想用c语言来实现的话应该可以提高不少效率.关于模拟退火和旅行商问题的介绍我就不赘述了,网上各路大神说的都很详细,我下面就把c语言和matlab代码先附上. c语言: 1 #ifndef _OPTION_H 2 #define _OPTION_H 3 /* 4 * T0 表示 初始温度 5 * Tf 表示

【C语言】两种方式实现冒泡排序算法

题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行排序,循环N次即可. 如果真的不理解冒泡排序算法,请点击:冒泡排序_360百科 核心代码 //方式一:从头向尾遍历,将最大数(相对)沉入尾部(相对) void BubbleSort1(int *arr,int sz){ int i = 0; int j = 0; assert(arr); for(i