首页 > 其他分享 >海量坐标点求最短距离新探索

海量坐标点求最短距离新探索

时间:2024-10-27 12:19:52浏览次数:9  
标签:海量 点求 list url int 坐标 短距离 100

目录

一、前言

二、思路

三、实现

四、小结

一、前言

   多点路径距离最短问题是一个提出很久的课题,实际应用范围很广,快递配送方面、无人机运输投送,线路安排、点位分配等,最短距离的探索与研究成果可转化为实际应用,目前已经有很多成熟的算法,本文将从另一个思路,对100万虚拟坐标点,结合实际需求,进行最短距离的探索,分享与大家参考。

二、思路

1、随机生成100万个坐标点,供测试,因数据太大,使用 pickle 格式来保存生成的100万个数据,升序排列,格式【x,y,m】代表x、y坐标值和该点位名称,x、y值范围均是0至1000,保留两位小数。

def test_all(n,url):  # 生成虚拟数据 
    val=[[int(random.random()*100000)/100,int(random.random()*100000)/100,int(1+i)] for i in range(n)]
    pd.DataFrame(sorted(val)).to_pickle(url)

2、因点位数量太大,结合快递投递的实际情况,对这100万个坐标位置进行分组,便于分配给相应的投递站,本文以大约每组100个坐标点的设想,进行分组,各组坐标点均按顺时针顺序排序后保存于另一个 pickle 文档中,供后续程序使用。

def fenzu_pickle(url,to_url):    #以Pickle方式读取总表数据、分组、再保存  
    list_A=pd.read_pickle(url).values.tolist()
    list_B = [[] for _ in range(10000)]
    for s in list_A:
        n=int(s[0]/10)*100+int(s[1]/10)
        list_B[n].append(s)
    list_B_1=[shun(s) for s in list_B if len(s)>0]   # shun(s) 是顺时针排列的自定义函数
    pd.DataFrame(list_B_1).to_pickle(to_url)

3、求各组中所有坐标点相连的最短距离,每组坐标点大约100个,有人采用“蚁群算法”、“遗传算法”、“贪心算法”,都是很成功的算法,本文将采用对已按顺时针顺序排列的坐标点分段(每段5至8个坐标点)求出每组中最短距离的排列,将各组最短距离排列重新连接成新排列。期间使用 itertools.permutations()方法,生成各段坐标点的全部排列顺序,并计算各个排列顺序的距离,将距离最短的排列顺序及距离保存下来。 

def zhuiduan(fz):  # 取得几个坐标点之间最短距离
    f1=fz[:1]
    f_1=fz[-1:]
    lisA1_1 = list(itertools.permutations(fz[1:-1]))
    for s in lisA1_1:
        smm=10000
        sk=f1+list(s)+f_1
        ji_sm=round(jishuan_list(sk),2)
        if ji_sm<smm:
            smm=ji_sm
            ju_lu=sk
    return smm,ju_lu

三、实现

1、导入所需的库 

import time,math,operator,glob,itertools,os,random
from functools import reduce
import matplotlib.pyplot as plt
from numba import njit
import pandas as pd

2、完整代码:

@njit
def jishuan(a,b): # 计算任意两点之间距离公式
    x1,y1=a[0],a[1]
    x2,y2=b[0],b[1]
    juli=((x1-x2)**2+(y1-y2)**2)**0.5
    return juli

def jishuan_list(list_s1):  # 计算一个列表所有坐标之间的距离
    ju=0
    for i in range(len(list_s1)-1):
        ju+=jishuan(list_s1[i],list_s1[i+1])
    return ju

def test_all(n,url):  # 生成总虚拟数据
    val=[[int(random.random()*100000)/100,int(random.random()*100000)/100,int(1+i)] for i in range(n)]
    pd.DataFrame(sorted(val)).to_pickle(url)

def shun(listA): # 顺时针排序
    coords=[]
    for a in listA:
        coords.append((a[0],a[1],int(a[2])))
    center = tuple(map(operator.truediv, reduce(lambda x, y: map(operator.add, x, y), coords), [len(coords)] * 2))
    ss=sorted(coords, key=lambda coord: (-135 - math.degrees(math.atan2(*tuple(map(operator.sub, coord, center))[::-1]))) % 360)
    return ss  

def fenzu_pickle(url,to_url):    #以Pickle方式读取总表数据,并分组  
    list_A=pd.read_pickle(url).values.tolist()
    list_B = [[] for _ in range(10000)]
    for s in list_A:
        n=int(s[0]/10)*100+int(s[1]/10)
        list_B[n].append(s)
    list_B_1=[shun(s) for s in list_B if len(s)>0]
    pd.DataFrame(list_B_1).to_pickle(to_url)

def dir_pick(path): # 获取目录下所有csv文件个数
    files = glob.glob(path+'/*.csv')
    return len(files)

def zhuiduan(fz):  # 取得几个坐标点之间最短距离
    f1=fz[:1]
    f_1=fz[-1:]
    lisA1_1 = list(itertools.permutations(fz[1:-1]))
    for s in lisA1_1:
        smm=10000
        sk=f1+list(s)+f_1
        ji_sm=round(jishuan_list(sk),2)
        if ji_sm<smm:
            smm=ji_sm
            ju_lu=sk
    return smm,ju_lu

def to_list_f(lis,m):  #计算最短距离
    lis.append(lis[0])
    ms=len(lis)
    nn=int(ms/m) if ms%m<2 else int(ms/m)+1
    list_fz=[lis[i*m:(i+1)*m+1]  for i in range(nn)]
    ju_ju = []
    sm=0
    for j,fz in enumerate(list_fz):
        len_a=len(list_fz)
        len_fz=len(fz)
        if len_fz>3:
            ju_li=zhuiduan(fz)
            if j<len_a-1:
                ju_ju+=ju_li[1][:-1]
            else:
                ju_ju+=ju_li[1]
            sm+=ju_li[0]
        else:
            sm+=round(jishuan_list(fz),2)
            ju_ju+=fz
    return [(sm,0,0)]+ju_ju

def yin_yon(url,m,file_na):   # 读取各组数据,计算最短距离,
    file_s=dir_pick(file_na)
    fen_list=pd.read_pickle(url).values.tolist()
    f_0=[[s for s in fen_list[i] if s is not None] for i in range(10000)]
    nn=len(f_0)
    for i in range(file_s,nn):
        to_to=min([to_list_f(f_0[i],m-k) for k in range(4)])
        pd.DataFrame(to_to).to_csv(file_na+f'\\p_{i}.csv',index=False,header=False)

if __name__=='__main__':
    nn=1000000  #生成虚拟数据数量
    ms=8     # 分段计算各点位全部组合距离
    all_url=r'p9999\p_all\p_all.pickle'    #创建该目录
    fen_url=r'p9999\p_all\p_fen.pickle'   #保存 所有数据按坐标范围分组
    duan_path=r'p9999\duochu'  #创建该目录,用于储存计算好的最短距离和点位顺序
    start = time.time()
    # test_all(nn,all_url)  # 第一步:运行后生成虚拟数据
    # fenzu_pickle(all_url,fen_url)   # 第二步:读取总表数据,并按坐标位置分组  
    # yin_yon(fen_url,ms,duan_path)   # 第三步:读取各组数据,计算各组最短距离,分别储存
    end = time.time()    
    print(end - start)

四、小结

1、本方法是一个个人尝试,供大家测试参考,作为一种思路来探索,本文的总体思路是化整为零,按坐标分组,按顺时针方向排序后分段求解再合并,最后完成最短距离的解决方案。

2、由于分为10000个组,各组进行最短距离求解,所需时间较长,我测试的时间是大约7000秒,在设计时 使用 dir_pick(path):函数 获取保存最短距离排列数据的文件夹下文件个数,来判断已求得最短距离的组个数,这样就不必一次求解10000组解值,中途可以退出程序,再次运行求解函数,不会从头开始求解,而是只对后面未求解的组,继续求解。

标签:海量,点求,list,url,int,坐标,短距离,100
From: https://blog.csdn.net/Zlb0999_/article/details/143266710

相关文章

  • 海量大模型如何一键部署上云?函数计算 x ModelScope 社区给出答案
    作者:魔搭官方大模型在过去一年多时间里的一路技术狂奔,深刻的改变了今天模型和AI的整体应用生态,也给开发者提供纷繁复杂的模型选择。在多样化大模型的背后,OpenAI得益于在领域的先发优势,其API接口今天也成为了业界的一个事实标准。许多开源工具和框架,包括LlamaIndex,LangChain......
  • 机器学习中的海量数据查找—倒排索引查找
    原文链接:机器学习中的海量数据查找—倒排索引查找–每天进步一点点(longkui.site)索引是一种用于数据快速查找的数据结构,哈希表、二分查找、分块查找也可以视为一种索引,这类索引的价值在于在较短的时间内获得最相关、最全、最深的数据集合。在通常使用的索引中,大多是基于顺序......
  • 分段处理海量数据SQL
    在DB2中,你可以使用`ROW_NUMBER()`窗口函数来为表中的每一行分配一个唯一的序号。然后,基于这个序号,你可以将数据划分成指定数量的组,并确定每组的上边界和下边界。假设你的表名为`my_table`并且它有一个唯一索引列叫做`id`。你想把1000条记录分成10组,那么每组应该包含100条记......
  • DirectoryOpus插件:“照得标管理器”-海量照片分类管理好帮手!
       照得标管理器前言  名词解释:“照得标管理器”,即:照片得到标签管理器,后文统一简称“照得标管理器”或“照得标”。  注:请不要和抖音上的“奥德彪”、“王德发”之类联系,我分享的是正经照片-得到-标签-管理器。  有段时间作者赋闲在家,决定把留在电脑上的几万张......
  • 如何做好游戏中美术项目管理?TAPD带你挣脱海量Excel困扰
    这两年国内手游竞争日趋白日化,版号的限制、买量内卷、国内用户增量日趋饱和,大厂更是把游戏美术和宣发美术卷到了影视级的高度,游戏美术设计的方向早已走向了全球化。有别于其他项目类别,在游戏项目中,尤其是大型游戏项目团队,都设立了美术项目经理的岗位,称之为APM。作为一个APM,......
  • 信创里程碑:TapData 与海量数据达成产品兼容互认证,共同助力基础设施国产化建设
    近日,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的钛铂实时数据平台(TapDataLiveDataPlatform,TapDataLDP)与北京海量数据技术股份有限公司(以下简称海量数据)海量数据库G100管理系统(VastbaseG100)完成并通过相互兼容性测试认证。测试结果显示,TapDataLDPV3与VastbaseG10......
  • 支持 128TB 超大存储,GaussDB (for MySQL) 如何轻松应对海量数据挑战
    本文分享自华为云社区《【选择GaussDB(forMySQL)的十大理由】之二:128TB超大存储》,作者:GaussDB数据库。大数据时代的挑战随着互联网、大数据等行业的迅猛发展,企业的数据流量呈现爆炸式增长,数据库作为数据存储的核心,其承载的数据量越来越大。近十年,企业数据量从GB发展到TB,甚......
  • 支持128TB超大存储,GaussDB(for MySQL)如何轻松应对海量数据挑战
    摘要:华为云数据库GaussDB(forMySQL)基于华为最新一代DFV存储,采用计算存储分离架构,最多支持128TB的海量存储。本文分享自华为云社区《【选择GaussDB(forMySQL)的十大理由】之二:128TB超大存储》,作者:GaussDB数据库。大数据时代的挑战随着互联网、大数据等行业的迅猛发展,企业的数据......
  • 自助式响应式建站系统源码 海量网站模版随心选择 带完整的安装代码包以及搭建部署教程
    系统概述自助式响应式建站系统,顾名思义,是一种允许用户无需深入了解编程技术,即可通过简单的拖拽、选择等操作,快速创建并管理网站的在线工具。它结合了响应式设计理念,确保网站能够在不同设备(如电脑、平板、手机)上自动调整布局,提供最佳浏览体验。此类系统通常提供丰富的网站模版......
  • 【Python-办公自动化】1秒解决海量查找替换难题
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......