资讯详情

基于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.运算结果

可以查看设施的开启状态和客户去哪个设施的结果。

以下是每个例子的计算时间和结果(时间精度为毫秒):

17180
result(SA) Time(s) result(Greedy) Time(s)
p1 8958 2.738 9440 0.001
p2 8010 2.187 8126 0
p3 9389 1.974 10126 0.001
p4 10714 1.978 12126 0
p5 9142 1.966 9375 0
p6 7809 1.985 8061 0.007
p7 9577 1.971 10061 0.001
p8 11173 1.931 12061 0
p9 8742 2.074 9040 0.001
p10 7617 2.045 7726 0.002
p11 9077 2.508 9726 0.002
p12 10132 2.066 11726 0
p13 8492 2.418 12032 0
p14 7526 2.391 9180 0.002
p15 8937 2.512 13180 0
p16 10764 2.458 17180 0.001
p17 8378 2.335 12032 0.002
p18 7152 2.351 9180 0.002
p19 9042 2.406 13180 0
p20 11071 2.417 0
p21 8667 2.427 12032 0
p22 7194 2.402 9180 0.001
p23 8746 2.434 13180 0
p24 11483 2.394 17180 0
p25 13191 5.039 19197 0.002
p26 11022 4.95 16131 0.002
p27 13037 4.919 21531 0.002
p28 16410 4.925 26931 0.002
p29 13289 4.96 19305 0.001
p30 12171 4.893 16239 0.001
p31 14228 4.937 21639 0.001
p32 15903 5.005 27039 0.001
p33 12220 4.973 19055 0.002
p34 11004 5.006 15989 0.001
p35 13637 4.926 21389 0
p36 15004 4.929 26789 0
p37 11935 4.946 19055 0
p38 10984 4.933 15989 0.001
p39 12984 4.944 21389 0.001
p40 14984 4.951 26789 0
p41 7103 2.932 7226 0
p42 6678 3.201 9957 0
p43 6758 3.038 12448 0
p44 7128 2.848 7585 0
p45 7478 3.102 9848 0
p46 6160 3.044 12639 0
p47 6257 2.865 6634 0
p48 6642 3.069 9044 0
p49 5658 3.048 12420 0
p50 9239 3.12 10062 0
p51 7920 3.451 11351 0.001
p52 9247 3.042 10364 0
p53 9319 3.43 12470 0
p54 9034 3.028 10351 0
p55 7938 3.451 11970 0
p56 22710 6.109 23882 0.001
p57 29464 6.079 32882 0.001
p58 43765 6.105 53882 0
p59 32854 6.113 39121 0.001
p60 23086 6.144 23882 0.001
p61 30093 6.193 32882 0.002
p62 41891 6.261 53882 0.001
p63 31788 6.32 39121 0.001
p64 22443 6.136 23882 0.003
p65 29279 6.15 32882 0.001
p66 44219 6.124 53882 0.001
p67 32471 7.23 39671 0
p68 23024 6.149 23882 0.001
p69 30318 6.145 32882 0.017
p70 43835 6.152 53882 0
p71 32071 6.128 39121 0

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

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

标签: p28j4mj密封连接器p28k2aqjg连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台