应用遗传算法快速寻找游戏装备的最优组合

本文是“数据建模与优化”课程的课程作业。切勿当真。仅供赏玩。下载完整代码和论文

摘要:本文介绍了应用遗传算法解决游戏装备的最优组合问题。首先会简单介绍什么是游戏装备的最优组合问题,以及研究该问题的实际意义。并介绍了解决该问题的现有方法——穷举法。然后给出了游戏装备的最优组合问题的数学语言描述,以及针对该问题应用遗传算法所需关键点,如编码方式、评估函数等。大量实验数据表明寻找游戏装备的最优组合遗传算法要优于穷举法。

关键字:遗传算法, 组合问题, 游戏装备

内容目录

1 简介 1

2 游戏装备问题 2

2.1 数学模型 2

2.2 遗传算法 3

2.3 求解步骤 4

3 实验 5

3.1 装备库种类n←2、最大装备数量m←50 6

3.2 装备库种类n←4、最大装备数量m←100 7

3.3 装备库种类n←6、最大装备数量m←100 8

4 总结 9

引用 10

课程感言 10

代码 11

简介

大型多人在线游戏开发过程中,装备数值设定是个令人头痛的问题。例如游戏中可以选择头、手、足、胸等多个部位多种装备进行组合,在增强游戏角色的某种能力的同时削弱另一种能力。游戏玩家在游戏过程中收集不同装备进行搭配,获得高于其他玩家的能力。而开发人员也希望了解当前的装备数值设定是否真正能够达到预期的目的。其中游戏装备中最优组合对游戏中装备等级的划分,装备的持有率,以及游戏平衡性都有重要的指导作用。特别是“极品装备”对于游戏运营的效益有极为密切的联系。

现有开发中,在寻找游戏装备最优组合时最常用的是穷举法。计算出所有可能的装备组合,并比较寻找最优组合。这种方法能保证寻找到的是真正的最优组合。但是在电子游戏迅速发展的今天,伴随着大型多人在线游戏的迅速扩张,游戏装备品种越来越多,数量越来越大,等级越来越细。穷举法的计算时间会随着游戏装备的品种、数量、等级的增长以几何级数增加。这使得游戏数值的调整、新的游戏装备的添加所需要的验证时间越来越长。大量的时间浪费在穷举计算的等待上。

使用近似计算寻找游戏装备的最优组合,可以极大的提高计算效率。加快近似最优组合的求解。虽然近似计算得到的可能的最优组合不一定是真正的最优组合,但是求解本身是为了给游戏开发和运营提供参考,所以也是具有实际意义的。这其中遗传算法采用的编码、交叉、选色,整个过程可以无须大的修改隐射到游戏装备最优组合的寻找问题中。本文将全面描述应用遗传算法寻找游戏装备的最优组合问题(以下简称“装备问题”)。

2章将对装备问题进行描述,同时会给出该问题的数学定义、装备问题遗传算法中基因编码、交叉、选则的方法、和求解步骤。第3章会给出一个用于实验的“装备问题”。为了更好的说明遗传算法应用,用于实验的“装备问题”经过了简化。删除了与计算无关的旁支末节,保留了“装备问题”的核心内容。同时实验环境、实验内容、实验结果和与穷举法的对比也在第3章进行了阐述。

游戏装备问题

2.1 小节描述了“装备问题”的数学模型。2.2 小节概述了一般性的遗传算法,并针对“装备问题”的数学模型设计了遗传算法的几个要素:基因编码、交叉、选择。2.3 小结描述了应用遗传算法求解“装备问题”的主要步骤。

数学模型

设某游戏提供n种装备库E{E1…En},游戏角色提供编号为1…n插槽分别设置这些装备。每个插槽只能且必须安装对应编号装备库中的一只装备。每种装备库中有m个可选装备Ei{xi1…xim},其中1≤i≤n1≤m≤MAX。合理的装备方案X{x1…xn}xi来自对应的Ei。每个装备为游戏角色提供了分值Sij Obj(xij)1≤j≤m。现求一种装备方式,使得∑Si取得最大值,其中1≤i≤n

标准模型:

max ∑Si

s.t. Si =Obj(xi)

xij∈Ei

Ei∈E

1≤j≤count(Ei)

1≤i≤n

遗传算法

遗传算法(Genetic Algorithm)是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程 搜索最优解的方法,它是有美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptation in Natural and Artificial Systems》,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。

遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则 由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征 的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度 (fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后 生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。

应用遗传解决“装备问题”:将设置装备的插槽1…n 分别作为基因位(Locus),每个基因位选择对应序号的装备库中的装备编号作为等位基因(Alletes。这n个基因组成的1…n序列为一条染色体。

由于每个装备只可以设置在对应的插槽中,所以进行最简单的单点交叉就可保证交叉后新解的合理性。

1

2

3

i

n-2

n-1

n

父代X

x1

x2

x3

……

xi

……

xn-2

xn-1

xn

父代Y

y1

y2

y3

……

yi

……

yn-2

yn-1

yn

子代a

x1

x2

x3

……

yi

……

yn-2

yn-1

yn

子代b

y1

y2

y3

……

xi

……

xn-2

xn-1

xn

1

评估函数 eval(x) Obj(x) + A,即目标函数Obj(x) ∑Si加上一个足够大的正数AA总是满足A > |∑Si|,以保证eval(x)总是为正。

特别的,为了避免在已经寻找到可能最优解的情况下,仍然完成剩余的迭代,增加了最优解稳定次数,作为第二个退出条件。在经过s次迭代后,都没有找到一个比当前记录的最优解评估函数更好的解时,退出迭代,将当前记录的最优解作为可能最优解输出。而这个s即为最优解稳定次数。这样就可以将迭代次数尽可能加大,扩大最优解搜索范围的同时,不浪费计算时间。

求解步骤

Step 0: 初始化 选择种群大小P;初始化可能装备组合X1…Xp,其中Xi = {x1…xn};交叉概率pc;变异概率pm;子代数限制tmax;当前代数t,并设置t←0;最优解稳定次数限制smax;当前最优解稳定次数s,并设置s←0;从初始种群中选择评估函数值最大的解,令Xbest←Xi

Step 1: 终止条件 如果t = tmaxs = smax时,Xbest即为可能的最优装备组合。输出并终止计算。

Step 2: 产生新子代

Substep 1: 交叉 根据交叉概率pc,在当前种群中选取P * pc条装备组合进行单点交叉,其中第1条同第P * pc条交叉,其余第i条同第i – 1条交叉。得到新的P * pc条染色体放入待选池中。

Substep 2: 变异 根据变异概率pm,在当前种群中选取P * pm条染色体进行变异,改变这P * pm条染色体每条染色体的随机一位基因。得到的新的P * pm条染色体放入待选池中。

Substep 3: 选择 从当前种群中选择评估函数eval(X)最大的装备组合xb,加入新的子代;将待选池中的装备组合按照评估函数eval(X)的值从高到低排列,选择前P – 1条加入新的子代。

Substep 4: 更新最优 在新子代中选择评估函数eval(X)最大的染色体Xnb,如果 eval(Xnb) > eval(Xbest),则更新Xbest←Xnb;否则s←s+1

Step 3: 迭代 增加t←t+1,并跳转到 Step1

实验

在实验中,虚拟了一个机器人大战游戏。该游戏提供n种装备库分别装备机器人的头、胸和四肢。每个部位只能且必须安装对应编号装备库中的一只装备。每种装备库中的装备数量在1m之间。每个装备为机器人提供了一定的分值,为了说明问题,这里简化成一个线性分值。装备提供的分值可能为正,也可能为负。分值越高,战斗力越强。要寻找一种装备方式,使得机器人在这种装备方式下战斗力最强。

实验软件环境使用Linux系统,Java 6.0SE。硬件环境使用 Intel Centrino 1.6 GHz CPU512M 内存。

令:

子代数 t←1E+5

最优解稳定次数 s←1E+3

交叉概率 pc←0.8

变异概率 pm←0.1

种群数量 P←100

装备库种类n←2、最大装备数量m←50

遗传算法计算:

序号

eval(x)

计算时间(ms

子代数

退出条件

1

188.9334441363862

482

1004

s = smax

2

188.9334441363862

478

1002

s = smax

3

188.9334441363862

480

1004

s = smax

4

188.9334441363862

478

1001

s = smax

5

188.9334441363862

483

1003

s = smax

6

188.9334441363862

486

1008

s = smax

7

188.9334441363862

487

1001

s = smax

8

188.9334441363862

480

1002

s = smax

9

188.9334441363862

483

1001

s = smax

10

188.9334441363862

490

1007

s = smax

平均值

188.9334441363862

482.7

1003.3

标准差

0

3.77

2.37

答优率

100.00%

2

穷举计算:

序号

eval(x)

计算时间(ms

计算次数

1

188.9334441363862

76

315

2

188.9334441363862

87

315

3

188.9334441363862

87

315

4

188.9334441363862

102

315

5

188.9334441363862

94

315

6

188.9334441363862

76

315

7

188.9334441363862

94

315

8

188.9334441363862

78

315

9

188.9334441363862

92

315

10

188.9334441363862

87

315

平均值

188.9334441363862

87.3

315

标准差

0

8.19

0

答优率

100.00%

3

3.1实验数据可以得出:

  1. nm规模较小时,遗传算法和穷举法都可以寻找到最优解。

  2. 遗传算法在获得了可能的最优解后花费了大量的时间来验证这个可能最优解是否稳定,所以在nm规模较小时,穷举法所消耗的计算总时间远小于遗传算法。遗传算法的10次计算退出条件全部是达到可能最优解稳定次数上限。同时实际计算次数同可能最优解稳定次数上限接近。例如遗传算法第7次计算,在第一代中已经寻找到了可能的最优解。然后继续计算了1000次,以便验证这个可能的最优解是否稳定。

装备库种类n←4、最大装备数量m←100

遗传算法计算:

eval(x)

计算时间(ms

子代数

退出条件

1

387.3774374339101

614

1142

s = smax

2

387.3774374339101

634

1181

s = smax

3

387.3774374339101

723

1349

s = smax

4

387.3774374339101

582

1064

s = smax

5

387.3774374339101

890

1677

s = smax

6

387.3774374339101

632

1177

s = smax

7

387.3774374339101

821

1546

s = smax

8

387.3774374339101

574

1060

s = smax

9

387.3774374339101

717

1341

s = smax

10

387.3774374339101

596

1103

s = smax

平均值

387.3774374339101

678.3

1264

标准差

0

101.9

200.03

答优率

100%

4

穷举计算:

eval(x)

计算时间(ms

计算次数

1

387.3774374339101

1475

3527415

2

387.3774374339101

1518

3527415

3

387.3774374339101

1493

3527415

4

387.3774374339101

1502

3527415

5

387.3774374339101

1507

3527415

6

387.3774374339101

1500

3527415

7

387.3774374339101

1535

3527415

8

387.3774374339101

1482

3527415

9

387.3774374339101

1499

3527415

10

387.3774374339101

1489

3527415

平均值

387.3774374339101

1500

3527415

标准差

0

16.5

0

答优率

100.00%

5

3.2实验数据可以得出:

  1. 在适当增加了nm的数值,整体规模增加的时候,遗传算法计算的优势已经体现出来。

  2. 穷举计算在计算时间上是稳定的,每次计算所花费的时间基本一致。

  3. 遗传算法在计算时间上并不稳定,每次计算所花费的时间差异很大。但仍然能保证计算结果收敛于正确结果。

装备库种类n←6、最大装备数量m←100

遗传算法计算:

eval(x)

计算时间(ms

子代数

退出条件

1

567.9881772350686

749

1239

s = smax

2

567.9881772350686

1780

3024

s = smax

3

567.9881772350686

719

1197

s = smax

4

567.9881772350686

1966

3324

s = smax

5

567.9881772350686

815

1364

s = smax

6

567.9881772350686

1629

2783

s = smax

7

567.9881772350686

1013

1708

s = smax

8

567.9881772350686

1002

1682

s = smax

9

567.9881772350686

958

1596

s = smax

10

567.9881772350686

818

1368

s = smax

平均值

567.9881772350686

1144.9

1928.5

标准差

0

440.28

757.69

答优率

100%

6

穷举计算:

eval(x)

计算时间(ms

计算次数

1

567.9881772350686

1108672512

7

3.3实验数据可以得出:

  1. 穷举法在计算规模进一步增大后,计算次数陡然增大了 314 倍,未能在可接受的时间里计算出正确结果。

  2. 遗传算法在计算规模进一步增大后,在计算次数和计算时间上略微增加。

  3. 遗传算法计算结果的标准差进一步增加,但仍然能保证计算结果收敛于正确结果。

总结

综合上述实验表明,计算规模增大时,穷举法的计算开销(时间、计算次数)会承几何级数增长。而遗传算法的计算开销(时间、计算次数)增加平稳。但是由于遗传算法本身的设计思路,遗传算法无法保证每次的计算都能够寻找到最优解。且每次计算所花费的时间差异明显。但是对于如“装备问题”等需要指导性数据的实际问题中,一个可能的最优解即可对游戏数值调校加以引导。

随着游戏产业的发展,游戏玩家要求提高,游戏内容也越来越丰富。游戏中出现的各种组合问题也越来越复杂。实际开发中,装备库种类n达到十几或者几十种,而每个库中最大装备数量m可能数百甚至上千。采用穷举计算寻找游戏中装备的最优组合是异常困难。实验表明,在寻找游戏中装备的最优组合问题上,遗传算法能够发挥其解决复杂组合问题的优势,快速的寻找到游戏中装备的最优组合。

对于其他类型游戏,如策略游戏。在寻找最佳发展策略这个问题上,遗传算法也可以发挥其威力。这是我们下一步要进行的研究。

引用

[1] Goldberg, David E (1989), 遗传算法:搜索、优化和机器学习,Kluwer Academic Publishers, Boston, MA.

[2] Mitchell, Melanie (1996), 遗传算法概论,MIT Press, Cambridge, MA.

[3] Vose, Michael D (1999), 简单遗传算法:基础和理论, MIT Press, Cambridge, MA.

[4] Ronald L. Rardin (2007), 运筹学:优化模型与算法, 电子工业出版社, pp. 695-697. ISBN 978-7-121-04925-5.

[5] 衣杨 (2008), 数据建模与优化课程课件:第 4 , pp. 47-67.

[6] 衣杨 (2008), 数据建模与优化课程课件:第 5 , pp. 66-83.

Leave a Reply

Your email address will not be published. Required fields are marked *