局部搜索算法详解 您所在的位置:网站首页 最优化搜索算法是什么意思 局部搜索算法详解

局部搜索算法详解

2024-07-15 01:43| 来源: 网络整理| 查看: 265

转载声明:这篇文章是从网上好多文章总结摘抄来的,所以也不算是我写的,没法标出原转载网址;

1.局部搜索

通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力和全局搜索能力,缺一不可。向最优解的导向,对于任何智能算法的性能都是很重要的。

定义:

局部搜索是解决最优化问题的一种启发式算法。对于某些计算起来非常复杂的最优化问题,比如各种NP完全问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次寻找次优解,是一种近似算法(Approximate algorithms),以时间换精度的思想。局部搜索就是其中的一种方法。邻域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。例如:对于一个bool型问题,其当前解为:s = 1001,当将邻域动作定义为翻转其中一个bit时,得到的邻居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。同理,当将邻域动作定义为互换相邻bit时,得到的邻居解的集合N(s)={0101,1001,1010}.

描述算法时需用到领域的概念,所谓领域,简单的说即是给定点附近其他点的集合。在距离空间中,领域一般被定义为以给定点为圆心的一个圆;而在组合优化问题中,领域一般定义为由给定转化规则对给定的问题域上每结点进行转化所得到的问题域上结点的集合。公式描述如下:

设D为问题定义域,若存在一映射N,使得:

N:S∈D→N(S)∈2^D

则称N(S)为N的领域,A∈2^D为N的邻居。

局部搜索(Local Search)的一般过程是:

随机选择一个初始的可能解x,计算P=N(x)为x在映射N下的领域。如果满足结束条件则goto (9),其中结束条件包括规定的循环次数、P为空。Begin选择P的一个子集,y为此子集的一个最优解。如果f(y) h(mi)}

4, IF h(n) y == N - 1))) // 同在副对角线上 return true; return (pQueen_1->x == pQueen_2->x || pQueen_1->y == pQueen_2->y)? true:false; // 判定同行同列 } //////////////////////////////////////////////////////////////////////////////////// unsigned CountOfConflict(pQUEEN pN_Queen, unsigned n) { unsigned i, j, Count = 0; for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++) if (isConflict(pN_Queen + i, pN_Queen + j)) Count++; return Count; } /////////////////////////////////////////////////////////////////////////////////// bool ChangeTwoQueen(GRID ChessBroad[][N], pQUEEN pN_Queen, unsigned n) { int tmp, h1, h2; unsigned i, j, Count = 0; // 冲突数目 bool *isavH_1, *isavH_2; // 指向一维数组,用来标识两层循环中可用的皇后 isavH_1 = new bool[n]; isavH_2 = new bool[n]; for (i = 0; i < n; i++) isavH_1[i] = isavH_2[i] = true; // 初始均可用 Count = CountOfConflict(pN_Queen, n); // 两层循环产生从n个元素中选择个的组合数 for (i = 0; i < n - 1; i++) { //随机选择一个可用的皇后作为第一组合数h1 while (1) { h1 = rand() % n; if (isavH_1[h1]) { isavH_1[h1] = false; // 第二组合数从尚未选为第一组合数集合中选择 for (j = 0; j < n; j++) isavH_2[j] = isavH_1[j]; break; } } for (j = i + 1; j < n; j++) { //随机选择一个可用的皇后作为第二组合数h2 while (1) { h2 = rand() % n; if (isavH_2[h2]) { isavH_2[h2] = false; break; } } // 交换标号为h1,h2皇后的x坐标 tmp = pN_Queen[h1].x; pN_Queen[h1].x = pN_Queen[h2].x; pN_Queen[h2].x = tmp; if (Count > CountOfConflict(pN_Queen, n)) { // 更改相应的棋格 ChessBroad[pN_Queen[h2].x][pN_Queen[h1].y].pQueen = NULL; ChessBroad[pN_Queen[h1].x][pN_Queen[h2].y].pQueen = NULL; ChessBroad[pN_Queen[h1].x][pN_Queen[h1].y].pQueen = pN_Queen + h1; ChessBroad[pN_Queen[h2].x][pN_Queen[h2].y].pQueen = pN_Queen + h2; return true; } else { tmp = pN_Queen[h1].x; pN_Queen[h1].x = pN_Queen[h2].x; pN_Queen[h2].x = tmp; } // 交换标号为h1、h2皇后的y坐标 tmp = pN_Queen[h1].y; pN_Queen[h1].y = pN_Queen[h2].y; pN_Queen[h2].y = tmp; if (Count > CountOfConflict(pN_Queen, n)) { // 更改相应的棋格 ChessBroad[pN_Queen[h1].x][pN_Queen[h2].y].pQueen = NULL; ChessBroad[pN_Queen[h2].x][pN_Queen[h1].y].pQueen = NULL; ChessBroad[pN_Queen[h1].x][pN_Queen[h1].y].pQueen = pN_Queen + h1; ChessBroad[pN_Queen[h2].x][pN_Queen[h2].y].pQueen = pN_Queen + h2; return true; } else { tmp = pN_Queen[h1].y; pN_Queen[h1].y = pN_Queen[h2].y; pN_Queen[h2].y = tmp; } } } // 不存在这样的交换则返回false return false; } //////////////////////////////////////////////////////////////////////////////////// void PrintChessBroad(GRID ppChessBroad[][N], unsigned n) { unsigned i, j; printf("\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (ppChessBroad[i][j].pQueen == NULL) printf("*\t"); else printf("H\t"); } printf("\n\n\n"); } } //////////////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { GRID ChessBroad[N][N]; QUEEN nQueen[N]; while (1) { InitChessBroad(ChessBroad, nQueen, N); while (1) { // 完成皇后的布局 if (0 == CountOfConflict(nQueen, N)) { PrintChessBroad(ChessBroad, N); return 1; } if (!ChangeTwoQueen(ChessBroad, nQueen, N)) break; } } return 0; }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有