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

本文介绍了离散型工厂选址问题,通过遗传算法解决。文章详细阐述了问题背景、遗传算法的设计,包括遗传编码、适值计算、选择操作,并提供了程序代码示例。

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

一、问题描述

1.1 工厂选址问题

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

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

1.2 离散选址模型

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

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

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

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

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

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

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

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

二、遗传算法设计

2.1 遗传算法的基本步骤
  • step1.step1.step1. 遗传编码
  • step2.step2.step2. 初始种群的生成
  • step3.step3.step3. 适应度评估检测
  • step4.step4.step4. WHILEWHILEWHILE<未满足迭代终止条件>DODODO
      1. 选择
      1. 交叉
      1. 变异
      1. 适应度评估检测
  • step5.step5.step5. END DOEND ~DOEND DO
2.2 遗传编码

​ 采用二重结构编码对离散工厂选址模型的约束条件进行处理,这种编码方式可以避免无效染色体的产生,提高遗传算法的搜索效率。二重结构编码方法如图1所示。染色体表示的二重结构由变量码和附加码两行组成。上行s(k)s(k)s(k)为变量ys(k)y_{s(k)}ys(k)的附加码,s(k)=is(k)=is(k)=i,表示工厂备选地的序号,下行为变量ys(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)
变量码 ys(1)y_{s(1)}ys(1) ys(2)y_{s(2)}ys(2) ys(k)y_{s(k)}ys(k) ys(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=1nbj⩽∑i=1maiyi\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)的工厂。如果ys(k)y_{s(k)}ys(k)为1的工厂容量之和小于所有需求点的需求量之和,则随机产生一个不大于mmm的自然数s(k)s(k)s(k);如果ys(k)y_{s(k)}ys(k)为0,则强制该数为1,并将附加码为s(k)s(k)s(k)的工厂的容量与处理前变量码为1的工厂的容量相加。按照这种方法处理,直到变量码为1的工厂的容量之和不小于所有需求点的需求量之和为止。

​ 解码算法的步骤为:

  • step1:step1:step1: sum1=∑i=1myskask,sum2=∑j=1nbj;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;

  • step2:step2:step2:sum1&lt;sum2,sum_{1}&lt;sum_{2},sum1<sum2,则执行step3,step3,step3,否则执行step4;step4;step4

  • step3:step3:step3:随机产生一个不大于mmm的自然数为s(k),s(k),s(k),如果ys(k)=0,y_{s(k)}=0,ys(k)=0,则令sum1=sum1+as(k),ys(k)=1,sum_{1}=sum_{1}+a_{s(k)},y_{s(k)=1,}sum1=sum1+as(k),ys(k)=1,返回step2;step2;ste

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值