数学建模之选址问题

选址问题

是指在规划区域里选择一个或多个设施的位置,使得目标最优。

四个要素

设施、规划区域、位置(距离)、目标

设施

按照 设施的 空间维度 划分,可以将选址问题分为:
1.立体选址问题:设施的高度不能被忽略,如集装箱装箱问题。
2.平面选址问题:设施的长、宽不能被忽略,如货运站的仓位布局问题。
3.线选址问题:设施的宽度不能被忽略,如在仓库两边的传送带布局问题。
4.点选址问题:设施可以被简化为一个点,绝大多数时候我们遇到的都是这类问题。

按照设施的 规划数量 划分,可以将选址问题分为:
1.单设施选址
2.多设施选址

规划区域

按照规划区域的结构划分,可以将选址问题分为:
1.连续选址问题:设施可以在给定范围的任意位置选址,设施的候选位置为无穷多。
2.离散选址问题:设施的候选位置是有限且较少的,实际中最常遇到这类问题。
3.网格选址问题:规划区域被划分为许多的小单元,每个设施占据其中有限个单元。

位置(距离)

按照设施与需求点位置的关系,可以将所要获取的距离分为:
1.间接距离:
有向赋权图:Dijkstra算法和Floyed算法
两种算法的代码链接
2.直接距离:
(1)两点间距离公式
(2)Lp距离计算方式如下:d = (Σ(x1i-x2i)p)1/p

p=1时:L1范式,又称曼哈顿距离,在二维平面上 d=|x1-x2|+|y1-y2|。假设在曼哈顿街区乘坐出租车从 P 点到 Q 点,白色表示高楼大厦,灰色表示街道,则下图中红线、蓝线、黄线的行驶距离都是一样的,都是曼哈顿距离。
在这里插入图片描述
p=2:L2范式,又称欧氏距离,定义于欧几里得空间中,是最常见的距离度量方式,在二维平面上 d=((x1-x2)2+(y1-y2)2)1/2,即两点间的直线距离,上图中的绿线。

p=∞:切比雪夫距离(Chebyshev distance),在二维平面上 d=max(|x1-x2|, |y1-y2|)。玩过国际象棋的都知道,国王走一步能够移动到相邻的8个方格中的任意一个位置,那么国王从格子(x1,y1)走到格子(x2,y2)最少的步数就是切比雪夫距离。可以试试看,下图已经标注国王到达任意位置所需要的步数。
在这里插入图片描述

目标:

1.单目标选址问题
2.多目标选址问题:实际的问题往往都是多目标规划问题,比如既想距离尽可能短,又想要费用尽可能少

三大问题:

1.P中值问题 P-Median Problem

研究:在备选设施集合里,如何选择p个设施,使所有需求点得到服务,并且需求点到其最近设施的加权距离总和最小。

这是一个MinSum问题,可由以下整数规划模型表示:

在这里插入图片描述
应用场景:在物流领域应用得非常广泛,加权距离代表了运输成本,目标是总成本最少。

2.P中心问题 P-Center Problem

研究:在备选设施集合里,如何选择p个设施,使所有需求点得到服务,并且每个需求点到其最近设施的最大距离最小。

这是一个MinMax问题,可由以下整数规划模型表示(符号说明与上面类似):
在这里插入图片描述
应用场景:应急设施的选址,比如警局、消防局、医院,要求尽可能快地到达任意位置。

3.覆盖问题 Covering Problem

覆盖问题分为最大覆盖问题和集覆盖问题两类。

(1)集覆盖问题

研究:在备选设施集合里,已知每个设施的服务范围,如何选择设施,使所有需求点得到服务,并且设施数p最小或成本最小。
在这里插入图片描述

(2)最大覆盖问题

研究:在备选设施集合里,已知每个设施的服务范围,如何选择p个设施,使得服务的需求点数最多或需求量最大。
应用场景:追求覆盖面的场景,比如移动基站的选址、物流中心的选址。

P-Center问题的学校选址可以通过以下步骤进行数学建模和Python编码: 1. 确定需求点和服务点:需求点是学生和家长的居住地,服务点是学校的候选位置。 2. 确定距离度量方法:可以使用欧几里得距离或曼哈顿距离来度量需求点和服务点之间的距离。 3. 确定P值:P值是指需要覆盖的需求点数量,可以根据实际情况来确定。 4. 建立数学模型:P-Center问题可以表示为一个最小化问题,即最小化服务点和需求点之间的最大距离。具体而言,可以使用以下数学模型: Minimize max(d(i,j)) subject to sum(y(j)) = P y(j) ∈ {0,1} x(i,j) ∈ {0,1} d(i,j) = distance between demand point i and candidate facility j where y(j) is a binary variable indicating whether to build a facility at candidate site j x(i,j) is a binary variable indicating whether demand point i is assigned to facility j 5. 编写Python代码:可以使用Python中的PuLP库来解决P-Center问题。下面是一个简单的代码示例: ```python import pulp # Input data demand_points = [(1,2), (3,4), (5,6), (7,8)] # 需求点坐标 candidate_facilities = [(10,20), (30,40), (50,60)] # 候选位置坐标 P = 2 # 需要覆盖的需求点数量 # Create problem prob = pulp.LpProblem("P-Center Problem", pulp.LpMinimize) # Create decision variables y = pulp.LpVariable.dicts("Facility", candidate_facilities, lowBound=0, upBound=1, cat=pulp.LpInteger) x = pulp.LpVariable.dicts("Assignment", [(i,j) for i in demand_points for j in candidate_facilities], lowBound=0, upBound=1, cat=pulp.LpInteger) # Create objective function prob += pulp.lpSum([pulp.lpSum([pulp.lpSum([x[(i,j)]*distance(i,j) for i in demand_points]) for j in candidate_facilities])*y[(j)] for j in candidate_facilities]) # Create constraints prob += pulp.lpSum([y[(j)] for j in candidate_facilities]) == P for i in demand_points: prob += pulp.lpSum([x[(i,j)]*y[(j)] for j in candidate_facilities]) == 1 # Solve problem prob.solve() # Print results print("Objective value:", pulp.value(prob.objective)) for j in candidate_facilities: if y[(j)].value() == 1: print("Facility at", j) for i in demand_points: for j in candidate_facilities: if x[(i,j)].value() == 1: print("Demand point", i, "assigned to facility at", j) ``` 在上面的代码中,`distance(i,j)`表示需求点i和候选位置j之间的距离。需要根据使用的距离度量方法进行相应的实现。运行代码后,可以得到最优的学校选址方案,以及每个需求点分配到的学校。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值