今天整理了一下以前写过的一个遗传算法求解车辆路径问题的程序(C#写的),发上来和大家分享一下,有误的地方还请各位指点。

1、车辆路径问题:

    车辆路径问题可以描述为:在一个存在供求关系的系统中,有若干台车辆、若干个配送中心和客户,要求合理安排车辆的行车路线和出行时间,从而在给定的约束条件下,把客户需求的货物从配送中心送到客户,把客户供应的货物从客户取到配送中心,并使目标函数取得优化。本文以最简单的无时限单向配送车辆路径问题为例。

1.1、问题描述:

    无时限单向配送车辆路径问题,是指在制定配送路线时不考虑客户对货物送到(或取走)时间要求的纯送货(或纯取货)车辆调度问题。无时限单向配送车辆路径问题可以描述为:从某配送中心用多台配送车辆向多个客户送货,每个客户的位置和需求量一定,每台配送车辆的载重量一定,其一次配送的最大行驶距离一定,要求合理安排车辆配送路线,使目标函数得到优化,并满足以下条件:

①每条配送路径上各客户的需求量之和不超过配送车辆的载重量;

②每条配送路径的长度不超过配送车辆一次配送的最大行驶距离:

③每个客户的需求必须满足,且只能由一台配送车辆送货。

1.2、问题模型:

     设配送中心有Κ台配送车辆,每台车辆的载重量为Qk,其一次配送的最大行驶距离为Dk,需要向L个客户送货,每个客户的货物需求量为qi,客户i到j的运距为dij,配送中心到各客户的距离为d0j,再设 为第k台车辆配送的客户数(nk=O表示未使用第k台车辆),用集合Rk表示第k条路径,其中的元素Rki表示客户Rki在路径k中的顺序为i(不包括配送中心),令rk0=0表示配送中心,若以配送总里程最短为目标函数,则可建立如下无时限单向配送车辆路径问题的数学模型:

多车辆路径规划问题python_人工智能

    上述模型中,式(1.1)为目标函数,即要求配送总里程(即各条配送路径的长度之和)最短;式(1.2)保证每条路径上各客户的货物需求量之和不超过配送车辆的载重量;式(1.3)保证每条配送路径的长度不超过配送车辆一次配送的最大行驶距离;式(1.4)表明每条路径上的客户数不超过总客户数;式(1.5)表明每个客户都得到配送服务;式(1.6)表示每条路径的客户的组成;式(1.7)限制每个客户仅能有一台配送车辆送货;式(1.8)表示当第k辆车服务的客户数≥1时,说明该台车参加了配送,则取sign(nk)=1,当第k辆车服务的客户数< 1时,,表示未使用该台车辆,则取sign(nk)=0。

2、遗传算法:    遗传算法(Genetic Algorithms )是基于生物进化理论的原理发展起来的一种广为应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之间的信息交换,搜索不依赖于梯度信息。它是在70年代初期由美国密西根( Michigan )大学的霍兰( Holland )教授发展起来的。1975年霍兰教授发表了第一本比较系统论述遗传算法的专著《自然系统与人工系统中的适应性》(《 Adaptationin Natural and Artificial Systems 》)。遗传算法最初被研究的出发点不是为专门解决最优化问题而设计的,它与进化策略、进化规划共同构成了进化算法的主要框架,都是为当时人工智能的发展服务的。迄今为止,遗传算法是进化算法中最广为人知的算法。

2.1、遗传算法的实施步骤:
    遗传火算法的实施步骤如下(以目标函数求最小为例)。
    第一步:初始化 t←0进化代数计数器;T是最大进化代数;随机生成M个个体作为初始群体P(t);
    第二步:个体评价 计算P(t)中各个个体的适应度;
    第三步:选择运算 将选择算子作用于群体;
    第四步:交叉运算 将交叉算子作用于群体;
    第五步:变异运算 将变异算子作用于群体,并通过以上运算得到下一代群体P(t + 1);
    第六步:终止条件判断  t≦T:t← t+1 转到步骤2;t>T:终止 输出解。

2.2、遗传算法应用步骤:    1)确定决策变量及各种约束条件,即个体的表现型X和问题的解空间;
    2)建立优化模型 (目标函数最大OR 最小) 数学描述形式 量化方法;
    3)染色体编码方法;
    4)解码方法;
    5)个体适应度的量化评价方法 F(x)
    6)设计遗传算子;
    7)确定有关运行参数。

3、遗传算法求解车辆路径问题:

    用遗传算法求解配送车辆路径问题时,确定解的表示和解的评价方法是一项非常关键的基础工作,因为它将直接决定算法实现的难易程度和算法性能的优劣。

3.1、解的表示:    客户直接排列的表示方法,这种表示方法是直接产生L个1~L间的互不重复的自然数的排列,该客户排列就构成一个解,并对应一种配送路径方案。按照无时限单向配送车辆优化调度问题的约束条件,可依次将解的元素(客户)划入各台车辆的配送路径中。例如,对于一个用3台车辆向9个客户送货的配送车辆优化调度问题,设某解中的客户排列为412876935,可用如下方法得到其对应的配送路径方案:首先将客户4(解中的第1个客户)作为第1台配送车辆月艮务的第1个客户,然后判断能否满足问题的约束条件,即客户4的需求量是否超过第1台车辆的最大载重量,且路径0-4-0的总长度是否超过第1台车辆一次配送的最大行驶距离,设能够满足,这时可将客户1(解中的第2个客户)作为第1台配送车辆服务的第2个客户,然后判断能否满足问题的约束条件,即客户4和1的需求量之和是否超过第1台配送车辆的最大载重量,且路径0-4-1-0的总长度是否超过第1台车辆一次配送的最大行驶距离,设仍能满足,这时可将客户2(解中的第3个客户)作为第1台配送车辆服务的第3个客户,然后判断能否满足问题的约束条件,设仍能满足,这时可将客户8作为第1台配送车辆服务的第4个客户,设此时不能满足问题的约束条件,这说明客户8不能由第1台配送车辆服务,由此可得第1台车辆的配送路径为0-4-1-2-0;然后,将客户8作为第2台配送车辆服务的第1个客户,若能满足问题的约束条件,则可将客户7作为第2台配送车辆服务的第2个客户,若仍能满足问题的约束条件,则可将客户6作为第2台配送车辆服务的第3个客户,若仍能满足问题的约束条件,则可将客户9作为第2台配送车辆服务的第4个客户,若此时不能满足问题的约束条件,则说明客户9不能由第2台配送车辆服务,由此可得第2台车辆的配送路径为0-8-7-6-0:仍按上述方法可将解中的其他客户也依次加入到其他车辆的配送路径中。采用这种表示方法,也可以得到配送路径数小于车辆总台数的配送路径方案。若某个解中的排在最后的若干个客户不能纳入到车辆的配送路径中,则说明该解为一个不可行解。与前述客户与虚拟配送中心共同排列的表示方法相比,这种解的表示方法占用的计算机存储量较少,表示也较为直观,也容易产生可行解。

3.2、解的评价:
    用客户直接排列表示方法产生的解所确定的配送路径方案,能够满足每条配送路径上各客户需求量之和不超过配送车辆的最大载重量及每条配送路径的长度不超过车辆一次配送的最大行驶距离的约束条件,但不能保证所有的客户全部都能得到配送服务。对于某个解,若全部客户均能纳入到车辆的配送路径中,则取该配送路径方案的不可行路径数M=0,表示该解为一个可行解;若排在最后的若干个客户不能纳入到车辆的配送路径中,则取该配送路径方案的不可行路径条数M=1,表示该解为一个不可行解,该配送路径方案的目标函数值为Z,并设对每条不可行路径的惩罚权重为Pw,(该权重可根据目标函数的取值范围取一个相对较大的正数),则该解的评价值E可用公式(3.1)计算(E值越小,表示解的质量越高)。这种解的评价方法,体现了用罚函数法处理约束条件的思想。

多车辆路径规划问题python_遗传算法_02

 3.3、算法策略的确定:
   (1)编码方法:采用客户直接排列的编码方法。
   (2)适应度函数:采用公式(3.2)作为适应度评估函数。即首先对某个个体进行解码操作,得到该个体对应的配送路径方案的不可行路径数M和目标函数值Z,将M和Z代入公式即可计算出该个体的适应度f。

多车辆路径规划问题python_多车辆路径规划问题python_03

   (3)选择策略:采用最佳个体保存与赌轮选择相结合的选择策略。其具体操作方法为:将每代群体中的N个个体按适应度由大到小排列,排在第一位的个体性能最优,按照最佳个体保存选择策略,将它复制一个直接进入下一代,并排在第一位。下一代群体的另N-1个个体需要根据前代群体的N个个体的适应度,采用赌轮选择法产生。
   (4)交叉算子:采用类OX交叉方法。在实际运算中,交叉操作是以概率 ,发生的。
   (5)变异算子:采用多次对换变异技术。在实际运算中,变异操作是以概率 ,发生的,一旦变异操作发生,则用随机方法产生交换次数J,对所需变异操作的个体的基因进行J次对换(对换基因的位置也是随机产生的)。
   (6)终止准则:采用进化指定代数的终止准则。

3.4、算法的结构:

{   输入无时限单向配送车辆路径问题的已知条件:
输入运行参数,如群体规模N,终止进化代数T,交叉概率Pc,变异概率Pm,
执行变异操作时的基因换位次数J,对不可行路径的惩罚权重Pw等;
随机产生初始化群体P(0),当前进化代数t=0;
计算P(0)中每个个体的适应度;
while(t<指定进化终止代数T)do
{   将本代中适应度最高的个体复制一个,直接插入到新群体P(t+1)中;
根据本代个体的适应度及赌轮选择策略,计算群体内每个个体的选择概率Pi;
for(k=0;k<N;k=k+2)
{   根据选择概率Pi从P(t)中选择两个父体;
r=random[0,1];
if(r≤交叉概率Pc)对选择的两个个体用类OX法执行交叉操作,并将
生成的两后代插入到新群体P(t+1)中;
else
{  r=random[0,1];
if(r≤变异概率Pm)对父代个体1执行变异操作,并将变异后的个
体插入到新群体P(t+1)中;
else将父代个体1复制一个,直接插入到新群体P(t+1)中;
r=random[0, 1];
if(r≤变异概率Pm)对父代个体2执行变异操作,并将变异后的个
体插入到新群体P(t+1)中;
else将父代个体2复制一个,直接插入到新群体P(t+1)中;
}
}
计算P(t+1)中每个个体的适应度;
t=t+1;
}
输出计算结果,即最终解所对应的配送路径方案和目标函数值;
}

3.5、运行截图:

多车辆路径规划问题python_人工智能_04