离散优化问题,也被称为组合优化问题,我们可以视之为在候选目标的有限集中找出最优目标
被称为搜索空间的基数。在理论上我们可以通过评价这个解的每一个f(x)来求解上式,这种组合优化的方法被称为穷举搜索或蛮力。
旅行商问题TSP
闭合的TSP是指行程的起点和终点是同一个城市;不然TSP就是开放的。一个开放的有n个城市的TSP共有(n-1)!个潜在的解。
一般我们假设有n个城市的TSP的城市记为城市1,城市2,...,城市n。对所有i∈[1,n]和j∈[1,n],城市i和城市j之间的距离已知,并且D(i,j)=D(j,i)。他被称为对称的TSP。
在开放的TSP中,有效行程是指所有n个城市正好被访问一次。在闭合的TSP中,有效行程是指行程的起点和终点是同一个城市,而其余的n-1个城市恰好被访问1次。下面是开放的4城市TSP有效行程的例子:
4城的有效开放行程:3→2→4→1 (2)
闭合的4城TSP的有效行程的例子:
4城的有效闭合行程:3→2→1→3 (3)
在TSP中我们总是想要最小化总距离,假设开放的TSP中n个城市的顺序为
则总距离为
旅行商问题的初始化
初始化算法被称为是贪婪的,因为它们都是按照能最大的改进当前性能的方式来添加的,也就是说,它们都是基于及时地最高回报建立候选解。
1.最近邻初始化
最近邻初始化是一个简单又直观的初始化候选解的方式。我们将这个策略描述如下:
1. 初始化i=1;
2. 随机的选择一个城市s(1)∈[1,n]作为起点;
3. s(i+1)←。即找出s中还没有安排的离s(i)最近的城市,把它安排在s(i+1);
4. 将i加1;
5. 如果i=n,则终止;否则,转步骤3。
在这个过程的最后得到开放行程s(1)→s(2)→...→s(n),它是对TSP解的一个合理的猜测过程.如果想要一个闭合的行程,只要把s(1)添加到开放行程的末尾就可以了,因为起点城市是我们随机选出来的,如果多次执行这个算法,一般会得到不同的候选解.
未解决TSP,如果想要聪明的初始化一个进化算法,可以使用最邻近初始化种群中的一个或几个个体,或整个种群.可以用随机最邻近初始化算法,每次迭代时,将某个城市分配到s(i+1)的概率与它到s(i)的距离成反比。最后,我们还可以通过执行“最近的俩邻居”算法在另一个层面上采用最近邻算法。
最近邻初始化的性能很大程度上依赖于起点城市。
2.最短边初始化
假设一个n城市TSP,其距离矩阵D如(5)所示,我们定义Lk为与D中第k个最小的数相关的边,即,Lk由n(n-1)/2条边按距离升序排列组成。对n城TSP的最短初始化的步骤如下:
1. 定义T为行程中边的集合,初始化T为空集。
2. 找出Lk这种满足下列约束的最短边:(a)它不在T中;(b)如果添加到T中,它不会形成少于n条边的闭合行程;(c)如果它连接城市i和城市j并将它添加到T中,T中与城市i或城市j相关的边不多于两条。
3. 如果T中有n条边则结束;否则转步骤2。(闭合的TSP)
最短边初始化将离得最近的城市的边包括在行程中,并继续此过程直到获得有效行程。最短边初始化不是随机的,每一次执行得到的行程都相同。一般用最短边初始化进化算法的一个个体。当有不止一对城市有相同的距离时会出现例外,在这种情况下,可以用随机过程来打破步骤2中的僵局,根据随机过程的结果会得到不同的行程。
3.嵌入初始化
嵌入初始化从一个子行程开始,然后每次添加一个城市到行程中,被选中的城市在加入后增加的距离应该最小。初始子行程常常是最短的单条边。针对开放的TSP可以描述如下:
1. 定义T为行程中边的集合,初始化T为距离矩阵中的最短边。
2. c←minc{D(c,k),c∉T,k∈T},即在不属于T的所有城市中,选择离T最近的。
3. {k,j}←即从T中选择边D(k,j)使子行程k→c→j的距离与k→j的距离差别最小。
4. 从T中去掉D(k,j),并将D(c,k)和D(c,j)添加到T中。
5. 如果T包含n-1条边就结束;否则转到步骤2。
4. 随机初始化
我们讨论过的唯一随机化初始化方法是最近邻初始化。不过,可以通过修改其他初始化方案,让它们包含随机的成分。另外,还可以修改最近邻初始化让它比开始的方法更加随机。增加初始化方法的随机性会使其更具吸引力,随机性是进化算法的一个基本成分。用随机初始化能得到不止一个个体。
在最近邻初始化中,依概率选择城市替换步骤3的找出离s(i)最近的城市,而选择某个城市的概率则与该城市到s(i)的距离成反比。因此,与s(i)最近的城市的选择概率最大,而TSP中的其他城市也有非0的概率被选中。
在最短边初始化中,用与边的长度成反比的概率选择一条边替换满足给定约束的最短边,因此,最短的边有最大的概率被选择中,而TSP中的其他边也有概率被选中。
在嵌入初始化中,可以在两个步骤中添加随机性。首先,在步骤2,用与T的距离成反比的概率选择城市而不是选择距T最近的城市,离得最近的城市的选择概率最大,不在T中的城市也都有非零的选择概率。其次,在步骤3中,用与子行程差成反比的概率选择一条边而不是选择使子行程的距离差最小的边,距离差最小的边的概率最大,T中的其他边也都用非零的选择概率。
旅行商问题的表示与交叉
1.路径表示
路径表示是TSP行程最自然的一种表示方法。在路径表示中,向量:
表示这n个城市的行程为。下面讨论用这种表示方法从父代如何得到子代。
a. 部分匹配交叉
部分匹配交叉(PMX)正是以经典的单点交叉为基础。两个父向量
如果在这两个向量之间执行单点交叉,我们得到子代
这些子代无效,因此c1访问城市4两次却没有访问城市6。c2相反,它访问城市6两次却没有访问城市4。用6替换c1中的一个4并用4替换c2中的一个6,就可以修补子代。
b. 顺序交叉
顺序交叉(OX)将行程的一部分从父代复制给子代。然后从第二个父代复制余下的城市到子代,同时让来自第二个父代的城市顺序保持不变。例如,父代:
从P1随机的选择子行程;假设从P1选择的子行程为[8 4 5 6],得到的子代的一部分
c1还需要加入城市1,2,3,7和9.这些城市在P2中的顺序为{2 1 7 9 3}。按照这个顺序将这些城市复制到c1中,得到
在顺序交叉中,通过交换P1和P2的角色,用上述过程生成另一个子代。在这个例子中,从P2复制子行程得到另一个子代的初始部分
按P1的顺序复制余下的城市9,2,3,4和5,得到子代
c. 循环交叉
循环交叉(CX)在两个父代生成子代时会尽可能多的保存来自第一个父代的序列信息,并用第二个父代的信息完成子代。我们用一个例子来解释循环交叉。假设有父代
我们生成一个子代。
随机选择1到n之间的一个指标,假设我们选择4,P1(4)=5,因此子代初始被初始化为c=[- - - 5 - - ]
P2(4)=1,而城市1处在P1的第6位,因此子代的增强为c=[- - - 5 - 1]
P2(6)=3,而城市3处在P1的第2位,因此子代的增强为c=[- 3 - 5 - 1]
P2(2)=3,但子代中已经包含城市5,因此从P2复制余下所需的城市代子代,得到c=[4 3 2 5 6 1]
我们常常通过交换P1和P2的角色生成另一个子代。算法1说明循环交叉如何运作。
d. 基于顺序交叉
基于顺序的交叉(OBX)是对循环交叉的一种修改。基于顺序交叉在第一个父代P1中随机选择几个位置,并找出P2中处于相应位置的城市,然后用它们在P2中的顺序在P1中对这些城市重新排序,由此得到子代。例如,假设有父代
假设我们选择位置为1,3,4.在P2中处于这些位置的城市分别为4,2,1.用来自P1的所有城市,除了4,2,1初始化子代:
接下来,复制4,2,1到子代,次序与它们在P2中的顺序相同,得到子代
交换P1和P2的角色来生成另一个子代c2,它由来自P2的所有城市除了城市2,4,5(因为P1中处于位置1,3,4),初始化子代
然后复制2,4,5代子代,次序与它们在P1中的相同,于是得到子代
e. 反序交叉
已知两个父代P1和P2,反序交叉的工作流程如下:
1. 从P1随机的选择一个位置s。假设P1(s)=r。
2. 假设r是P2的第k个位置,即P2(k)=r,设置终点e=P2(k+1)。
3. 在P1中将P1(s+1)和e之间的城市的次序反转得到子代。
例如,假设有父代
假设选择位置s=4,P1(4)=5,城市5位于P2的第二位,即P2(2)=5,所以设置e=P2(2+1)=2作为终点。将P1中城市2和城市5之间的城市的次序反转,得到子代
在步骤2中如果k=n,P2(k+1)没有定义。在这种情况下可以采用某些特别的方法继续交叉过程。例如,设置e=P2(k-1),或者可以返回步骤1随机选择一个新的s。
2.邻接表示
如果行程的向量x包含从城市i直接到城市j的路径,则x(i)=j,也就是说,x的第i个元素等于j。例如考虑向量
对向量x的理解:
x(1)=2,因此行程包含从城市1到城市2的一条边;
x(2)=4,因此行程包含从城市2到城市4的一条边;
x(3)=8,因此行程包含从城市3到城市8的一条边;
x(4)=3,因此行程包含从城市4到城市3的一条边;
x(5)=9,因此行程包含从城市5到城市9的一条边;
x(6)=7,因此行程包含从城市6到城市7的一条边;
x(7)=1,因此行程包含从城市7到城市1的一条边;
x(8)=5,因此行程包含从城市到8城市5的一条边;
x(9)=6,因此行程包含从城市9到城市6的一条边;
把它们全部放在一起,由x表示的行程为
1→2→4→3→8→5→9→6→7→1 (24)
对于n城TSP,采用邻接表示的向量x具有如下的性质:
于所有i∈[1,n],x(i)=i;
对于所有j∈[1,n],正好存在一个i∈[1,n]使得x(i)=j。
对于用x表示的有效行程而言,上述条件是必要但不是充分的,例如:
如果我们从城市1出发,重复序列1→2→1→2...就永远也不能访问其他的城市。
下面讨论用此方式表示的父代通过组合得到子代的一些方法。
a. 经典交叉
不适用于邻接表示,它与遗传算法中用到的单点交叉相同。例如两个父代:
进行单点交叉就得到子代
c1行程无效因为没有访问到城市3,c2行程也无效因为没有访问到城市2。
b. 交替边交叉
交替边交叉从经典交叉开始然后修补无效行程。例如(27)中的c1因为由两个2而没有3.可以通过将其中一个2修改为3来修补,如果把第一个2修改为3,就得到:
但它会导致循环1→3→1→1...,所以尝试将第二个2修改为3,于是得到:
它是一个有效行程。交替边交叉还可以用与两点交叉或者更多交叉点的交叉。尽管交替边交叉可以生成有效的行程,但他也会破坏好的行程,因此也不常用。
c. 启发式交叉
启发式交叉利用常识来组合候选解。它把两个父代最好的边合起来生成子代。启发式交叉的过程如下:
1. 随机选择城市r作为起点;
2. 比较父代城市中从r离开的边,为子代选择较短的边;
3. 上面选择的边的另一端的城市是选择下一个城市的起点;
4. 如果所选的城市已经在子代中,则从尚未在子代中的城市中随机选一个替换所选的城市;
5. 继续步骤2直到完成子代行程。
算法2为启发式交叉的伪代码。对TSP基于向量的表示都可以用启发式交叉。
用一个例子来说明启发式交叉,假设有一个4城TSP,其距离矩阵如下:
其中Dij表示城市i和城市j之间的距离。假设有父代
启发式交叉的过程如下:
1. 随机的选择出发的城市r∈[1,4],假设r=2;
2. P1有2→4这条边并且d(2,4)=7;P2有2→3这条边并且d(2,3)=4,因此,为子代选择2→3这条边,于是得到C={2,3};
3. 两个父代都由3→1这条边,所以子代增强为C={2,3,1};
4. P1有1→2这条边并且d(1,2)=13;P2有1→4这条边并且d(1,4)=15,因此,为子代选择1→2这条边。但城市2已经在C中,所以随机地选择一个不在C中的城市,假设选择城市4(本例中,它是唯一一个不在C中的城市),得到C={2,3,1,4}
5. 路径C完成,它的邻接表示为C=[4 3 1 2]
3.顺序表示
在顺序表示中,n个城市的行程用一个向量来表示
其中xi∈[1,n-i+1],即
假设城市的一个有序列表为
其中L(i)=i,i∈[1,n]。在顺序表示中x1表示行程的第一个城市。x2给出行程的第二个城市的集合L2=L/{x1}的指标。x3给出行程的第三个城市的集合=L/{x1,x2}的指标。一般的,用xk给出行程的第k个城市集合的指标。
假设一个6城的行程为
已知一种有序列表,L={1,2,3,4,5,6},我们构造由x表示的行程如下:
1. x1=5,且L(5)=5,所以城市5是行程的第一个城市,从L中除去5得到L2={1,2,3,4,6};
2. x2=2,且L2(2)=2,所以城市2是行程的第二个城市,从L2中除去3得到L3={1,3,4,6};
3. x3=4,且L3(4)=6,所以城市6是行程的第三个城市,从L3中除去6得到L4={1,3,4};
4. x4=1,且L4(1)=1,所以城市1是行程的第四个城市,从L4中除去1得到L5={3,4};
5. x5=2,且L5(2)=4,所以城市4是行程的第五个城市,从L5中除去4得到L6={3};
6. x6=1,且L6(1)=3,所以城市3是行程的第六个城市。
就这样得到行程5→2→6→1→4→3。
假设我们想用顺序表示通过单点交叉将两个父代组合得到一个子代,考虑父代
如果选择父代的中点为交叉点,得到子代
两个子代都表示有效行程。顺序表示的优势是经过单点交叉总是能得到有效的行程。
4.矩阵表示
在矩阵表示中,n个城市的开放行程由一个包含0和1的n x n的矩阵M表示。Mik=1当且仅当在行程中城市i排在城市k的前面。
含有1最多的行是第一个城市,含有1第二多的是第二个城市,以此类推,含有1第k多的是行程中的第k个城市。
表示有效行程的每一个n x n矩阵M都具有一下性质:
M正好有一行有n-1个1,正好有一行有n-2个1,以此类推;
由上面的特性得到M中1的个数
在行程中没有城市会在它自己前面,所以对所有的i∈[1,n],M=0;
如果城市i在城市j的前面,而城市j在城市k的前面,则城市i在城市k的前面,即
下面讨论由父代矩阵组合得到子代的几种方式:可以取两个矩阵的交集,或两个矩阵的并集。
a. 交集交叉
用一个例子来说明交集交叉,假设(38)式表示父代M1,而第二个父代为
M2表示行程4→1→2→5→3。由这两个矩阵元素对元素的逻辑AND操作得到M_{1}和M_{2}的交集。它给出子代的一部分定义
它还不能表示一个有效行程,但表示城市1在城市2和城市5的前面,城市2在城市5的前面城市4在城市5的前面。在两个父代中都由这样的顺序,实际上也是两个父代唯一的共同点。这是我们可以用伪随机的方式在M_{c}中添加1直到它成为有效行程(满足前面所提到的性质)。例如,
其中粗体的1是添加的。现在的Mc满足有效行程,它表示的行程为1→2→5→2→3。
b. 并集交叉
用一个例子说明并集交叉。假设(38)和(41)式分别表示父代M1和M2。由着两个矩阵元素对元素的逻辑OR操作得到M1和M2的并集。它给出子代的一部分定义
下面选择一个随机“切点”将分成4个象限(大小不一定相同)。假设随机生成的切点在第二行和第二列。Mc的最上象限和右下象限不变,将左下象限和右上象限替换为未定义的项:
为消除矛盾对Mc做必要的改变。例如M34=1和M43=1,这两个元素中需要有一个变成0,类似的,M35=1和M53=1,这两个元素中有一个要变成0.于是得到改正后但仍然是部分定义的子代
最后我们以伪随机的方式在Mc的非对角块添加1直到它成为有效行程。例如,选择性地把1添加到Mc中从而得到
它表示行程为1→2→4→5→3。
旅行商问题的变异
1.反转
反转是让随机选出来的两个指标之间的行程的顺序颠倒过来。例如,x可能变异为xm:
在这里我们随机选出变异段的起点和终点。反转也被称为2-opt变异。在所有可能的反转中最低的解表示的行程中一定没有交叉边。
2.嵌入
嵌入将处于位置i的城市移动到位置k,这里的i和k是随机选出来的。假设行程x如(48)式所示,假设随机选择i=4,k=2,将处于位置4的城市7移到位置2得到变异后的行程
嵌入也被称为or-opt变异。
3.移位
移位是嵌入的一般化。移位将行程中从i位开始的q个城市的序列移动到第k位,这里i,q,k都是随机选出来的,假设行程x如(48)式所示,假设随机选择i=4,q=2,k=2,则将从位置4开始的城市序列(7和6)移动到位置2,得到变异后的行程
移位也被称为偏移。将选出来的城市的顺序颠倒之后再移动到新位置,这样可以将移位与反转相结合。
4.互换
互换是将第i位和第k位的城市交换,这里i和k是随机选出来的,假设行程x如(48)式所示,假设随机选择i=5,k=1,我们将第1位和第5位互换得到的变异行程如下
互换也被称为2-exchange变异。这个方法可以推广到交换城市的序列而不只是单个的城市。通过颠倒一个或多个交换序列的顺序,可以将这种推广与反转结合起来。
旅行商问题的进化算法
我们来介绍求解TSP的一个基本的进化算法3,它有很多实施方案。
有几种初始化方法,如最近邻初始化,嵌入初始化,最短边初始化,随机初始化等;
有几个交叉方案,每个交叉方案有不同的交叉方法。从一代到下一代依概率在这些不同的方法之间切换,此外,可以将最好的交叉方法记录下来,并根据它们后代的适应度来调整使用交叉方法的频率。
有几个变异方案,与交叉一样,可以使用不止一个变异方法。从一代到下一代依概率在这些不同的方法之间切换,此外,可以将最好的变异方法记录下来,并根据它们后代的适应度来调整使用变异方法的频率。
在使用算法3时需要详细说明“选择父代”这句话,可以使用轮盘赌、竞标赛等方法。
对于TSP这类问题,我们很容易得到它们的具体的信息,将进化算法与利用距离信息的算法像结合,常常能得到更好的结果。在算法3中每得到一个子代Ck之后,可以从Ck随机的选择一个子行程并利用初始化方法去重新安排它,或者,子行程足够短,可以利用蛮力重新安排。这类方法被称为混合进化算法,因为它们将标准化算法的算子与专门为TSP设计的非进化算法相结合。
算法3中替换重复的个体是有必要的,组合优化中,由于搜索空间是离散的而不是连续的,最好的几个解往往会支配整个种群,种群的收敛会令几个不同的个体组成整个种群。有几种替换重复个体的方法:可以用随机生成的个体替换它们,可以用初始化方法替换它们,或者使它们变异。
图着色问题
图是部分连接的节点的集合。每个节点有唯一的指标,还有一个权重,权重一般不唯一。
图着色问题有许多相关但不同的版本,经典的图着色问题有以下两种定义:
为相连的节点分配不同的颜色,在这一约束下确定最少需要的颜色种数,记为n,连通图中的每个节点用这n中颜色中的一种着色;
已知n中颜色,为连通图中每个节点着色,并要满足相连节点颜色不同的约束。
上面列出的第一个问题被称为n色问题。对于持续减小的n值,重复第二个问题就能得到第一个问题的解。
加权图着色问题是上面第二个定义的一般化。在相连节点着不同颜色的约束下,为每个节点分配n中颜色中的一种,并最大化已着色节点的权重和。将每个节点的权重设为1然后求解图着色问题就可以解决上面第二个图着色问题。
在加权图着色问题中,候选解的适应度是已经着色的节点的权重总和,要采用令适应度最大的方式为节点着色。加权图着色问题在调度、计算机网络、故障检测与诊断、模式匹配、通信理论、博弈以及其他许多领域中都由很多的应用。当面对某个实际优化问题时,如果将它转化为等价的图着色问题,就可以利用求解图着色问题的很多工具来解决这个实际问题。
这些问题有时候也被称为地图着色,因为我们可以用一个连通图来1表示地图。用n种颜色为地图着色并使相邻区域的颜色不同的这个问题与图着色问题等价,但是反过来并不成立;连通图未必能转化为一张平面图。
对于上图,考虑单色图着色问题,节点2和结点权重最重,但是因为它们相连所以不能染上相同的颜色。常用贪婪算法解决该问题,如算法4所示,贪婪算法其实很简单,它将节点根据权重做降序排列,然后依次为节点分配颜色。
对于上图,贪婪算法将节点排序为{2,4,6,5,1,3},但节点2和结点4可以交换,因为他们的权重相同。对于单色问题,我们为节点2和节点6着色,得到的适应度为15。对于双色问题(比如红和绿),我们为节点2着红色,节点4着绿色,节点6着红色,节点3着绿色,得到适应度为27。
进化算法与图着色问题
一种方式是将进化算法种群中的个体定义为节点的一个列表,然后用贪婪算法按节点的顺序分配颜色。没一个个体都有一个适应度值。可以用依赖于适应度的选择,然后用交叉方式以及变异方法生成子代。这个方法将图着色问题转化为TSP的形式,然后就能利用前面介绍的关于TSP的所有结果。
与TSP一样,要得到好的结果,每个图着色进化算法都需要与非进化的启发式算法结合。
————————————————
本文转自CSDN平台博主:王不留行
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_43516656/article/details/123847016
|