小区门诊所最佳选址的三种解法

本文探讨了小区门诊所最佳选址的三种方法,包括0-1变量法、遍历法和邻接矩阵法。通过设立0-1变量和整数规划约束条件,求解使服务人数最多的门诊所配置。同时,提供了源代码实现,以解决实际问题。
摘要由CSDN通过智能技术生成

小区门诊所最佳选址的三种解法



小区门诊所最佳选址的python求解

一、问题描述

下图给出了7个居民小区,它们的邻接关系及每个小区的居民人数(括号中数字)。限于各方面条件限制,目前暂时只能在其中2个小区开设医疗门诊所,且每个门诊所只服务相邻的两个小区(如在A开设门诊所,可服务于A和B或A和C)。问应在哪两个小区开设门诊所及分别为哪些小区服务,使其覆盖的居民人数最多

表1 各小区的邻接关系及人数
A(3400)
C(4200)
B(2900)
D(2100)
G(7100) F(1800) E(5000)

二、问题求解

5.2的视力看穿答案,在D(或G)开设门诊,并服务于DG;在B(或E)开设门诊,并服务于BE。总服务人数达到最大,为17100人。

可以设置0~1变量,利用Lingo求解。抑或手工计算2^7中情况。

三、方法一:0-1变量法

3.1 问题分析

  1. 线性规划法,7个居民小区应选择4处地点,使得门诊所服务的人数最多,并且每个门诊所只能服务于自身及相邻的小区且只能服务于一个相邻小区,使其覆盖的人数最多。我们可以设置0-1变量,共设置10组0-1变量表示服务于哪两个小区,求解方程组使其目标函数值最大
  2. 遍历法,遍历所有可能的方案,并且计算每一种可能的总覆盖人数,设置标志,排除重复覆盖的情况,得出的所有情况中的最大值即为最佳选址方案。
  3. 邻接矩阵法,构造邻接矩阵并求解。
  4. 不妨假设0-A1-B2-C3-D4-E5-F6-G代替小区编号。

3.2 计算思路

对于决策变量的选取个数及约束条件选择,有两种方法:
(1)枚举法:从A开始遍历直到G结束,列出与之相邻的所有小区组合,即AB、AC、BA 、BC、BD、BE、CACB 、CD、DBDC 、DF、DG、EB 、EF、FDFE 、FG、GDGF ,划去重复的字母组合,即决策变量的个数有:ABACBCBDBECDDFDGEFFG10决策变量(见下图1)。

图1

(2)python:首先将与各小区相邻小区的信息写入“字典”存储,接着将各小区的编号存储于“列表”,使用for循环,若满足条件,则写入“字典”,最后输入结果如下(图2)所示。

图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 目标函数与决策变量

决策变量有:

表2 决策变量个数及含义
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值