八皇后问题:

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。正确的解有很多个,遗传算法并不直接计算一共有多少个解,而是寻找满足条件的解,从一种状态进化到一种满足8皇后不能互相攻击的状态.

Q . . . . . . .

. . . . Q . . .

. . . . . . Q .

. Q . . . . . .

. . . Q . . . .

. . . . . . . Q

. . . . . . . .

. . Q . . . . .

用matplotlib简单可视化棋盘

import random

import numpy as np

import matplotlib.pyplot as plt

def display_chessboard(coordinates):

plt.figure(figsize=(7, 7))

for i in range(9):

plt.axhline(y=i,c='black')

for i in range(9):

plt.axvline(x=i,c='black')

for x,y in coordinates:

plt.text(x+0.35,y+0.35,'Q',size=20,color='blue')

plt.xlim(0,8)

plt.ylim(0,8)

这是一个满足条件的状态

# 这是一个正确的摆法

coordinates = [(2, 0),(4, 1),(7, 2),(3, 3),(0, 4),(6, 5),(1, 6),(5, 7)]

display_chessboard(coordinates)

遗传算法求解8皇后问题

随机初始化和变异

加入部分约束条件

下面是遗传算法实现过程

1. 随机状态初始化

# 随机生成初始状态

def generate_initinal_state(length,constraint=False):

geneSet = list(range(length))

# 不同行不同列约束

if constraint:

coordinate_xs = random.sample(geneSet,length)

coordinate_ys = random.sample(geneSet,length)

coordinates = [(x,y) for x,y in zip(coordinate_xs, coordinate_ys)]

else:

coordinate_xs = [random.sample(geneSet,1)[0] for i in range(length)]

coordinate_ys = [random.sample(geneSet,1)[0] for i in range(length)]

coordinates = [(x,y) for x,y in zip(coordinate_xs, coordinate_ys)]

return coordinates

coordinates_1 = generate_initinal_state(8)

coordinates_2 = generate_initinal_state(8, True)

##### 随机初始,只有一个queen满足条件

display_chessboard(coordinates_1)

这个是没有约束的随机初始化

##### 增加行列约束后,有两个queen满足条件

display_chessboard(coordinates_2)

增加了行列约束的

2.适应度的计算

需要一个合适的适应度函数来量化当前棋盘的状态,便于跟其他状态进行比较.

逐个计算每个Queen的状态,满足条件+1,bestFitness = 8

通过Queen的坐标计算当前棋盘状态,bestFitness = 0

方案1:比较简单,就是遍历Queens,检测前后左右,对角线有无其他Queen,详细说下方案2:

Queen横坐标集合,x_set

Queen纵坐标集合.y_set

以棋盘左下角为原点,计算Queens坐标和(x+y)的集合,a_set

以棋盘右下角为原点,计算Queens坐标和(x+y)的集合,b_set

f

i

t

n

e

s

s

=

8

×

4

(

l

e

n

(

x

s

e

t

)

+

l

e

n

(

y

s

e

t

)

+

l

e

n

(

a

s

e

t

)

+

l

e

n

(

b

s

e

t

)

)

fitness = 8 \times 4 - (len(x_{set})+len(y_{set})+len(a_{set})+len(b_{set}))fitness=8×4−(len(xset​)+len(yset​)+len(aset​)+len(bset​))

步骤1: x_set的长度就是不同列Queens的数量

步骤2: y_set的长度就是不同行Queens的数量

步骤3,4: 就是判断以Queen为中心,左右对角线有无Queen,如下图:

步骤5: 32是指8个不同x坐标,8个不同的y坐标,8个不同左右对角线,8

×

4

=

32

8 \times 4 = 328×4=32,所以要满足不能相互攻击的条件:

l

e

n

(

x

s

e

t

)

+

l

e

n

(

y

s

e

t

)

+

l

e

n

(

a

s

e

t

)

+

l

e

n

(

b

s

e

t

)

=

32

len(x_{set})+len(y_{set})+len(a_{set})+len(b_{set}) = 32len(xset​)+len(yset​)+len(aset​)+len(bset​)=32

所以在8皇后问题中,fitness = 0时最好的.

发现没有,如果Queen在同一对角线的话,坐标和是相等的,如果8个Queen的坐标和是不同的8个数字,那就满足了条件的25%了

2.1适应度函数

def get_fitness(coordinates):

x_s = [coordinate[0] for coordinate in coordinates]

y_s = [coordinate[1] for coordinate in coordinates]

x_set = set(x_s)

y_set = set(y_s)

# 左对角线

a_set = set([sum(coordinate) for coordinate in coordinates])

# 右对角线(反转x轴)

b_set = set([8 - coordinate[0]+coordinate[1] for coordinate in coordinates])

fitness = 32 -len(x_set)-len(y_set)-len(a_set)-len(b_set)

return fitness

计算一个状态的适应度

random_state = generate_initinal_state(length=8)

display_chessboard(random_state)

print('random_state fitness : ',get_fitness(random_state))

random_state fitness : 10

3.变异方法

无约束随机

这个地方可以加入一些约束,加速,但是复杂的约束会影响效率

def mutate(coordinates, coordinateSet):

index = np.random.randint(8)

new_coordinates = coordinates.copy()

picked_gene = coordinates[index]

new_gene, alternative = random.sample(coordinateSet, 2)

if picked_gene == new_gene:

new_coordinates[index] = alternative

else:

new_coordinates[index] = new_gene

return new_coordinates

从随机初始状态进化的过程

init_state = generate_initinal_state(length=8,constraint=True)

display_chessboard(init_state)

初始状态是加入了约束的,开局的状态比较理想.

print('init state fitness : ',get_fitness(init_state))

init state fitness : 4

coordinateSet = [(x,y) for x in range(8) for y in range(8)]

state_logs = []

fines_logs = []

bestState = init_state

bestFitness = get_fitness(init_state)

state_logs.append(bestState)

fines_logs.append(bestFitness)

while True:

childState = mutate(bestState,coordinateSet)

childFitness = get_fitness(childState)

state_logs.append(childState)

fines_logs.append(childFitness)

if childFitness > bestFitness:

continue

print('childState Fitness :',childFitness)

if childFitness == 0:

display_chessboard(childState)

break

bestState = childState

bestFitness = childFitness

childState Fitness : 4

childState Fitness : 4

childState Fitness : 4

childState Fitness : 4

childState Fitness : 4

childState Fitness : 3

childState Fitness : 3

childState Fitness : 3

childState Fitness : 3

childState Fitness : 3

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 2

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 1

childState Fitness : 0

适应度的变化

进化的过程我做成了短视频,会放到公众号: 唐牛才是食神

常驻作者: 今晚打老虎, 懂王就是懂, 唐牛才是食神

安利一下公众号:

原文链接:https://blog.csdn.net/u014281392/article/details/108670778

python遗传算法八皇后_遗传算法之:八皇后问题相关推荐

  1. python 求函数最大值_遗传算法与Python图解

    import matplotlib.pyplot as plt import numpy as np import random import pandas as pd 遗传算法求函数最值 遗传算法的 ...

  2. python 遗传算法 排课_遗传算法实现自动排课

    暑期带了几个学生做自动排课系统.系统以高校为假想服务对象,要求安排好一所高校一学期的课表,包括公共必修课.专业必修课.公共选修课.专业选修课.系统要求在满足教室.老师.学生各自不存在冲突.教室资源符合 ...

  3. python遗传算法排课表_遗传算法与Python图解

    import matplotlib.pyplot as plt import numpy as np import random import pandas as pd 遗传算法求函数最值 遗传算法的 ...

  4. python遗传算法计算实例_遗传算法python简单例子(详解)

    # -*-coding:utf-8 -*- #目标求解sin(x)最大值 import random import math import matplotlib.pyplot as plt #初始化种 ...

  5. 异同点 模拟退火 遗传算法 邻域搜索_遗传算法与模拟退火算法比较

    一.遗传算法与模拟退火算法比较 分析模拟退火算法的基本原理可以看出,模拟退火算法是 通过温度的不断下降渐进产生出最优解的过程, 是一个列马尔科 夫链序列,在一定温度下不断重复 Metropolis 过 ...

  6. python深度优先算法 八皇后_八皇后问题——DFS(深度优先搜索)

    八皇后问题,是在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法? 算法思路: 八皇后问题实质为一种深度优先(DFS)搜索问题. ...

  7. python路线寻优_基于DEAP库的Python进化算法从入门到入土 --(四)遗传算法的改进...

    前言 前面一节我们尝试了用GA求解TSP问题,简单遗传算法总是不能很好收敛到一个较优的解,在用时和求解精度上都被贪心算法吊打.在末尾我们总结了三个可能的改进方向,这次我们想要沿着这三个方向试着改进简单 ...

  8. 遗传算法 python 简书_遗传算法(Genetic Algorithm ,GA)学习笔记

    1 遗传算法的概念 1.1 遗传算法的科学定义 遗传算法(Genetic Algorithm, GA) 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程 ...

  9. python 遗传算法 排课_基于遗传算法的高校排课系统研究

    1  前言 每个学期对本校教学任务进行合理安排是教务科的重要任务.其中排课是最为关键的环节.排课问题的本质是将课程.教师和学生在合适的时间段内分配到合适的教室中,涉及到的因素较多,是一个多目标的调度问 ...

最新文章

  1. 怎样配置VNC服务器使其能在红帽企业Linux3系统引导时自动启动?
  2. HDLBits 系列(41)根据仿真波形来设计电路之组合逻辑
  3. REST API出错响应的设计(转)
  4. Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
  5. 276. Paint Fence
  6. 【NLP技术应用】工业界求解NER问题的12条黄金法则
  7. vue父子组件、兄弟组件之间的通信和访问
  8. 手机调试java代码_【奇技淫巧】Intellij IDEA调试ysoserial等Java项目的方法
  9. Nginx1.0.9配置虚拟主机
  10. 500 内部服务器错误php,如何解决php 500 - 内部服务器错误
  11. python编码转换中文_python3如何中文转换编码?
  12. 3-24Pytorch与张量变形
  13. Visual Studio 2019 16.3 Preview 3 发布,使用 IntelliCode 重构更容易
  14. Thinkphp 公共函数自动加载
  15. java虚拟机相关知识点(全网最全)
  16. 进入第一个Android应用界面
  17. LINUX 游戏服务器之旅1_SSH连接
  18. 我常用的几款数据软件
  19. 数据结构与算法学习笔记
  20. 微信小程序录制视频功能实现

热门文章

  1. Visual Studio 2005 SP1安装 关键点
  2. libevent 安装异常
  3. win10每次开机都会自检系统盘(非硬件故障)——解决方案2019.07.12
  4. java.lang.OutOfMemoryError: Java heap space解决方法
  5. 解决问题redis问题:ERR Client sent AUTH, but no password is set
  6. fetch使用的常见问题及解决办法
  7. 解决python中文乱码的方法
  8. MariaDB 修改存储路径后启动失败问题解决
  9. 在Java中哪里可以获得“UTF-8”字符串文字?
  10. Frame Buster Buster ......需要buster代码