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

2    两种改进的模拟退火算法

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

对于RB模型,设是一组完全赋值,把目标函数定义为不可满足约束的数目,即

                (1)

其中

     (2)

若存在X使得,则由RB模型生成的随机实例是可满足的,X是一个解;反之,则不满足,X不是解。

经典的模拟退火算法在求解RB模型随机实例时效率很低,考虑到RB模型随机实例的特点以及模拟退火算法本身的局限性,我们认为是由以下三个原因导致其效率低下:

(1)在求解过程中并没有针对RB模型的特点来采取一些比较能明显减少目标函数值的扰动策略;

(2)模拟退火算法在求解过程中没有有效利用已找到的最优赋值;

(3)模拟退火算法在RB模型问题求解上对初始赋值具有一定的依赖性。

对于第一个问题,本文改进了模拟退火算法的扰动策略,即随机挑选一个当前赋值不能满足的约束,再随机挑选一个在此约束中出现的变量,从相容赋值集合中挑选一组赋值作为此约束中出现的变量的赋值。对于第二个问题,结合模拟退火算法的特点,我们把退火思想引入到对当前赋值的扰动操作中。具体来说,在模拟退火算法搜索解的前期,即温度很高时,需要算法能在大范围的赋值空间中寻找优良赋值,因此采取无目的性的随机扰动策略;而在算法执行后期,即温度越来越低时,需要有针对性地寻找优良赋值,因此直接将目前找到的最佳赋值作为当前赋值,再利用上面扰动策略进行扰动。对于第三个问题,本文采用遗传算法对多组初始随机赋值进行优化,然后将遗传算法结束后返回的最佳赋值作为模拟退火算法的初始赋值。

本文针对这三个问题,在模拟退火算法的基础上提出了两种改进算法。一种是把策略性扰动引入模拟退火算法中,我们称之为RSA算法;另一种是在RSA算法的基础上利用遗传算法对初始赋值进行优化,我们称之为GSA算法。RSA算法是针对问题一和问题二而提出的改进算法。GSA算法又更进一步针对问题三做出了改进。

,RB模型都是NP-完全的,故以下算法在由二元RB模型()生成的随机实例上执行。

2.1   RSA算法

总的来说,RSA算法分为三步。首先,随机生成一组初始赋值,再对这组赋值进行随机或者策略性扰动以产生新的赋值。随着温度的逐渐降低我们选择策略性扰动的概率会不断增大,这是为了避免经典模拟退火算法中由于随机扰动的盲目性而降低求解效率。其次,根据目标函数值以及当前温度来判断是否接受这组新赋值。最后,不断重复上述扰动与接受的过程,直到目标函数值满足优化条件,或者达到最大的重复次数为止。

RSA算法步骤:

输入:二元RB模型的一个随机实例,初始温度,终止温度,在同一温度下最大迭代次数

输出:找到的最优赋值及对应的最少不可满足约束的数目。

Step 1:令当前温度,随机生成一组赋值,计算目标函数值,令最优赋值,最少不满足约束数目

    Step 2while  to do Step 3~Step 8

    Step 3for  to L do Step 4~Step 7

Step 4if () {return最优赋值,及最少不可满足约束的个数}

else{to do Step 5};

Step 5:随机取一个介于0到1的实数

if (){随机选出中的变量重新随机赋值,从而得到新赋值}

else{令,随机选出的一个不可满足约束,从相容赋值集合中随机选取一组赋值,赋予这组约束中的变量,从而得到赋值};

    Step 6:计算

if(){令}

else {随机取一个介于0到1的实数

if(){令}

else{to do Step 7}};

Step 7if(){to do Step 3}

else{to do Step 3};

Step 8:令to do Step 2

Step 9return

关于温度冷却表,本文采用的是的方式,其中是常数,是前一时刻温度,为后一时刻温度。

RSA算法是在经典模拟退火算法的基础上针对上文第一个问题与第二个问题做出的改进。算法开始时温度很高,目标函数值很大,对变量赋值进行扰动后接受新赋值的概率较大。此时需要在大范围的赋值空间中对变量赋值进行随机扰动。随着温度的降低,就需要对变量赋值进行有针对性地策略性扰动。具体来说,就是在Step 5中,以做为不同扰动方案的选择概率,当温度值很大时,以较大的概率选择随机扰动。但随着温度T的降低,就需要大概率地选择策略性扰动以便能使算法找到解或者最优解。

RSA算法采用了上述与温度相关的策略性扰动后,一方面它避免了算法陷入局部最优解,另一方面也避免了由于随机扰动的盲目性而产生的无意义新赋值,从而提高了求解RB模型的效率。另外,在算法运行的后期,RSA算法会更加有针对性地对当前最优赋值进行扰动,进一步加快算法收敛,得到更有效的新赋值。

RSA算法是针对问题一与问题二做出了改进,但是初始赋值是随机生成的,这会直接影响RSA算法找到解的效率。因此我们考虑首先利用融入退火思想的遗传算法来得到解或者近似最优解作为初始赋值,再借助模拟退火算法来得到解或者最优解,于是就提出了下面的GSA算法。

时间: 2024-08-03 15:05:58

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

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

0引言 约束满足问题(Constraint Satisfaction Problem,CSP)是人工智能研究领域中一个非常重要的分支,现已成为理论计算机科学.数学和统计物理学等交叉学科研究中的热点问题.人工智能.计算机科学和自动控制等领域中的许多问题都可以归结为约束满足问题.同时,约束满足问题在实际问题如模式识别.决策支持.物流调度及资源分配等领域也有着非常广泛的应用. CSP由一个变量集合和一个约束集合组成.每个变量都有一个非空的可能值域,每个约束描述了一个变量子集与子集内各变量的相容赋值,所

两种改进的模拟退火算法求解大值域约束满足问题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