求解企业技术难题需求征集 求快

N皇后问题的位运算求解——目前最快的方法 - albert1017 - 博客园
核心代码如下:
1 void test(int row, int ld, int rd)
if ( row != upperlim )
pos = upperlim & (~(row | ld | rd ));
while ( pos )
p = pos & (~pos + 1);
pos = pos -
test(row | p, (ld | p) && 1, (rd | p) && 1);
初始化: upperlim =& (1 && n)-1; Ans = 0;
&&&&&&&& 调用参数:test(0, 0, 0);
&&&&&&&& 和普通算法一样,这是一个递归函数,程序一行一行地寻找可以放皇后的地方。函数带三个参数row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放。位于该行上的冲突位置就用row、ld和rd中的1来表示。把它们三个并起来,得到该行所有的禁位,取反后就得到所有可以放的位置(用pos来表示)。
&&&&&&& p = pos & (~pos + 1)其结果是取出最右边的那个1。这样,p就表示该行的某个可以放子的位置,把它从pos中移除并递归调用test过程。
&&&&&&& 注意递归调用时三个参数的变化,每个参数都加上了一个禁位,但两个对角线方向的禁位对下一行的影响需要平移一位。最后,如果递归到某个时候发现row=upperlim了,说明n个皇后全放进去了,找到的解的个数加一。
&&&&&&& upperlime:=(1 && n)-1 就生成了n个1组成的二进制数。
&&&&&&& 这个程序是从上向下搜索的。
&&&&&&& pos & -pos 的意思就是取最右边的 1 再组成二进制数,相当于 pos &(~pos +1),因为取反以后刚好所有数都是相反的(怎么听着像废话),再加 1 ,就是改变最低位,如果低位的几个数都是1,加的这个 1 就会进上去,一直进到 0 ,在做与运算就和原数对应的 1 重合了。举例可以说明:
&&&&&&& 原数 0 0 0 0 1 0 0 0&&& 原数 0 1 0 1 0 0 1 1
&&&&&&& 取反 1 1 1 1 0 1 1 1&&& 取反 1 0 1 0 1 1 0 0
&&&&&&& 加1&&& 1 1 1 1 1 0 0 0&&& 加1& 1 0 1 0 1 1 0 1
& 与运算&&& 0 0 0 0 1 0 0 0&&& and& 0 0 0 0 0 0 0 1
&&&&& 其中呢,这个取反再加 1 就是补码,and 运算 与负数,就是按位和补码与运算。
&&&&&& (ld | p)&& 1 是因为由ld造成的占位在下一行要右移一下;
&&&&&& (rd | p)&& 1 是因为由rd造成的占位在下一行要左移一下。
&&&&&&& ld rd row 还要和upperlime 与运算 一下,这样做的结果就是从最低位数起取n个数为有效位置,原因是在上一次的运算中ld发生了右移,如果不and的话,就会误把n以外的位置当做有效位。
&&&&&&& pos 已经完成任务了还要减去p 是因为?
&&&&&&& while 循环是因为?
&&&&&&& 在进行到某一层的搜索时,pos中存储了所有的可放位置,为了求出所有解,必须遍历所有可放的位置,而每走过一个点必须要删掉它,否则就成死循环啦!
&&&&&&&& 这个是目前公认N皇后的最高效算法。
完整的代码如下:
2 ** 目前最快的N皇后递归解决方法
3 ** N Queens Problem
4 ** 试探-回溯算法,递归实现
6 #include "iostream"
7 using namespace
8 #include "time.h"
10 // sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
11 long sum = 0, upperlim = 1;
13 // 试探算法从最右边的列开始。
14 void test(long row, long ld, long rd)
if (row != upperlim)
// row,ld,rd进行&或&运算,求得所有可以放置皇后的列,对应位为0,
// 然后再取反后&与&上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1
// 也就是求取当前哪些列可以放置皇后
long pos = upperlim & ~(row | ld | rd);
while (pos)
// 0 -- 皇后没有地方可放,回溯
// 拷贝pos最右边为1的bit,其余bit置0
// 也就是取得可以放皇后的最右边的列
long p = pos & -
// 将pos最右边为1的bit清零
// 也就是为获取下一次的最右可用列使用做准备,
// 程序将来会回溯到这个位置继续试探
// row + p,将当前列置1,表示记录这次皇后放置的列。
// (ld + p) && 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
// (ld + p) && 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
// 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
// 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
// 在每次选择列之前进行,原来N&N网格中某个已放置的皇后针对其对角线
// 上产生的限制都被记录下来了
test(row + p, (ld + p) && 1, (rd + p) && 1);
// row的所有位都为1,即找到了一个成功的布局,回溯
50 int main(int argc, char *argv[])
int n = 16;
if (argc != 1)
n = atoi(argv[1]);
tm = time(0);
// 因为整型数的限制,最大只能32位,
// 如果想处理N大于32的皇后问题,需要
// 用bitset数据结构进行存储
if ((n & 1) || (n & 32))
printf(" 只能计算1-32之间\n");
printf("%d 皇后\n", n);
// N个皇后只需N位存储,N列中某列有皇后则对应bit置1。
upperlim = (upperlim && n) - 1;
test(0, 0, 0);
printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int) (time(0) - tm));
system("pause");
&&&&&&& 上述代码还是比较容易看懂的,但我觉得核心的是在针对试探-回溯算法所用的数据结构的设计上。 &&&&&&& 程序采用了递归,也就是借用了编译系统提供的自动回溯功能。
&&&&&&& 算法的核心:使用bit数组来代替以前由int或者bool数组来存储当前格子被占用或者说可用信息,从这可以看出N个皇后对应需要N位表示。 &&&&&&&& 巧妙之处在于:以前我们需要在一个N*N正方形的网格中挪动皇后来进行试探回溯,每走一步都要观察和记录一个格子前后左右对角线上格子的信息;采用bit位进行信息存储的话,就可以只在一行格子也就是(1行&N列)个格子中进行试探回溯即可,对角线上的限制被化归为列上的限制。
&&&&& 程序中主要需要下面三个bit数组,每位对应网格的一列,在C中就是取一个整形数的某部分连续位即可。 row用来记录当前哪些列上的位置不可用,也就是哪些列被皇后占用,对应为1。ld,rd同样也是记录当前哪些列位置不可用,但是不表示被皇后占用,而是表示会被已有皇后在对角线上吃掉的位置。这三个位数组进行&或&操作后就是表示当前还有哪些位置可以放置新的皇后,对应0的位置可放新的皇后。如下图所示的8皇后问题求解得第一步:
&&&&&&&&&&&&& row:&&&&&&&&& [ ][ ][ ][ ][ ][ ][ ][*]&&&&&&&&&&&&& ld:&&&&&&&&&& [ ][ ][ ][ ][ ][ ][*][ ]&&&&&&&&&&&&& rd:&&&&&&&&&& [ ][ ][ ][ ][ ][ ][ ][ ]&&&&&&&&&&&&& --------------------------------------&&&&&&&&&&&&& row|ld|rd:&&& [ ][ ][ ][ ][ ][ ][*][*]
&&&&&&& 所有下一个位置的试探过程都是通过位操作来实现的,这是借用了C语言的好处,详见代码注释。
&&&&&& 关于此算法,如果考虑N&N棋盘的对称性,对于大N来说仍能较大地提升效率! &&&&&& 位操作--对优化算法有了个新的认识
  这个是在csdn找到的一个N皇后问题最快的算法,看了好一会才明白,这算法巧妙之处我认为有2个:
&&&&&& 1、以前都是用数组来描述状态,而这算法采用是的位来描述,运算速度可以大大提升,以后写程序对于描述状态的变量大家可以借鉴这个例子,会让你的程序跑得更快                        
&&&&&& 2、描述每行可放置的位置都是只用row,ld,rd这3个变量来描述,这样使得程序看起来挺简洁的。
本文转自:
随笔 - 120站内搜索:
主办:中央党的群众路线教育实践活动领导小组办公室承办:
解决问题力求“全、准、快”&
日15:11&&来源:
8月13日《人民日报》发表评论员文章《把解决问题放在最重要位置》,文章指出,群众最期盼的是解决问题,最担心的是形式主义。开展教育实践活动,目的就是解决作风方面的突出问题。今年以来,习近平总书记就教育实践活动作出一系列重要批示,都是强调要解决问题。敬终如始搞好教育实践活动,关键就是强化问题导向,把解决问题摆在最重要的位置,以解决问题的实际成效取信于民。(人民网)
问题解决得好不好,直接影响到教育实践活动的工作成效。发现问题却不解决问题,就会导致查摆问题、开展批评所取得的成果全部“归零”。因此,在整改落实、建章立制的关键阶段,需要整改的问题更加集中,解决问题的任务更加繁重。在教育实践活动的最后攻关时刻,必须坚持“把解决问题放在最重要位置”。
“一箭易折,三箭难断。”解决一个问题虽然简单,解决查摆出的所有问题却是难事。教育实践活动中遇到的问题具有复杂性和反复性,各地区各部门存在问题又呈现出不同的特点和表现,要切实解决存在问题,不可能做到“毕其功于一役”。要打好解决问题的攻坚战,就必须树立坚定决心,把握正确方法,采取果敢行动,惟其如此,才能不断取得解决问题的实效。
求“全”,要“全面梳理”,杜绝遗漏问题。将存在问题全部摆到桌面上,才能各个击破。害怕、漠视问题, 无益于解决问题。在全面梳理问题的过程中,反对“选择性”记录梳理问题,避重就轻、避实就虚。要做到不回避、不遮掩问题,针对自身查摆出来的问题、上级党组织和督导组点明的问题和群众反映强烈的问题,详细列出问题清单,为最终解决问题创造良好的前提基础。
求“准”,要“准字为纲”,讲求对症下药。制定解决问题的措施,若难以对症,即使有效,也必然有限,甚至陷入“走过场”草草了事。必须综合运用教育方法、法律手段和整治措施,分类分层次解决重点问题,对党员干部违法违纪问题“零容忍”,发现一起就查处一起;对会所歪风、天价培训、奢华浪费建设、“裸官”问题、干部“走读”、“吃空饷”、收“红包”及购物卡、干部违规兼职等具体问题开展专项整治;对“为官不为”的不正之风要坚决予以纠正,树立正确导向,激励党员干部奋发有为。坚持慎重稳妥,防止简单粗糙,以期在解决问题时才能取得事半功倍的效果。
求“快”,要“快马加鞭”,防止问题积压。解决问题不能等、等不得,更不能拖着让上级催,越拖越陷入被动。问题积压越多,解决问题的难度就越大,转变工作作风就越难,给群众造成的损失和伤害就越多。发现问题不等不拖,要做到简单问题立行立改,复杂问题设置限期整改时间表,并及时回应群众的各种关切,有效防止出现新问题,力争在最短时间内解决问题。
“一笔画不成龙,一锹挖不出井。”解决问题,须下大力气、狠功夫。党员干部要有强烈的问题意识,增强解决问题的自觉性和主动性,提高解决问题的能力和素质,力求“全面、精准、快速”地解决问题,才能把问题“绊脚石”变为前进“垫脚石”,进而走稳走好党的群众路线。
(责编:黄策舆、谢磊)
使用微信“扫一扫”功能添加“党员学习微平台”数学解决问题.跪求答案~~~!快!1.一列客车和一列货车同时从甲、乙两个城市相对开出,已知客车每小时行110千米,客车速度与货车速度的比是11:9,两车开出后7.5小时相遇,甲、乙两城市间的铁路长多少千米?2.小明看一本故事书.第一天看了这本书的25%,第二天看了25页,两天正好看了这本书的八分之三.这本书共有多少页?3.六(2)班原有学生42人,其中男生占七分之四,后来转来女生若干人,这时男生与女生人数的比是6:5.现在全班有多少人?
落落下台49
1、 [110+110*(9/11)]* 7.5 =1500 千米2、 设书总共 x页.
25%x + 25 = 3/8 x
x = 200 页
原有男生 42 *(4/7) = 24
24 * (5/ 6) = 20 人
现在班上有女生 20人
则现在全班
24 + 20 =44 人
为您推荐:
其他类似问题
扫描下载二维码求解二次分配问题的预处理快速蚂蚁系统
&&&&2014, Vol. 36 Issue (2): 135-140
吴果林, 李学迁. 求解二次分配问题的预处理快速蚂蚁系统[J]. 上海理工大学学报, ): 135-140.
WU Guo-lin, LI Xue-qian. Preprocessing Fast Ant System for Quadratic Assignment Problem[J]. Journal of University of Shanghai for Science and Technology , ): 135-140.
求解二次分配问题的预处理快速蚂蚁系统
吴果林1, 李学迁2&&&&
1. 桂林航天工业学院 理学部, 桂林 541004;2. 上海理工大学 管理学院, 上海 200093
基金项目: 国家自然科学基金资助项目();上海理工大学国家级项目培育基金资助项目(13XGQ05);上海理工大学人文社科基金资助项目(12XSY08)
作者简介:吴果林(1977- ),男,讲师.研究方向:智能优化.E-mail:guat_
摘要:分析了快速蚂蚁系统(FANT)跳出迭代最优解的策略,指出算法易发生停滞现象的原因,并通过改进算法解的构建步,引入一个变动的参数,提出了求解二次分配问题的一种新算法——预处理快速蚂蚁系统(PFANT).新算法改进了FANT算法易发生停滞的现象,拓宽了迭代最优解邻域的搜索范围,提高了二次分配问题解的质量.
二次分配问题&&&&
快速蚂蚁系统&&&&
变参数&&&&
Preprocessing Fast Ant System for Quadratic Assignment Problem
WU Guo-lin1, LI Xue-qian2&&&&
1. Faculty of Science, Guilin University of Aerospace Techology, Guilin 541004, C2. Business School, University of Shanghai for Science & Technology, Shanghai 200093, China
Abstract: For a fast ant system (FANT),the strategy for jumping out of local optimal solution was analysed,and the reason that the algorithm is easy to occur stagnation phenomenon was pointed out.Through the improvement of the solution construction step in the algorithm and the introduction of a variable parameter,a new algorithm for quadratic assignment problem-preprocessing fast ant system (PFANT) was proposed.The new algorithm mends FANT's some shortcomings such as stagnation,extends the search area of FANT iterative optimal solution neighbourhood and improves the solution quality.
Key words:
stagnation&&&&
variable parameter&&&&
二次分配问题(quadratic assignment problem,QAP)是由Koopmans等[
]在1957年提出的组合优化问题.该问题可描述为给定n个设施和n个节点,两个n×n的矩阵 D =(drs)和 F =(fij).其中drs是节点r和s之间的距离,而fij是设施i和j之间的流量.QAP是寻找一个分配方案,使得每一个设施分配一个节点.由于设施的数量等于节点的数量,故每一个分配方案相当于整数集{1,2,…,n}中的一个排列.QAP的目标是寻找整数集{1,2,…,n}中的一个排列,最小化目标函数
其中,Φ为整数集{1,2,…,n}所有排列的集合,φ为Φ中的一个排列(或问题的一个解),φi给出了设施i在当前解φ上的节点.
]于1976年证明QAP是一个NP-难的优化问题,因此当问题的规模超过30时,寻找问题的最优解就变得不切实际,一个切实可行的办法是使用元启发式算法以便在合理的时间内找到高质量的解.当前用于求解QAP的元启发式算法有遗传算法[
]、模拟退火算法[
]、禁忌搜索算法[ , ]、蚁群优化算法[ ,,,,,, ]和迭代局部搜索算法[ , ]等.
在过去的近20年里,蚁群优化算法被用于求解许多组合优化问题[
].事实上,对于二次分配问题中结构化的、现实生活例子,蚁群优化算法是已知的求解QAP的最好算法之一.本文调查分析了快速蚂蚁系统(fast ant system,FANT)[ , ],给出了预处理快速蚂蚁系统(preprocessing fast ant system,PFANT).该算法在构建问题的解时预先进行了搜索,挑选那些质量较优的解参与局部搜索,并设置动态的算法参数,防止算法陷入局部最优解,出现停滞.这种对FANT算法的改进既保持了其运行前期收敛速度快的优点[
],拓宽了算法的搜索范围,又改进了解的质量.数值实验进一步表明,预处理快速蚂蚁系统在求解结构化的、现实生活的例子保持蚁群优化算法的优越性;在求解随机产生无结构、网格距离例子时,其性能与求解这两类例子的最好算法——禁忌搜索算法(robust taboo search,RTS)[
]不相上下.
1 快速蚂蚁系统
受蚂蚁系统算法的启发,Taillard开发了求解QAP的蚁群优化算法,称为快速蚂蚁系统 [ , ].在FANT算法中,解的构建是由人工蚂蚁通过随机地选择还没有分配的设施i,利用概率选择规则将其分配到空闲的节点j上,即
式中,τij为分配设施i到节点j上的权重;Ni为设施i可分配的节点.
FANT算法不同于其它蚁群优化算法的地方主要是人工蚂蚁的数量和信息素更新管理.FANT算法仅使用一个人工蚂蚁,单个人工蚂蚁导致该算法快速寻找到一个质量较好的解归咎于局部搜索算法的引入和相当特殊的参数设置.另一个不同于其它蚁群优化算法,是信息素更新管理,FANT算法不使用信息素蒸发.初始所有的信息素都设置为1,每一次迭代后信息素更新方式为
式中,Jφ为当前解φ的目标函数值;Jφib为迭代最优解φib的目标函数值;r和R为两个参数.r的值在算法运行过程中可以发生改变,初始值设为1,而R为固定常数.除按式(2)的更新规则更新信息素之外,信息素与参数r还将在两种情况下发生改变:a. 如果迭代最优解φib发生改变,则参数与所有的信息素全都重新设置为1;b. 当人工蚂蚁构建的解与迭代最优解φib相同时,参数将增加1个单位且所有的信息素设为r.
设信息素矩阵为 Γ =(τij)n×n,初始,令r=1,τij=r(i,j=1,2,…,n),迭代最优解为φib,则FANT重复执行如下步骤(算法1):
利用式(1)构建问题的当前解φ;
利用局部搜索技术改进当前解φ,为方便计仍记为φ;
如果Z(φ)<Z(φib),则φib=φ,并设r=1,τij=r(i,j=1,2,…,n);
按式(2)的更新方式更新信息素矩阵 Γ .
2 预处理快速蚂蚁系统
从前面的叙述可以看出,FANT试图设计一种能够整合重点搜索迭代最优解和解构建时探索性的算法.也就是说,一方面通过信息素更新,FANT不断地增加迭代最优解的权重,使得算法在迭代最优解邻域选择问题的解;另一方面,当算法出现停滞时(FANT以构建解等于迭代最优解作为判断标准),重新设置信息素,并令r=r+1,降低迭代最优解与算法构建解所对应节点信息素增加的比重,减少迭代最优解所对应节点的权重,拓宽解的搜索范围,增加算法构建解的探索性.然而,从实验的结果来看,FANT算法解的质量并没有达到预期效果,只是在算法运行的初期,FANT总体上比其它算法要好一些,在算法运行的后期,其解的质量比其它算法要劣[
].即FANT算法初期收敛速度快,后期易出现停滞.出现这种现象,与FANT算法信息素更新策略有关.由于FANT算法在每次出现新的迭代最优解时,信息素重新设置为1,迭代最优解对应的节点信息素设为R,算法始终在迭代最优解邻域寻找问题的解,故算法运行初期收敛速度快.易见,这样处理的结果是算法容易陷于局部最优解,产生停滞.尽管FANT算法设计了跳出局部最优解的策略(当人工蚂蚁构建的解与迭代最优解φib相同时,参数将增加1个单位且所有的信息素设为r),但这种方式所需迭代次数太多,代价太高.关于这一点,可从下面的分析看出.
设FANT在t次迭代产生的迭代最优解φib,信息素矩阵为 Γ =(τij)n×n,τij=r且r=1,进一步假设此解φib为局部最优解,算法出现停滞.下面计算FANT算法跳出局部最优解所需迭代的次数.由于FANT算法采用当迭代产生的解与迭代最优解
φib相同时,重新设置信息素r,降低迭代最优解权重
的方法,改变停滞现象.为此,先计算第一次当前解与迭代最优解φib相同(即第t+k1次迭代产生的解等于迭代最优解φib)时,FANT算法所需迭代次数,记为k1. 根据FANT算法,每次迭代时,当前解对应节点的信息素增加1;迭代最优解φib对应节点的信息素增加R.故第t+k1次迭代时,信息素矩阵 Γ 每一行元素和都为n+k1(R+1),迭代最优解φib对应的每一个节点的信息素应小于等于k1(R+1)+1(此值为每次迭代时当前解等于迭代最优解时信息素的值).设在第t+k1次迭代时,迭代最优解作为当前解的概率P,由概率乘法公式
P(A1A2…An)=P(A1)P(A2 A1 )…
P(An A1A2…An-1)
同理,第s次重新设置信息素时,FANT算法所需迭代次数ks≥s()/(R+s)(1-).假定算法在第s次重新设置信息素后找到新
的迭代最优解,则算法跳出局部最优解所需要迭代的次数k≥.?考虑到FANT算法每次迭代所需要的时间花费为Ο(n3)[
],算法跳出局部最优解的代价非常高.
表 1给出了QAP规模为25,50,100,选择概率为0.1,0.5,0.9,重新设置信息素为1,2,…,6时,FANT算法所需迭代的次数,R的取值均为6.
表 1(Table 1)
表 1 跳出局部最优解的迭代次数
Table 1 Iterations times of jumping out of local optimal solution
11660405712481 6562971 0106 701
2441641 1131956814 5548162 77718 428
3823012 0563601 2588 4171 5085 13334 063
41274673 1885581 95013 0532 3387 96052 826
51786564 4747832 73718 3213 28111 17274 147
62348635 8891 0313 60224 1164 31914 70697 600
表 1 跳出局部最优解的迭代次数
Table 1 Iterations times of jumping out of local optimal solution
从表 1可以看出,要以较高的概率跳出局部最优解,算法所需的迭代次数非常多.以QAP规模50为例,若以0.9的概率取得局部最优解,算法至少需要迭代1 656次.由于算法每次迭代所需的时间为O(503),故算法跳出局部最优解的时间花费至少为1 656×O(503),这个数值已经超过RTS[
]算法求解QAP规模为50的迭代1 000×50次所需的时间(RTS每次迭代所需的时间为O(502)),而RTS算法迭代1 000×50次得到问题的解常常作为其它算法求QAP时比较的参照文献[ , ,
].也就是说,对于规模为50的QAP实例而言,FANT算法以0.9的概率跳出局部最优解的时间大于RTS算法1 000×50次迭代的时间.由表 1不难得出,QAP其它规模的例子同样也有类似的结果.综上所述,FANT算法设计跳出局部最优解的策略所需迭代次数太多,算法后期很少改进算法解的质量.
尽管有上述不足,但FANT算法仍然是求解QAP的非常有竞争力的算法,文献[ ,
]给出了两种改进的FANT算法.事实上,仔细分析算法1的流程不难发现,步骤2是对步骤1产生的解利用局部搜索进行改进,而改进后解质量的好坏很大程度取决于步骤1产生解的质量.因此,可以对步骤1进行改进,如对步骤1产生的解进行预处理,以便较高质量的解参与步骤2的搜索改进.由于步骤1构建解是不断通过随机选择一个设施由概率选择式(1)分配一个节点得到,故对于每一个设施i分配的节点φi,可以比较与前次迭代产生的解所对应的设施i的节点φ ′
i是否相同.若φi≠φ ′
i,将前次迭代解对应的两个节点φi,φ ′
i的位置进行交换,再比较交换后解的质量;若质量优于交换前的,则设施i分配节点φi,否则设施i还是分配原来的节点φ ′
i.上述方法通过不断地重复,最终得到改进的迭代解.易见,改进后的迭代解剔除了那些迭代过程中产生的质量较劣的解,使得每次迭代产生的解始终以较好的解参与步骤2的局部搜索,减少一些无为的迭代与局部搜索,保证更好质量的解产生.当然,上述改进也易使算法快速陷入局部最优解,产生停滞.为防止或减少该现象的发生,在算法每次得到一个新的迭代最优解时重新设置一个新的r值,记为r(t),区别于原算法每次重新设置r都等于1.
另一方面,由算法1可知,FANT算法采用固定参数R的策略,这种固定参数的策略对于规模较小的QAP例子容易过早陷入局部最优解.而对于规模较大的QAP例子由于迭代最优解的权重较轻,算法收敛速度较慢.为此,文献[
]给出了一种变参数的FANT算法,实验证明,改进了的算法求解QAP的质量有较大的提高.借鉴文献[
]的思想,为进一步简化运算,针对不同规模QAP采用不同的参数R的策略,记为R(n).因此,改进后的算法信息素更新方式为
综上所述,可以对FANT算法作如下两点改进:其一,在FANT算法解的构建步,对每一个设施分配的节点进行预处理,判断该分配是否改进上一次迭代解的质量,若改善,则分配该节点,否则,保留原迭代解分配的节点;其二,在FANT算法信息素更新步,由式(3)取代式(2)作为算法的信息素更新策略.改进后的FANT算法称为预处理快速蚂蚁系统(PFANT),其算法流程为:
设信息素矩阵为 Γ =(τij)n×n,初始令r(0)=1,τij=r(0)(i,j=1,2,…,n),初始解为φ,迭代最优解为φib,则PFANT重复执行步骤(算法2)为:
考查由式(1)分配的每一个节点的能否改进上一次迭代解φ的质量.若改善,则分配该节点;否则,保留原迭代解分配的节点.为方便计构建后的解记为φ;
利用局部搜索技术改进当前解φ,仍记为φ;
如果Z(φ)<Z(φib),则φib=φ,重新设置信息素τij=r(t)(i,j=1,2,…,n,t=1,2,…);
按式(3)的更新方式更新信息素矩阵 Γ .
3 数值实验
这一部分选择QAPLIB中的例子运行PFANT和FANT算法.实验的硬件环境为Pentium(R)4
2.5GH1处理器,80 GB硬盘,256 MB内存,Microsoft
Windows SP3操作系统,开发工具为VC+ +6.0.对于FANT算法,参数R=6;PFANT算法参数R=[2n],其中[]为取整运算,参数r随着迭代最优解φib的改变在1与2之间不断地取值.实验以RTS算法迭代1 000n次所需的时间作为迭代终止条件.实验采用QAPLIB中的例子按文献[
]分为4类.第一类,随机产生无结构问题,这类问题是根据均匀分布随机产生距离流量矩阵的问题.第二类,随机产生网格距离问题,这类问题的距离来源于一个网格,节点与节点的距离定义为网格上节点之间的曼哈顿距离.第三类,现实问题,这类问题是从实际问题抽象出来的.第四类,模拟现实问题,因为第三类现实 问题规模较小,所以这类问题是根据现实问题的特点随机产生的较大规模的问题.另外,考虑到规模小于20的问题容易求解,这里只测试规模大于等于20的问题,数值实验结果见表 2.表中给出的结果是超出已知最优解的百分比,最好的结果用斜粗体表示.
表 2(Table 2)
表 2 PFANT算法的测试结果
Table 2 Testing result of the PFANT algorithm
问题实例已知最优解RTSPFANTFANT
随机产生无结构问题Tai25a1 167 2560.008 20.004 00.010 5
Tai30a1 818 1460.004 00.005 90.020 3
Tai35a2 422 0020.008 20.016 80.015 6
Tai40a3 139 3700.012 60.006 90.012 1
Tai50a4 938 7960.014 30.013 50.019 6
Tai60a7 205 9620.013 30.013 10.019 4
Tai80a13 499 1840.017 80.023 20.017 8
模拟现实问题
Tai20b122 455 3190.000 00.000 00.000 0
Tai25b344 355 6460.000 00.000 00.000 0
Tai30b637 117 1130.000 20.000 00.000 0
Tai35b283 315 4450.000 00.000 00.001 9
Tai40b637 250 9480.000 00.000 00.000 1
Tai50b458 821 5170.001 90.004 10.000 0
Tai60b608 215 0540.000 60.000 00.000 2
Tai80b818 415 0430.000 70.009 10.006 0
Tai100b1 185 996 1370.002 60.000 20.002 7
随机产生网格距离问题
nug306 1240.000 00.000 70.000 7
sko4215 8120.000 40.000 40.003 5
sko4923 3860.001 00.000 70.000 9
sko5634 4580.001 70.002 10.003 1
sko6448 4980.000 90.000 10.003 1
sko7266 2560.000 80.000 70.002 6
sko8190 9980.001 60.001 10.002 9
sko90115 5340.001 30.003 30.002 8
kra30a88 9000.000 00.000 00.000 0
kra30b91 4200.000 00.000 00.000 0
ste36a9 5260.002 50.000 00.020 8
ste36b15 8520.008 70.000 00.000 0
表 2 PFANT算法的测试结果
Table 2 Testing result of the PFANT algorithm
尽管算法解的质量很大程度依赖所求例子[
],但从表 2仍然不难发现,PFANT算法解的质量较FANT算法有较大幅度的提升,总体上要优于FANT算法,例外的只有Tai35a,Tai80a,Tai50b,Tai80b.对比RTS算法,在RTS算法求解有较大优势的随机产生无结构与网格距离例子中,PFANT算法总体上质量也稍优于RTS算法;至于现实问题及模拟现实问题,PFANT算法全面优于RTS算法,例外的只有Tai50b,Tai80b.相对MMAS[
]算法在现实问题及模拟现实问题优于RTS算法,在随机产生无结构及网格距离问题逊于RTS算法而言,PFANT算法求解QAP上有较大提高.
其次,考察FANT与PFANT算法跳出局部最优解时重新设置信息素的次数,表 3给出了两算法求
表 3(Table 3)
表 3 FANT与PFANT算法重新设置信息素的次数
Table 3 The times of resetting pheromone in the FANT and PFANT algorithm
算法问题实例
Tai25aTai30aTai35aTai40aTai50aTai60aTai80aTai20b
FANT32132101
PFANT10111000
Tai25bTai30bTai35bTai40bTai50bTai60bTai80bTai100b
FANT30051100
PFANT00000100
nug30sko42sko49sko56sko64sko72sko81sko90
FANT02221100
PFANT02110100
kra30akra30bste36aste36b
表 3 FANT与PFANT算法重新设置信息素的次数
Table 3 The times of resetting pheromone in the FANT and PFANT algorithm
解上述4类问题的结果.从表 3明显可以看出,上述4类问题的每一个例子,PFANT算法重新设置的次数都小于或等于FANT算法.出现这种情况的原因是由于PFANT算法在每次迭代构建问题的解时都预先进行了搜索,剔除了那些质量较劣的解参与局部搜索.在相同的迭代时间内,算法能在局部最优解更广的邻域内搜索,增加发现更优的局部最优解的机会,减少了重新设置信息素的次数.
尽管FANT算法在信息素更新管理与解的构建方面较其它蚁群优化算法作了较大的改进,为求解不规则QAP例子最有竞争性的算法之一[
],但也有明显的缺点(如算法前期收敛速度较快,后期速度较慢,易发生停滞现象等).通过分析FANT算法跳出迭代最优解的策略,指出算法易发生停滞现象的原因,并提出了改进的方法,得到一种求解QAP的新算法——预处理快速蚂蚁系统(PFANT).理论与实验分析表明,PFANT算法较大程度地改进FANT算法的缺点,拓宽了算法迭代最优解邻域的搜索范围,减少了重新设置信息素的次数,改善了QAP解的质量.
Koopmans T C, Berkmann M J.Assignment problems and the location of economic activities[J]..
Sahni S, Gonzalez T.P-Complete approximation problems[J]..
Ahuja R K, Orlin J B, Tiwari A.A greedy genetic algorithm for the quadratic assignment problem[J]..
Connolly D T.An improved annealing scheme for the QAP[J]..
Skorin-Kapov J.Tabu search applied to the quadratic assignment problem[J]..
Taillard E D.Robust taboo search for the quadratic assignment problem[J]..
Maniezzo V, Colorni A.The ant system applied to the quadratic assignment problem[J]..
St&#252;tzle T, Hoos H H.MAX-MIN ant system[J]..
Gambardella L M, Taillard E D, Dorigo M.Ant colonies for the quadratic assignment problem[J]..
Taillard E D.FANT:fast ant system.Technical report IDSIA-46-98[R]..
Taillard E D, Gambardella L M.Adaptive memories for the quadratic assignment problems.Technical ReportIDSIA-87-97[R]..
吴果林, 刘登峰.改进的快速蚁群系统求解二次分配问题[J]..
吴果林.变参数的快速蚂蚁系统求解二次分配问题[J]..
St&#252;tzle T.Iterated local search for the quadratic assignment problem[J]..
Hussin M S, St&#252;tzle T.Hierarchical iterated local search for the quadratic assignment problem[J]..
马良, 项培军.蚂蚁算法在组合优化中的应用[J]..
Taillard parison of iterative searches for the quadratic assignment problem[J]..

我要回帖

更多关于 初中数学化简求值难题 的文章

 

随机推荐