使用python编写离散型工厂选址问题的遗传算法(课程作业)

离散型工厂选址问题的遗传算法

一、问题描述

1.1 工厂选址问题

​ 工厂选址(facility location),就是确定在何处建厂、仓储中心或建立服务设施。它不仅关系到设施建设的投资和建设速度,而且在很大程度上决定了所提供的产品和服务的成本,从而影响企业的生产管理活动和经济效益。除了少数的原材料采掘企业,如矿产企业、原木采伐企业必须将选址定在相应资源丰富的所在地,绝大多数企业都将面临着不同的选址问题的决策。随着全球制造的出现,现代企业的选址问题涉及的范围已超出某一地区、某一国家了,而是在全球范围内考虑选址的问题。

​ 离散选址是指在有限的侯选位置里面,选取最为合适的一个或一组位置为最优方案,对应的模型叫做离散选址模型。它与连续选址模型的区别在于:它所拥有的侯选方案只有有限个元素,在进行选址时只需对有限个位置进行分析。离散选址问题一般都可以用混合整数规划模型来表示,模型中的目标函数可以采用以选址问题的最短距离为目标,如p-Median问题和p-Center问题及其衍生问题。也可以采用选址问题的最小费用为目标等。

1.2 离散选址模型

​ 给定某一地区所有需求点的地址集合,要求从备选地址中选出一定数目的地址建立工厂,从而建立一系列的配送区域,实现各个需求点的配送,使得在选出点建立的工厂与各需求点形成的配送系统总配送费用最少。为了便于建立模型,需作一定的假设,假设系统满足如下一些条件:

  • 仅在一定的被选对象内考虑新的工厂建厂;

  • 运输费用与运输量成正比;

  • 需求点的需求按区域总计;

  • 工厂生产能力可以满足需求;

  • 各需求点的需求量一定且为己知;

  • 总费用只考虑固定的工厂建址费用和运输费用。

    该选址问题的混合整数规划模型为:
    在这里插入图片描述
    式中, m m m为工厂备选地点的个数; n n n为需求点的个数; p p p为可设置工厂的最大个数; x i j x_{ij} xij;为从工厂 i i i到需求点 j j j的运输量; y i y_i yi为整数变量,当 y i y_i yi=1时表示 i i i地被选中,当 y i y_i yi=0时表示 i i i地未被选中; b j b_j bj为第 j j j地的需求量; a i a_i ai为被选工厂 i i i的建设容量(供应能力); c i j c_{ij} cij为从 i i i地到 j j j地的包括装卸运输费在内的单位运输费用; d i d_i di为被选工厂 i i i的固定费用(包括基本投资费和固定经营费)。
    目标函数(1)中,等式右边第一项是从工厂到需求点的运输成本;第二项是工厂设置的固定成本。式(2)表示从各工厂向某需求点供给的物资总和应满足该需求点的需求量;式(3)表示如果i地点被选中建厂,则从它发出的货物总量不超过它的建设容量(供应能力);式(4)表示选上的工厂个数不得超过原定的最大限额。

二、遗传算法设计

2.1 遗传算法的基本步骤
  • s t e p 1. step1. step1. 遗传编码
  • s t e p 2. step2. step2. 初始种群的生成
  • s t e p 3. step3. step3. 适应度评估检测
  • s t e p 4. step4. step4. W H I L E WHILE WHILE<未满足迭代终止条件> D O DO DO
      1. 选择
      1. 交叉
      1. 变异
      1. 适应度评估检测
  • s t e p 5. step5. step5. E N D   D O END ~DO END DO
2.2 遗传编码

​ 采用二重结构编码对离散工厂选址模型的约束条件进行处理,这种编码方式可以避免无效染色体的产生,提高遗传算法的搜索效率。二重结构编码方法如图1所示。染色体表示的二重结构由变量码和附加码两行组成。上行 s ( k ) s(k) s(k)为变量 y s ( k ) y_{s(k)} ys(k)的附加码, s ( k ) = i s(k)=i s(k)=i,表示工厂备选地的序号,下行为变量 y s ( k ) y_{s(k)} ys(k)对应于附加码 s ( k ) s(k) s(k)的值表示该工厂是否被选中。

附加码 s ( 1 ) s(1) s(1) s ( 2 ) s(2) s(2) s ( k ) s(k) s(k) s ( m ) s(m) s(m)
变量码 y s ( 1 ) y_{s(1)} ys(1) y s ( 2 ) y_{s(2)} ys(2) y s ( k ) y_{s(k)} ys(k) y s ( m ) y_{s(m)} ys(m)
图1 工厂选址的二重结构编码

​ 个体编码时,首先按洗牌方式随机产生附加码 { s ( k ) , k = l , ⋯ &ThinSpace; , m } \{s(k),k=l,\cdots,m\} { s(k),k=l,,m},列于上行;然后随机产生下行的变量码值{0或1},这样构成一个个体的二重结构编码。按照这种方式随机产生初始群体。
​ 由式(2)、式(3)很容易得出约束条件 ∑ j = 1 n b j ⩽ ∑ i = 1 m a i y i \sum\limits_{j=1}^{n}b_{j}\leqslant\sum\limits_{i=1}^{m}a_{i}y_{i} j=1nbji=1maiyi。因此,个体解码时(图1),按照从左到右的顺序,依次考虑变量的附加码,即按照顺序考虑附加码为 s ( k ) s(k) s(k)的工厂。如果 y s ( k ) y_{s(k)} ys(k)为1的工厂容量之和小于所有需求点的需求量之和,则随机产生一个不大于 m m m的自然数 s ( k ) s(k) s(k);如果 y s ( k ) y_{s(k)} ys(k)为0,则强制该数为1,并将附加码为 s ( k ) s(k) s(k)的工厂的容量与处理前变量码为1的工厂的容量相加。按照这种方法处理,直到变量码为1的工厂的容量之和不小于所有需求点的需求量之和为止。

​ 解码算法的步骤为:

  • s t e p 1 : step1: step1: s u m 1 = ∑ i = 1 m y s k a s k , s u m 2 = ∑ j = 1 n b j ; sum_{1}=\sum\limits_{i=1}^{m}y_{s_{k}}a_{s_{k}},sum_{2}=\sum\limits_{j=1}^{n}b_{j}; sum1=i=1myskask,sum2=j=1nbj;

  • s t e p 2 : step2: step2: s u m 1 &lt; s u m 2 , sum_{1}&lt;sum_{2}, sum1<sum

  • 32
    点赞
  • 260
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
遗传算法选址问题是一种使用遗传算法来求解的问题。在Python,可以使用geatpy库来进行遗传算法的实现。首先,我们需要自定义问题类来描述选址问题的特征和限制条件。然后,编写执行脚本调用geatpy进化算法模板对问题进行求解。 在geatpy库,可以使用交叉操作来实现个体的交换和组合。交叉操作是遗传算法的一个重要步骤,通过将两个父代个体的染色体进行配对交换,产生新的子代个体。 具体的步骤如下: 1. 首先,定义选址问题的目标函数和约束条件。目标函数可以是优化问题需要最小化或最大化的指标,而约束条件则是限制解的可行性的条件。 2. 接下来,根据选址问题的特征和限制条件,创建一个自定义的问题类,继承自geatpy库的Problem基类。 3. 在问题类,需要定义目标函数和约束条件的计算方法,以及决策变量的取值范围等信息。 4. 然后,编写执行脚本,调用geatpy进化算法模板对问题进行求解。在执行脚本,需要创建问题实例,并设置算法参数,例如种群大小、迭代次数等。 5. 最后,运行执行脚本,观察算法的收敛情况和最优解的结果。根据实际情况,可以调整算法参数或修改问题类以改进算法的性能。 总结起来,遗传算法选址问题的求解步骤包括目标函数和约束条件的定义、问题类的创建和算法模板的调用。通过这些步骤,可以使用geatpy库来实现遗传算法解决选址问题的求解过程。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值