村镇小学最佳选址问题Python求解

村镇小学最佳选址问题Python求解


文章目录

    • 村镇小学最佳选址问题Python求解
      • 一、问题描述
      • 二、源代码


一、问题描述

最佳选址问题的Python求解

团结乡有8个村镇,各村镇位置坐标及学生人数如下表所示。


村镇代号
坐标位置
小学生人数
x y
1 0 0 60
2 10 3 80
3 12 15 100
4 14 13 120
5 16 9 80
6 18 6 60
7 8 12 40
8 6 10 80

考虑到学校的规模效益,拟选其中两个村镇各建一所小学。问两所小学各建于何处,使小学生上学所走路程最短(小学生所走路程按两村镇之间的欧式距离计算)。

二、源代码

# -*- coding: utf-8 -*-
import math #导入math模块
sqrt = math.sqrt #运算两点之间距离
from queue import Queue #导入队列的模块
q = Queue(maxsize=0) #初始化空队列
x = [0,10,12,14,16,18,8,6] #各点的横坐标
y = [0,3,15,13,9,6,12,10] #各点的纵坐标
number = [60,80,100,120,80,60,40,80] #各点的人数
'''存放两地学校选址的坐标'''
stack = [] #构造栈
b_list = [] #存放所有情况的列表
c_list = [];d_list = []
lst = [];list_D = []
'''数据写入列表'''
for i in range(len(x)):
    for j in range(len(y)):
        if i == j: #学校建在不同的两地
            continue
        else:
            a_list = [] #存储一种情况
            a_dict = {
     } #存储一种情况的坐标数据
            a_dict["x"] = x[i]
            a_dict["y"] = y[i]
            stack.append(a_dict)
            q.put(stack.pop()) #弹栈和入队先后进行
            a_dict = {
     }
            a_dict["x"] = x[j]
            a_dict["y"] = y[j]
            stack.append(a_dict)
            q.put(stack.pop())
            for h in range(len(q.queue)):
                a_list.append(q.get())
            b_list.append(a_list) #两地选址的情况,考虑了顺序
'''还需判断某点对两处地址哪一处距离最小'''
for k in range(len(b_list)):
    for n in range(len(b_list[k])):
        d_list.append(b_list[k][n]) #读出两处的坐标
    for m in range(len(x)):
        for l in range(len(d_list)):
            Q = d_list[l]
            d = sqrt((Q["x"]-x[m])**2+(Q["y"]-y[m])**2)
            c_list.append(d)
        min_d = min(c_list) * number[m] #距离最小
        lst.append(min_d)
        c_list.clear()
    list_D.append(sum(lst))
    d_list.clear()
    lst.clear()
    
for s in range(len(list_D)):
    print(list_D[s])
print()
print(min(list_D))

你可能感兴趣的:(python,列表,算法,队列)