人工智能论文-遗传算法实现八皇后问题

合集下载

人工智能课程设计报告(八皇后问题与罗马尼亚问题)

人工智能课程设计报告(八皇后问题与罗马尼亚问题)

人工智能课程设计报告学号:20091000608姓名:王沙沙班级:191091指导老师:赵老师2011年10月14目录1.N皇后问题 (1)需求分析,设计 (1)设计表示 (1)运行结果 (2)用户手册即测试数据 (2)结论 (5)主要算法代码 (5)2罗马尼亚问题 (9)需求分析,设计 (9)设计表示,详细设计 (9)用户手册 (11)运行结果 (11)主要算法代码 (12)3.实习心得 (21)1 N 皇后问题1.问题描述、需求分析在N*N 的棋盘上分布N 个皇后,其中N 个皇后不能在同一行同一列,也不能出现在同一对角线上,此时N 个皇后不会相互攻击。

程序需能手动输入皇后个数,并分别采用回溯法、爬山法、遗传法得出皇后的分布情况,输出皇后的位置即棋盘。

2.设计思想2.1 形式化N 个皇后的位置可用一个N 维数组表示,如921543……,意思是第一个皇后在第一列的第9行。

2.2 程序模块CreatIndividual( )函数用于产生一组表示皇后不在同一行也不再同一列的的一位数组,即产生一组互不相等的0~N 之间的整数,便于快速求解。

IsLegal( )函数用于判断新放置的皇后是否合法,在回溯法中用到。

AttackQueenNum( )用于计算整个棋盘的攻击皇后个数,相当于一个评价函数,在爬山法和遗传法中用到;Find( )回溯法求解函数ClimbHill( )爬山法求解函数;GA( )遗传算法求解函数;(1)函数调用关系图如下:(2)函数接口规格说明:下图中的箭头指向表示为被指向函数所用2.3 详细设计a: CreatIndividual(int *A,int QueenNum):以当时时间为种子循环产生随机数,为了使得产生的随机数都不想等,设计集合S[N]并初始化为0,表示还没有产生一个皇后,当产生的皇后不在S[N]中即S[N]!=1时将S[n]置为1,接着产生下一个皇后,如此循环便产生一组互不相等的值。

八皇后实验报告

八皇后实验报告

八皇后实验报告八皇后实验报告引言:八皇后问题是一个经典的数学问题,它要求在一个8x8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击。

这个问题看似简单,但实际上却充满了挑战。

在本次实验中,我们将探索八皇后问题的解法,并通过编写算法来解决这个问题。

一、问题背景:八皇后问题最早由数学家马克斯·贝瑟尔于1848年提出,它是一道经典的递归问题。

在国际象棋中,皇后可以在同一行、同一列或同一对角线上进行攻击,因此我们需要找到一种方法,使得8个皇后彼此之间不会相互攻击。

二、解决方法:为了解决八皇后问题,我们可以使用回溯法。

回溯法是一种穷举搜索的方法,它通过逐步尝试所有可能的解决方案,直到找到符合要求的解。

具体步骤如下:1. 初始化一个8x8的棋盘,并将所有格子标记为无皇后。

2. 从第一行开始,依次尝试在每一列放置一个皇后。

3. 在每一列中,检查当前位置是否符合要求,即与已放置的皇后不在同一行、同一列或同一对角线上。

4. 如果当前位置符合要求,将皇后放置在该位置,并进入下一行。

5. 如果当前位置不符合要求,尝试在下一列放置皇后。

6. 重复步骤3-5,直到找到一个解或者所有可能的位置都已尝试过。

7. 如果找到一个解,将其输出;否则,回溯到上一行,继续尝试下一列的位置。

三、编写算法:基于上述步骤,我们可以编写一个递归函数来解决八皇后问题。

伪代码如下所示:```function solveQueens(board, row):if row == 8:print(board) # 打印解returnfor col in range(8):if isSafe(board, row, col):board[row][col] = 1solveQueens(board, row + 1)board[row][col] = 0function isSafe(board, row, col):for i in range(row):if board[i][col] == 1:return Falseif col - (row - i) >= 0 and board[i][col - (row - i)] == 1:return Falseif col + (row - i) < 8 and board[i][col + (row - i)] == 1:return Falsereturn Trueboard = [[0]*8 for _ in range(8)]solveQueens(board, 0)```四、实验结果:通过运行上述算法,我们得到了八皇后问题的所有解。

算法设计与分析实验报告—八皇后问题

算法设计与分析实验报告—八皇后问题

算法设计与分析实验报告—八皇后问题-姓名:***学号:********班级:软件83【问题描述】在国际象棋盘上放八个皇后,要求任一皇后吃不到别人,也不受其他皇后的攻击,求出问题的所有解。

【问题分析&算法设计】用8元组x[1: n]表示8后问题。

其中x[ i]表示皇后i放在棋盘的第i行的第x[ i]列。

由于不允许将2个皇后放在一列,所以解向量中的x[ i]互不相同。

2个皇后不能放在同一斜线上是问题的隐约束。

故若2个皇后放置的位置分别是(i,j)和(k,l),且i – j = k – l或i + j = k + l,则说明这2个皇后处于同一斜线上。

这两个方程分别等价于i – k = j – l和i – k = l – j。

由此可知,只要|i - k| = |j - l|成立,就表明2个皇后位于同一条斜线上。

问题的隐约束化成了显约束。

用回溯法解决8皇后问题时,用完全8叉树表示解空间。

【算法实现】#include "stdio.h"#include "math.h"#include "iostream.h"#define N 8 /* 定义棋盘大小*/static int sum; /* 当前已找到解的个数*/static int x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列*//* 每找到一个解,打印当前棋盘状态*/void Show(){sum++;cout << "第" << sum << "种情况:" << endl;cout << "坐标为:\t";for(int k = 0; k < N; k++)cout << '(' << k+1 << ',' << x[k] << ") ";cout << endl;cout << "---------------------------------\n";for (int i = 0; i < N; i ++){for (int j = 0; j < N; j ++)if (j == x[i]) //printf("@ ");cout << "* | ";else //printf("* ");cout << " | ";cout << "\n---------------------------------\n";}}/* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */int Judge(int k){// 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。

python八皇后问题递归算法

python八皇后问题递归算法

python八皇后问题递归算法Python八皇后问题递归算法是一种经典的算法,用于解决八皇后问题。

八皇后问题是一个典型的回溯算法问题,其目标是在一个8x8 的棋盘上放置 8 个皇后,使得每个皇后都不会攻击到其他的皇后。

在这个问题中,皇后可以攻击到同一行、同一列和同一对角线上的其他皇后。

因此,要解决这个问题,我们需要找到一种方法,使得每个皇后都能够在不攻击其他皇后的情况下放置在棋盘上。

递归算法是解决八皇后问题的一种常用方法。

在这种算法中,我们首先将皇后放置在第一行中的每个位置上,并递归地放置下一行的皇后,直到我们找到一种方案,其中每个皇后都不会攻击到其他皇后。

如果我们无法找到这样的方案,我们将回溯到前一行,并将前一行中的皇后移动到下一个位置上,继续递归寻找方案。

Python语言提供了丰富的库函数和语法特性,使得编写八皇后问题递归算法变得非常容易。

我们可以使用Python中的列表和循环语句来表示棋盘和皇后的位置,并使用递归函数来实现放置皇后和检查皇后位置的功能。

在编写递归函数时,我们需要注意以下几点:1. 递归函数的参数应该包括皇后的位置和当前行数。

2. 在放置皇后时,我们应该从左到右遍历每一列,并在每一列中检查皇后是否会攻击到其他皇后。

3. 如果当前行数达到8,说明我们已经找到了一种合法的方案,我们应该将其保存下来,并返回True,表示我们已经找到了一种方案。

4. 如果我们无法找到合法的方案,我们应该返回False,表示我们需要回溯到前一行。

最后,我们可以通过调用递归函数来解决八皇后问题,并输出所有合法的方案。

通过使用Python八皇后问题递归算法,我们可以更好地理解回溯算法和递归算法的工作原理,并提高我们的编程能力。

八皇后问题递归算法

八皇后问题递归算法

八皇后问题递归算法八皇后问题是一个经典的数学问题,其目标是在一个8×8的棋盘上放置8个皇后,使得没有两个皇后位于同一行、同一列或同一斜线上。

这个问题可以通过递归算法来求解,本文将详细介绍八皇后问题的递归算法及其实现过程。

我们需要定义一个函数来判断当前位置是否可以放置皇后。

该函数的输入参数为当前行和当前列,输出为一个布尔值,表示该位置是否可以放置皇后。

具体实现如下:```bool isSafe(int board[8][8], int row, int col){int i, j;// 检查当前列是否有其他皇后for (i = 0; i < row; i++)if (board[i][col])return false;// 检查左上方是否有其他皇后for (i = row, j = col; i >= 0 && j >= 0; i--, j--)if (board[i][j])return false;// 检查右上方是否有其他皇后for (i = row, j = col; i >= 0 && j < 8; i--, j++)if (board[i][j])return false;return true;}```接下来,我们可以使用递归算法来解决八皇后问题。

递归算法的思想是将问题分解为子问题,然后逐步解决子问题,最终得到原问题的解。

具体的递归算法如下:```bool solveNQueens(int board[8][8], int row){// 所有行都已经放置好了皇后,得到了一个解if (row == 8)return true;// 尝试在当前行的每个列中放置皇后for (int col = 0; col < 8; col++)// 检查当前位置是否可以放置皇后if (isSafe(board, row, col)){// 放置皇后board[row][col] = 1;// 递归求解下一行if (solveNQueens(board, row + 1))return true;// 回溯,撤销当前位置的皇后board[row][col] = 0;}}// 无法找到解return false;}```我们可以编写一个主函数来调用递归算法并打印结果。

人工智能实验报告(八皇后)

人工智能实验报告(八皇后)
if(canplace(m,i,a)) {
a[m]=i; sesearch(m+1,a); a[m]=100; } } } } int main() {
int a[8],i; fp=NULL; fp=fopen("output.txt","w+"); if(NULL==fp) {
printf("cann't open the file\n"); } for(i=0;i<8;++i)
if((a[j]+j)==(m+i)||//判断是否会有冲突 ((a[j]-j)==(i-m))|| (a[j]==i)) return 0;
++j; } return 1; } void output(int a[8]) { int i=0,j; fprintf(fp,"No %d:\n",n);
《人工智能导论》上机实验
八皇后问题求解
班级:10011207 姓名:盛家铭 学号:2012302532
图搜索策略实验 八皇后问题求解 一、实验软件
codeblocks 环境
二、 实验目的
通过实验能对搜索策略有更深刻的理解 熟悉人工智能系统中的问题求解过程; 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 熟悉对八数码问题的建模、求解及编程语言的应用。 三、 需要的知识 熟悉人工智能系统中的问题求解过程; 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 熟悉对八数码问题的建模、求解及编程语言的应用。 四、 实验数据及步骤 1、实验内容 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8 ×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法 直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于 同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的 n 皇后摆放问题:这时棋盘的大小变为 n×n,而皇后个数也变成 n。 当且仅当 n = 1 或 n ≥ 4 时问题有解。 2、程序函数调用图

用CSP(约束满足问题)方法解决八皇后问题

用CSP(约束满足问题)方法解决八皇后问题
//如果同一行其它位置有皇后,记录冲突点数
conflictNum++; } } //检查同一列是否有冲突 j=column; for(i=0;i<N;i++) { if((i!=row)&&(queenBoard[i][j]==QUEEN)) {
//如果同一列其它位置有皇后,记录冲突点数 conflictNum++; } } //检查'\'斜线是否有冲突 if(row>column) { i=row-column; j=0; } else { i=0; j=column-row; } for(;(i<N)&&(j<N);i++,j++ ) { if((i!=row)&&(queenBoard[i][j]==QUEEN)) { //如果'\'斜线其它位置有皇后,记录冲突点数 conflictNum++; } } //检查'/'斜线是否有冲突 if((row+column)<N) { i=row+column; j=0; } else { i=N-1; j=row+column-N+1; } for(;(i>=0)&&(j<=N);i --,j++)
该列的每一行中与该位置有冲突的皇后数,选取冲突数最小的位置作为新的该列的皇后位置, 并记录下该列被放置皇后的信息,记录被放置皇后信息的目的是为了避免算法陷入死循环。
为了更清楚地说明该算法,假设算法某一步搜索到的状态如下:
此时按照最小冲突算法,第二列、第六列、第七列和第八列的皇后 有冲突,则当计算第六列 的每一行的与该位置有冲突的皇后数时,结果如下:

人工智能实验报告,包括八数码问题八皇后问题和tsp问题

人工智能实验报告,包括八数码问题八皇后问题和tsp问题

八数码问题(一)问题描述在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。

这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。

现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。

该问题称八数码难题或者重排九宫问题。

(二)问题分析八数码问题是个典型的状态图搜索问题。

搜索方式有两种基本的方式,即树式搜索和线式搜索。

搜索策略大体有盲目搜索和启发式搜索两大类。

盲目搜索就是无“向导”的搜索,启发式搜索就是有“向导”的搜索。

1、启发式搜索由于时间和空间资源的限制,穷举法只能解决一些状态空间很小的简单问题,而对于那些大状态空间的问题,穷举法就不能胜任,往往会导致“组合爆炸”。

所以引入启发式搜索策略。

启发式搜索就是利用启发性信息进行制导的搜索。

它有利于快速找到问题的解。

由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零。

所以,这个数码不同的位置个数便是标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息就可以指导搜索。

即可以利用启发信息来扩展节点的选择,减少搜索范围,提高搜索速度。

启发函数设定。

对于八数码问题,可以利用棋局差距作为一个度量。

搜索过程中,差距会逐渐减少,最终为零,为零即搜索完成,得到目标棋局。

(三)数据结构与算法设计该搜索为一个搜索树。

为了简化问题,搜索树节点设计如下:struct Chess//棋盘{int cell[N][N];//数码数组int Value;//评估值Direction BelockDirec;//所屏蔽方向struct Chess * Parent;//父节点};int cell[N][N]; 数码数组:记录棋局数码摆放状态。

int Value; 评估值:记录与目标棋局差距的度量值。

Direction BelockDirec; 所屏蔽方向:一个屏蔽方向,防止回推。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京理工大学人工智能大论文题目:遗传算法实现八皇后问题姓名:xxxx学号:xxxxxxxxxxxxxx专业:xxxxxxxxxx院系:xxxxxxxxxxxxxxxx老师:xxxxxx日期:2015年12月20日目录摘要 (3)一、实验背景 (4)1.1 N皇后问题描述 (4)1.2 遗传算法 (4)二、实验目的 (5)三、实验内容 (5)四、实验步骤 (5)4.1编码方案 (5)4.2初始化种群 (6)4.3适应度的计算 (7)4.4遗传算子 (8)4.4.1选择算子 (8)4.4.2交叉方法 (8)4.4.3变异方法 (8)4.5局部搜索 (10)4.6终止策略 (10)4.7实现描述 (10)五、实验结果和分析 (11)六、总结与思考 (12)摘要众所周知的八皇后问题是一个非常古老的问题,具体描述如下:在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都不处于棋盘的同一行、同一列或同一对角线上。

本实验要求设计并实现解决八皇后问题的遗传算法。

能够给定任意一个初始状态,使用遗传算法搜索最优解,程序能显示优化的计算过程。

独立运行20次以上,统计遗传算法的寻优指标(包括是否找到最优解、平均迭代次数等)。

本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能力,增强对算法的理解能力,提高软件设计能力,在实践中培养独立分析问题和解决问题的作风和能力。

通过本实验的设计与编程实现让学生掌握基于状态空间知识表示的局部搜索策略,对遗传算法中的编码方法以及选择、复制、交叉、变异等基本算子有深入的理解,熟练运用C++,编写一个遗传算法解决八皇后问题的应用程序。

关键词:八皇后;遗传算法;C++一、实验背景1.1 N皇后问题描述N皇后问题描述如下:在n n格棋盘上放置彼此不受攻击的N个皇后。

按国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

N皇后问题等价于在以下三个约束条件:任何2个皇后不放在同一行;任何2个皇后不放在同一列;任何2个皇后不放在同斜线。

我们把n n的棋盘看作二维方阵,其行号从上到下列号从左到右依次编号为0,1,…,7。

设任意两个皇后,皇后1和皇后2的坐标分别是(i,j)和(k,l),则如果这两个皇后在从棋盘左上角到右下角的主对角线及其平行线(斜率为-1的线)上,i j k l;以上有i j k l;如果这两个皇后在斜率为+1的每一斜线上,有++两个方程分别等价于i k j l和i k l j因此任两皇后的在同一斜线上的i k j l。

充要条件是||||i k j l满足两个皇后不在同一斜线上的条件表示为:||||两皇后不在同一行用式表示为:i k两皇后不在同一列用式表示为:j l1.2 遗传算法遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。

每个个体实际上是染色体(chromosome)带有特征的实体。

染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。

因此,在一开始需要实现从表现型到基因型的映射即编码工作。

由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。

这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。

二、实验目的N皇后问题是经典的益智游戏,通过本实验的设计与编程实现让学生掌握基于状态空间知识表示的局部搜索策略,对遗传算法中的编码方法以及选择、复制、交叉、变异等基本算子有深入的理解。

本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能力,增强对算法的理解能力,提高软件设计能力,在实践中培养独立分析问题和解决问题的作风和能力。

熟练运用C++语言,独立编程,实现一个遗传算法解决八皇后问题的应用程序。

三、实验内容本实验要求设计并实现解决八皇后问题的遗传算法。

能够给定任意一个初始状态,使用遗传算法搜索最优解,程序能显示优化的计算过程。

独立运行20次以上,统计遗传算法的寻优指标(包括是否找到最优解、平均迭代次数等)。

n,即八皇后问题。

因为我的学号末尾为0,按照老师要求,则应该实现8四、实验步骤现在我们把任意n个皇后的任意一种放置办法当作一个个体(染色体),把其中的任意一个皇后当作一个基因,用遗传算法来解决该问题。

4.1编码方案对于此问题有三种编码方案:排列编码、二进制编码、矩阵编码,在这里,采用第一重编码方案,即排列编码,具体描述如下:用一维n 元数组[0,1...,1]x n来表示一个个体,其中[]{0,1...,1}x i n ,[]x i 表示皇后i 放在棋盘的第i 行第[]x i 列,即第i 行第[]x i 列放置一个皇后。

例如,[0]0x 表示棋盘的第0行第0列放一个皇后。

数组第i 个元素表示第i 行的放置情况,可以看作一个基因。

这种编码可以自然的解决了某一行只能放一个皇后的约束,如果数组的每一个元素[]x i 都不重复,可以看成0—n-1的一种排列,就自然保证每一列只能放一个皇后。

因此在交叉变异和产生个体时必须注意[]x i 的唯一性。

4.2初始化种群初始化种群的主要工作为:确定种群的大小及产生初始种群.种群的大小能够对遗传算法的收敛性产生很大的影响,种群较小算法收敛速度较快,但它的搜索面不够广,容易导致局部收敛;而种群较大算法收敛全局最优的概率也大,但是算法的收敛速度较慢。

因此根据N 皇后问题的特点,本文将种群大小设为N(皇后数)。

初始化种群的方法为:首先为每个体的染色体的基因位从1到N ,然后随机交换两个基因位的值,对每个个体共交换N/2次,对种群中所有个体做上述操作。

双亲遗传时候的初始化种群实现如下:void CreateMultiStartPopulation (){ int loop, i, j ; int tmp[MAX_QUEENS] ; for (loop = 0 ; loop < m_size ; loop ++) { for (i = 0 ; i < n ; i++) tmp[i] = i ; for (i = 0 ; i < n ; i++) { j = rand() % (n - i) ; m_population[loop].queen[i] = tmp[j] ; tmp[j] = tmp[n - i - 1] ; } UpdateFitnessScore(&m_population[loop]) ; } }4.3适应度的计算设ij a 表示皇后i 和皇后j 之间的相互攻击,即:⎩⎨⎧=不攻击和攻击和j i j i a ij 01皇后i 和j 的攻击度:⎩⎨⎧--=other ji j x i x a ij 0|][][|1=第i 个皇后的攻击度i a 表示皇后i 在除自身外其余n-1个皇后中与皇后i 相冲突的数目,即有几个皇后与皇后i 相攻击。

如果皇后i 和所有皇后都冲突则攻击度为n-1,与所有的皇后都不冲突攻击度为0。

因此,得到111i niijij j j i a a a 。

同理,皇后i 的非攻击度表示和皇后i 没有冲突的皇后数目,设i b 表示i 的非攻击度,则1ii b n a 。

我们根据非攻击度计算:用i f 表示基因i 的适应度,即第i 个皇后的非攻击度,则i i f b 。

如果某一个皇后i 和所有其余的n-1个皇后都互不攻击,则1if n 。

个体的适应度是指所有皇后的非攻击度之和,适应度函数可表示如下:1ni i ff 。

对于一个合法的放置方案每一个基因的适应度都是n-1,此时染色体的适应度是(1)n n 。

// 更新 p 的适应度void UpdateFitnessScore (Population *p) { int i, j; p->unitFitness = 0 ; for (i = 0 ; i < n ; i++) { p->eachFitness[i] = 0 ; for (j = 0 ; j < n ; j++) p->eachFitness[i] += Aggressive(p, i, j) ; p->unitFitness += p->eachFitness[i] ; // 个体的适应度为所有的基因的适应度的总和 } }4.4遗传算子4.4.1选择算子目前常用的选择算子有二种:轮盘赌选择算子和二进制锦标赛选择算子。

轮盘赌选择算子的缺点在于容易产生出超级个体,易导致算法局部收敛。

但为了实现简单,我选择轮盘赌选择算子,即被选到的概率与适应度呈正比(越是优越的个体基因越容易被保留下来),具体试下如下:int RouletteWheelSelection(){int selection = 0;int i ;double slice = (double)rand() / RAND_MAX;double addFitness = 0;for(i = 0; i < m_size ; i++){addFitness += (double)m_population[i].unitFitness / m_totFitness ;if(addFitness > slice){selection = i;break;}}return selection;}4.4.2交叉方法交叉方法可用的交叉方法有以下几种。

设p1,p2是要交叉的两个父染色体,c1,c2是子代,是交叉的结果,n是编码长度。

单点交叉:先随机生成交叉位置)1m,把p1[0:m]与p2[0:m]部分互换分m0(-≤n<别得到c1,c2。

4.4.3变异方法采用随机变异方法。

随机生成变异数目m,随机选择m个皇后把它去掉,然后再随机选择m个位置放上皇后。

相关文档
最新文档