小区门诊所最佳选址的三种解法
文章目录
小区门诊所最佳选址的
python
求解
一、问题描述
下图给出了7个
居民小区,它们的邻接关系
及每个小区的居民人数
(括号中数字)。限于各方面条件限制,目前暂时只能在其中2个
小区开设医疗门诊所
,且每个门诊所只服务相邻的两个小区
(如在A开设门诊所,可服务于A和B或A和C)。问应在哪两个小区
开设门诊所及分别为哪些小区服务,使其覆盖
的居民人数
为最多
。
A(3400) | ||
---|---|---|
C(4200) | B(2900) |
|
D(2100) | ||
G(7100) | F(1800) | E(5000) |
二、问题求解
5.2的视力看穿答案,在D
(或G
)开设门诊,并服务于D
和G
;在B
(或E
)开设门诊,并服务于B
和E
。总服务人数达到最大
,为17100
人。
可以设置
0~1
变量,利用Lingo
求解。抑或手工计算2^7
中情况。
三、方法一:0-1变量法
3.1 问题分析
线性规划法
,7个居民小区应选择4处地点,使得门诊所服务的人数最多,并且每个门诊所只能服务于自身及相邻的小区且只能服务于一个相邻小区,使其覆盖的人数最多。我们可以设置0-1
变量,共设置10
组0-1变量表示服务于哪两个小区,求解方程组使其目标函数值最大
。遍历法
,遍历所有可能的方案,并且计算每一种可能的总覆盖人数,设置标志,排除重复覆盖的情况,得出的所有情况中的最大值即为最佳选址方案。邻接矩阵法
,构造邻接矩阵并求解。- 不妨假设
0-A
、1-B
、2-C
、3-D
、4-E
、5-F
、6-G
代替小区编号。
3.2 计算思路
对于决策变量的选取个数及约束条件选择,有两种
方法:
(1)枚举法
:从A
开始遍历直到G
结束,列出与之相邻的所有小区组合,即AB、AC、BA 、BC、BD、BE、CA 、CB 、CD、DB 、DC 、DF、DG、EB 、EF、FD 、FE 、FG、GD 和GF ,划去重复的字母组合,即决策变量的个数有:AB
、AC
、BC
、BD
、BE
、CD
、DF
、DG
、EF
和FG
共10
组决策变量
(见下图1)。
(2)python
:首先将与各小区相邻小区的信息写入“字典”
存储,接着将各小区的编号存储于“列表”
,使用for
循环,若满足条件,则写入“字典”,最后输入结果如下(图2)所示。
3.3 源代码
'''存储与之相邻元素的信息'''
a=[{
"no":1,"num":2900},{
"no":2,"num":4200}]#存储与A相邻的信息,共两个(B和C)
b=[{
"no":0,"num":3400},{
"no":2,"num":4200},{
"no":3,"num":2100},{
"no":4,"num":5000}]
c=[{
"no":0,"num":3400},{
"no":1,"num":2900},{
"no":3,"num":2100}]
d=[{
"no":1,"num":2900},{
"no":2,"num":4200},{
"no":5,"num":1800},{
"no":6,"num":7100}]
e=[{
"no":1,"num":2900},{
"no":5,"num":1800}]
f=[{
"no":3,"num":2100},{
"no":4,"num":5000},{
"no":6,"num":7100}]
g=[{
"no":3,"num":2100},{
"no":5,"num":1800}]
'''信息写入列表'''
c_list=[];c_list.append(a);lstD=[] #存放所有相邻元素的信息的列表
c_list.append(b);c_list.append(c);c_list.append(d)
c_list.append(e);c_list.append(f);c_list.append(g)
stack=[i for i in range(7)]
sum1=0;lst1=[];lst2=[]
for i in range(7):
for j in range(len(c_list[i])):
if stack[i]<c_list[i][j]["no"]:
sum1+=1
a_dict={
}
a_dict["x"]=i
a_dict["y"]=c_list[i][j]["no"]
lst1.append(a_dict)
print("变量个数: ",end='');print(sum1)
print("变量索引:(0-A,1-B,2-C,3-D,4-E,5-F,6-G)")
for k in range(len(lst1)):
print(lst1[k]["x"],end='')
print(lst1[k]["y"],end=' ')
print()
for k in range(len(lst1)):
print(chr(65+lst1[k]["x"]),end='')
print(chr(65+lst1[k]["y"]),end=' ')
print();print("约束条件:")
for i in range(7):
print("对于",end='');print(chr(65+i),end='')
print("小区的约束: ",end='')
for j in range(len(c_list[i])):
print(chr(65+i),end='')
print(chr(65+c_list[i][j]["no"]),end=' ')
if j!=len(c_list[i])-1:
print("+",end='')
print("<= 1")
3.4 目标函数与决策变量
决策变量有:
AB | AC | BC | BD | BE | CD | DF | DG | EF | FG | |
---|---|---|---|---|---|---|---|---|---|---|
变量 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 |
其中 X 1 ∼ X 10 X_{1}\sim X_{10} X1