# -*- coding: utf-8 -*-
import sys
import numpy as np
import os
#快速排序算法函数
def Partition(low, high, a, w):
#确定轴点
x = a[low]
wmid = w[low]
while(low < high):
while(a[high] > x and low < high):
high -= 1
a[low] = a[high] #将比轴点小的数移至左端
w[low] = w[high] #将比轴点小的数的权值移至左端
while(a[low] <= x and low < high):
low += 1
a[high] = a[low] #将比轴点大的数移到右端
w[high] = w[low] #将比轴点大的数的权值移至右端
a[low] = x #low==high,low位为空,填入轴点数x
w[low] = wmid #填入轴点的权值
return low #返回排序的中间位置
#分治思想实现快速排序
def QuickSort(low, high, a, w):
if (low < high):
mid = Partition(low, high, a, w) #一次排序并找到分治中值
QuickSort(low, mid - 1, a, w)
QuickSort(mid + 1, high, a, w)
#得到加权中位值
def GetMidWeight(low, high, sw, w):
midSum = 0.0 #初始化加权值计算
for i in range(low, high): #循环计算加权值,得到加权中位值的位置
midSum += w[i] #当前加权值求和
if(midSum >= sw / 2): #比较是否加至加权中位值
return i #返回满足加权中位值的坐标值
#得到距离值
def getDistance(n, x, y, wx, wy, sw):
dx = 0 #初始化x坐标中位数所在数组中的位置
dy = 0 #初始化y坐标中位数所在数组中的位置
Distance = 0 #初始化距离值
QuickSort(0, n - 1, x, wx) #对x坐标值进行快速排序
dx = GetMidWeight(0, n - 1, sw, wx)
QuickSort(0, n - 1, y, wy) #对y坐标值进行快速排序
dy = GetMidWeight(0, n - 1, sw, wy)
print('排序后的横纵坐标:')
print('x wx y wy')
for i in range(n):
print(x[i], wx[i], y[i], wy[i])
print('邮局选址坐标为:')
print('x y')
print(x[dx], y[dy]) #输出使得距离最短的邮局选址坐标
#循环计算最短距离
for i in range(n):
Distance += abs(x[i] - x[dx]) + abs(y[i] - y[dy])
print('最小距离和为:')
print(Distance) #输出最短距离
#需要测试的五组数据所在文件夹
file_name = ['input_assgin01_01.dat', 'input_assgin01_02.dat','input_assgin01_03.dat',
'input_assgin01_04.dat', 'input_assgin01_05.dat']
#循环读取五组文件内容
for file_name in file_name:
print ('##########################')
print ('{0}文件中的测试结果:'.format(file_name))
a = np.loadtxt(file_name) #读取存数文档
n = int( a[0][0] ) #读取小区数目
print('小区数目为:')
print(n) #输出小区数目
x = [0] * n #初始化各小区的横坐标存储数组
y = [0] * n #初始化各小区的纵坐标存储数组
wx = [0.0] * n #初始化小区横坐标的加权值
wy = [0.0] * n #初始化小区纵坐标的加权值
sw = 0.0 #初始化加权值和
print('各小区的位置坐标以及加权值:')
print('x y wx wy')
a = np.loadtxt(file_name, skiprows = 1, dtype = int) #读取存数文档中除第一排的数据
for i in range(n): #循环读取各个小区的横纵坐标
x[i] = int( a[i][0] ) #循环读取横坐标
y[i] = int( a[i][1] ) #循环读取纵坐标
wx[i] = float( a[i][2] ) #循环读取坐标加权值
wy[i] = wx[i] #将y坐标加权值赋值,与x坐标的加权值一致
sw +=wx[i] #计算坐标加权值和,用以之后计算加权中位数
print(x[i], y[i], wx[i], wy[i]) #输出各小区的位置坐标
print('小区的加权值和:\n',sw)
getDistance(n, x, y, wx, wy, sw) #调用计算最短距离的函数
os.system('pause')
没有合适的资源?快使用搜索试试~ 我知道了~
邮局最佳选址问题附python实现.zip
共9个文件
dat:5个
spec:1个
exe:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 42 浏览量
2023-09-27
10:21:56
上传
评论
收藏 127.56MB ZIP 举报
温馨提示
1.版本:matlab2014/2019a/2021a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士等教研学习使用 5.博客介绍:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可si信 %% 开发者:Matlab科研助手 %% 更多咨询关注天天Matlab微信公众号
资源推荐
资源详情
资源评论
收起资源包目录
邮局最佳选址问题附python实现.zip (9个子文件)
1.py 4KB
input_assgin01_01.dat 59B
input_assgin01_02.dat 32B
input_assgin01_03.dat 59B
3.PNG 20KB
input_assgin01_04.dat 41B
1.spec 883B
input_assgin01_05.dat 50B
1.exe 128.41MB
共 9 条
- 1
资源评论
Matlab科研辅导帮
- 粉丝: 3w+
- 资源: 7796
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功