• 基于Java解决容量设施选址问题


    1.问题陈述

    有容量限制的设施地址问题:假设有 n 个设施和 m 个顾客,我们可以作以下操作:

    ① 开启设施 ② 分配顾客到某设施

    上述两个操作都有各自的成本,我们希望总成本最低,且分配到某设施的总需求不能超过其容量。

    2.建立模型

    为了方便问题的解决,我们首先建立模型,更具体地说,我们为设施、顾客创建一个具有相应属性的类。

    我们以一个实例来更好地了解如何构建一个类:

    在这里插入图片描述

    由上图可知,设施有容量、开启费用、是否开启、服务某个顾客的费用四个属性;顾客有需求、被哪个设施服务两个属性,为了区分每个设施和顾客,我们用 ID 区分他们,由此建立 Facility,Customer 两个类:

    在这里插入图片描述
    在这里插入图片描述

    3.读取文件及展示

    在解决问题前,我们需要得到数据,以方便测试。一个样例的数据格式和第二部分的第一张图一样,输出结果的格式如下图:

    在这里插入图片描述

    我们为样例也构造一个类,格式如下:

    在这里插入图片描述

    我们用 List 保存每个顾客、每个设施、每个实例,以及记录他们的数量:

    在这里插入图片描述

    建立好数据结构后,我们编写读取文件和初始化每个对象的代码:

    在这里插入图片描述

    再编写用于展示的代码:

    在这里插入图片描述

    在这里插入图片描述

    编写用于生成实例的代码:

    在这里插入图片描述

    4.问题思路及算法

    4.1 贪心算法

    比较简单的解决办法是贪心算法,虽然不能够得到最优解,但它的思路最直接、最简单,实现起来简单,且时间复杂度不算高,下面说下贪心算法在该问题下的运用。

    N 个用户,编号为 1-N,首先编号 1 选择服务费用最低的且容量足够的设施,编号 2 一样,只不过在 1 选择之后选择,以此类推,这并没有考虑到设施的开启费用,这是因为顾客的数量一般比设施多,所以如果设施开启的费用相对服务顾客的费用比较低的话,设施开启的费用是个次要矛盾,因为服务费用占的比例会大很多,当然,如果这个前提不成立的话,贪心算法的效果会差很多。

    根据上面所说,我们编写代码:

    在这里插入图片描述

    具体效果在最后一同展示。

    4.2 模拟退火

    模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。

    根据热力学规律并结合计算机对离散数据的处理, 我们定义: 如果当前温度为 T, 当前状态与新状态之间的能量差为 ΔE , 则发生状态转移的概率为:

    在这里插入图片描述

    伪代码如下图(来自一篇博客),还有一个比较好的例子来自另一个博客,下面代码的实现方式和这篇博客里面的应用类似:

    在这里插入图片描述

    如果得到新的状态 Y(i+1),在该问题下还不是十分清晰。换句话说,我们需要考虑如何得到邻近解,我采用的策略有两个:一是将两个顾客位置调换,即挑两个顾客出来,让一个顾客去另一个顾客的设施,另一个顾客去该顾客的设施。二是让一个顾客去另一个设施。顾客都是随机挑选的,两个策略在某个时刻时仅会执行一个。另外如果执行策略时,发现某些不合法的行为,就不会执行,直接放弃,例如某个设施容量不足。因为策略和顾客都是随机挑选的,且执行策略的次数会很大,所以放弃执行某次策略并不会影响整体效果。

    综上,我们执行模拟退火的步骤如下:

    ① 为了方便,状态初始化为贪心算法里的结果,设定初始温度,终止温度,温度下降率。

    ② 开始循环,在某个温度时(内循环),根据上述两种策略得到临近解,然后将得到的临近解和当前解进行比较,采取状态转移的步骤,由公式得到概率,决定是否向较差的情况转移。内循环结束后,将当前解与最优解比较,更新最优解。开始降温。

    ③ 当温度降至终止温度时,结束循环。得到该算法下最有解。

    代码如下:

    在这里插入图片描述

    5.运算结果

    设施开启状态和顾客去了哪个设施的结果可以在————查看。

    下面展示每个实例的运算时间和问题的结果(时间精度为毫秒):

    result(SA)Time(s)result(Greedy)Time(s)
    p189582.73894400.001
    p280102.18781260
    p393891.974101260.001
    p4107141.978121260
    p591421.96693750
    p678091.98580610.007
    p795771.971100610.001
    p8111731.931120610
    p987422.07490400.001
    p1076172.04577260.002
    p1190772.50897260.002
    p12101322.066117260
    p1384922.418120320
    p1475262.39191800.002
    p1589372.512131800
    p16107642.458171800.001
    p1783782.335120320.002
    p1871522.35191800.002
    p1990422.406131800
    p20110712.417171800
    p2186672.427120320
    p2271942.40291800.001
    p2387462.434131800
    p24114832.394171800
    p25131915.039191970.002
    p26110224.95161310.002
    p27130374.919215310.002
    p28164104.925269310.002
    p29132894.96193050.001
    p30121714.893162390.001
    p31142284.937216390.001
    p32159035.005270390.001
    p33122204.973190550.002
    p34110045.006159890.001
    p35136374.926213890
    p36150044.929267890
    p37119354.946190550
    p38109844.933159890.001
    p39129844.944213890.001
    p40149844.951267890
    p4171032.93272260
    p4266783.20199570
    p4367583.038124480
    p4471282.84875850
    p4574783.10298480
    p4661603.044126390
    p4762572.86566340
    p4866423.06990440
    p4956583.048124200
    p5092393.12100620
    p5179203.451113510.001
    p5292473.042103640
    p5393193.43124700
    p5490343.028103510
    p5579383.451119700
    p56227106.109238820.001
    p57294646.079328820.001
    p58437656.105538820
    p59328546.113391210.001
    p60230866.144238820.001
    p61300936.193328820.002
    p62418916.261538820.001
    p63317886.32391210.001
    p64224436.136238820.003
    p65292796.15328820.001
    p66442196.124538820.001
    p67324717.23396710
    p68230246.149238820.001
    p69303186.145328820.017
    p70438356.152538820
    p71320716.128391210

    由上面的运算结果可以看出,贪心算法运算的很快,但相对来说结果没有那么好,模拟退火算法运算时间上升了很多,但结果优化了很多。
    071 | 6.128 | 39121 | 0 |
    | | | | | |

    由上面的运算结果可以看出,贪心算法运算的很快,但相对来说结果没有那么好,模拟退火算法运算时间上升了很多,但结果优化了很多。

  • 相关阅读:
    小程序项目如何创建
    2022-Docker常用命令
    接收区块链的CCF会议--SecureComm 2024 截止5.10 附录用率
    户外拉杆音箱大功率升压芯片 12.6V升压18V 3A 外围简单
    通配符 SSL/TLS 证书
    Join字段类型超容易上手的好吧(Elasticsearch)
    美国ARC与延锋安全合作,推动汽车安全气囊技术新突破
    vue 手势解锁功能
    AI落地制造业:智能机器人应具备这4种能力
    Python实现接糖果小游戏
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/126033332