关于矩形排样问题(二)

原创 2015年07月09日 22:09:31

上一篇博客 关于矩形排样问题(一) 引出了矩形排样问题,但是未给出解决方案,下面给出具体的解决方法以及相应的编码思路。
注:本问题的背景是第八届华中地区数学建模本科组的A题,本人侥幸拿了一等奖,呵呵,遗传算法只是解决问题的一个子方案,还有很多地方待优化。
在给出解决方案之前,先对遗传算法进行简单的介绍。网上关于遗传算法的例子很多,感兴趣的可以自己去钻研,对于网上的一些解释,不要觉得晦涩难懂,这是通向理解的必经之路,做科研向来都是这样[呵呵,话说得有点多]

遗传算法

提到遗传算法(Genetic Algorithm,简称GA),自然会想到1859年达尔文提出的“物竞天择,适者生存”理论,遗传算法的思想就是基于这个理论提出的。遗传算法就是一种基于自然群体遗传进化机制的自适应全局优化概率搜索算法。模拟自然界的生物进化过程,采用人工的方式目标空间进行随机化搜索。其搜索机制大概如下:模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。遗传算法的进化规则就是“适者生存”,较好的解保留,较差的解淘汰。基本遗传算法(Simple Genetic Algorithms,简称SGA),是一种统一的,最基本的遗传算法,只使用选择、交叉、变异这三种基本遗传算子,其遗传进化操作过程简单,容易理解,是其他一些遗传算法的雏形和基础,它不仅给各种遗传算法提供了一个基本框架,同时也具有一定的应用价值。
生物进化与遗传算法的对应关系如下:
这里写图片描述

遗传算法的基本操作

  • 选择
    根据各个个体的适应值,按照一定的规则或方法,从第t代群体P(t)中选择出一些优良的个体遗传到下一代群体P(t+1)中。
  • 交叉
    将群体P(t)内的各个个体随机搭配成对,对每一个个体,以某个概率Pc (称为交叉概率,crossvoer rate)交换它们之间的部分染色体。
  • 变异
    对群体P(t)中的每一个个体,以某一概率Pm(称为变异概率,mutation rate)改变某一个或一些基因座上基因值为其它的等位基因。
    因此基于以上思路,可以知道遗传算法需要解决以下问题:
    如何进行编码,如何产生初始种群,如何定义适应函数,如何进行遗传操作(选择,交叉,变异),如何产生下一代种群,如何定义停止准则等。下面详细介绍遗传算法的各个操作

  1. 选择
    对于选择操作,把当前种群的染色体按与适应值成正比例的概率复制到新的种群中,主要思想是:适应值高的染色体有较大的选择机会。选择方法有“轮盘赌”选择(Roulette wheel selection),其主要实现的思路如下:将种群中所有染色体编号,并根据各自适应值计算按比例分配的概率,依次计算染色体累加概率,产生(0,1)之间随机数,若其最多能大于序列中第m个值,则第m个染色体被随机选择。
    这里写图片描述
    这里写图片描述
    这里写图片描述

轮盘上的片分配给群体的染色体,使得每一个片的大小与对于染色体的适应值成比例;从群体中选择一个染色体可视为旋转一个轮盘,当轮盘停止时,指针所指的片对于的染色体就时要选的染色体。模拟“轮盘赌”算法如下:

(1)r=random(0, 1),s=0i=0;
(2)如果s≥r,则转(4);
(3)s=s+p(xi),i=i+1, 转(2)
(4)xi即为被选中的染色体,输出I
(5)结束

其他的选择方法如下:
随机遍历抽样(Stochastic universal sampling)、局部选择(Local selection)、截断选择(Truncation selection)、竞标赛选择(Tournament selection)等。特点如下:
选择操作得到的新的群体称为交配池,交配池是当前代和下一代之间的中间群体,其规模为初始群体规模。选择操作的作用效果是提高了群体的平均适应值(低适应值个体趋于淘汰,高适应值个体趋于选择),但这也损失了群体的多样性。选择操作没有产生新的个体,群体中最好个体的适应值不会改变。
2. 交叉
对于交叉操作,发生在两个染色体之间,由两个被称之为双亲的父代染色体,经杂交以后,产生两个具有双亲的部分基因的新的染色体,从而检测搜索空间中新的点。需要注意,选择和交叉的区别如是,选择(复制)操作每次作用在一个染色体上,而交叉操作每次作用在从交配池中随机选取的两个个体上(交叉概率Pc)。交叉产生两个子染色体,他们与其父代不同,且彼此不同, 每个子染色体都带有双亲染色体的遗传基因。对于交叉的方式,需要提的是单点交叉,单点交叉是在双亲的父代染色体中随机产生一个交叉点位置,在交叉点位置分离双亲染色体,互换交叉点位置右边的基因码产生两个子代染色体,交叉概率Pc 一般范围为(60%, 90%),平均约80%,交叉操作示意图如下:
这里写图片描述单点交叉可以产生与父代染色体完全不同的子代染色体,不会改变父代染色体中相同的基因。但是,当双亲染色体相同时,交叉操作是不起作用的。例如:假如交叉概率Pc =50%,则交配池中50%的染色体(一半染色体)将进行交叉操作,余下的50%的染色体进行选择(复制)操作。需要说的是,遗传算法利用选择和交叉操作可以产生具有更高平均适应值和更好染色体的群体。
3. 变异
比起选择和交叉操作,变异操作是遗传算法中的次要操作,但它在恢复群体中失去的多样性方面具有潜在的作用。需要指出的是,在GA执行的开始阶段,染色体中一个特定位上的值1可能与好的性能紧密联系,即搜索空间中某些初始染色体在那个位上的值1可能一致产生高的适应值。因为越高的适应值与染色体中那个位上的值1相联系,选择操作就越会使群体的遗传多样性损失。等到达一定程度时,值0会从整个群体中那个位上消失,然而全局最优解可能在染色体中那个位上为0。如果搜索范围缩小到实际包含全局最优解的那部分搜索空间,在那个位上的值0就可能正好是到达全局最优解所需要的。
4. 适应函数
遗传算法在搜索中不依靠外部信息,仅以适应函数为依据,利用群体中每个染色体(个体)的适应值来进行搜索。以染色体适应值的大小来确定该染色体被遗传到下一代群体中的概率。染色体适应值越大,该染色体被遗传到下一代的概率也越大;反之,染色体的适应值越小,该染色体被遗传到下一代的概率也越小。因此适应函数的选取至关重要,直接影响到GA的收敛速度以及能否找到最优解。在群体中的每个染色体都需要计算适应值,适应函数一般由目标函数变换而成。常见的适应函数的形式有多种,一种是直接将目标函数转化为适应函数:若目标函数为最大化问题:Fitness(f(x)) = f(x);若目标函数为最小化问题: Fitness(f(x)) = -f(x),该种方式缺点如下:可能不满足轮盘赌选择中概率非负的要求;某些代求解的函数值分布上相差很大,由此得到的评价适应值可能不利于体现群体的评价性能,影响算法的性能。另一种是界限构造法,若目标函数为最大化问题:
这里写图片描述若目标函数为最小化问题:这里写图片描述
5. 停止准则
停止准则的选择有多种方式,主要是下面三种方式:
种群中个体的最大适应值超过预设定值;
种群中个体的平均适应值超过预设定值;
种群中个体的进化代数超过预设定值;
经过上面的详细介绍,可以归纳出遗传算法的基本步骤如下:

(1) 随机产生初始种群;
(2) 计算种群体中每个个体的适应度值,判断是否满足停止条件,若不满足,则转第(3)步,否则转第(6)步;
(3) 按由个体适应值所决定的某个规则选择进入下一代的个体;
(4) 按交叉概率Pc进行交叉操作,生产新的个体;
(5) 按变异概率Pm进行变异操作,生产新的个体;
(6) 输出种群中适应度值最优的染色体作为问题的满意解或最优解。

流程图如下:
这里写图片描述

整个算法的伪代码如下:

Procedure Genetic Algorithm
   begin
t = 0 ;
初始化 P(t) ;
计算 P(t) 的适应值 ;
while (不满足停止准则) do
    begin
         t = t+1 ;
         从P(t-1)中选择 P(t) ;    % selection
         重组 P(t) ;                    % crossover and mutation 
          计算 P(t) 的适应值;
    end 
end

遗传算法作为经典的优化算法,研究得已经很成熟了,在网上可以找到该算法的针对各种编程语言的工具箱,呵呵。

版权声明:本文为博主原创文章,未经博主允许不得转载。

矩形排样问题 遗传算法解决方案

最近在实习中,遇到了一个实际问题。客户要将若干大小不一的小矩形,排到大矩形上,而且还要求可以设置小矩形之间的间距,和大矩形的margin值,便于裁切。 排样问题是一个经典的NP问题,有很多解决方案。神...
  • qdbszsj
  • qdbszsj
  • 2017年04月05日 14:10
  • 932

关于矩形排样问题(三)

上一篇博客 关于矩形排样问题(二) 给出了矩形排样问题的背景,并对遗传算法做出了详细的介绍。但是没有给出具体的解决方法,这里针对矩形排样问题,给出基于遗传算法的解法。利用率的定义谈到矩形排样问题,必然...

HDU-1505 最大矩形问题(二)

这是这一系列的第二题,其实讲白了还是用第一题的方法解: 就是刚开始把问题想复杂了,我发现大部分ACM题目都不能太复杂的去想,思路要简单清晰的好: HDU-1505: F - City...
  • Kerwun
  • Kerwun
  • 2016年08月21日 13:55
  • 402

基于遗传算法的MFC矩形排样UI

  • 2015年05月04日 09:56
  • 11.89MB
  • 下载

用数学方法解决工程问题系列(二) 两个矩形(多边形)的碰撞检测

关于碰撞检测,喜欢深入探究的同学可以去书店买书看,网上当然也有很多资源可以参考,这里只贴出代码,供C#开发的同学参照。以下代码中,AABBvsAABB()是给不倾斜的矩形判断碰撞时调用的,OBBvsO...

矩形件排样优化的双向双原算法

  • 2012年11月15日 16:33
  • 278KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于矩形排样问题(二)
举报原因:
原因补充:

(最多只允许输入30个字)