KMeans算法应用物流配送问题

1.问题描述 

 物流配送问题。
问题描述:“双十一”期间,物流公司要给M城市的50个客户配送货物。假设公司只有5辆货车,客户的地理坐标在testSet.txt文件中,如何配送效率最高? 

 2.代码实现

#coding=utf-8
from numpy import *
from matplotlib import pyplot as plt    
#计算两个向量的欧式距离
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2)))
#选K个点作为种子   
def initCenter(dataSet, k):
    print('2.initialize cluster center...')
    shape=dataSet.shape
    n = shape[1]  #列数    
    classCenter = array(zeros((k,n)))
    #取前k个数据点作为初始聚类中心
    for j in range(n):        
        firstK=dataSet[:k,j]
        classCenter[:,j] = firstK
    return classCenter
#实现K-Means算法   
def myKMeans(dataSet,k):
    m = len(dataSet)                 #行数    
    clusterPoints = array(zeros((m,2)))   #各簇中的数据点
    classCenter = initCenter(dataSet, k)  #各簇中心
    clusterChanged = True
    print('3.recompute and reallocated...')
    while clusterChanged:     #重复计算,直到簇分配不再变化
        clusterChanged = False
        #将每个数据点分配到最近的簇
        for i in range(m):   
            minDist = inf
            minIndex = -1
            for j in range(k):
                distJI = distEclud(classCenter[j,:],dataSet[i,:])
                if distJI < minDist:
                    minDist = distJI; minIndex = j
            if clusterPoints[i,0] != minIndex: 
                clusterChanged = True
            clusterPoints[i,:] = minIndex,minDist**2
        #重新计算簇中心   
        for cent in range(k):
            ptsInClust = dataSet[nonzero(clusterPoints[:,0]==cent)[0]]
            classCenter[cent,:] = mean(ptsInClust, axis=0)
    return classCenter, clusterPoints
#显示聚类结果    
def show(dataSet, k, classCenter, clusterPoints):   
    print('4.load the map...')
    fig = plt.figure()
    rect=[0.1,0.1,1.0,1.0]
    axprops = dict(xticks=[], yticks=[])
    ax0=fig.add_axes(rect, label='ax0', **axprops)
    imgP = plt.imread('city.png')
    ax0.imshow(imgP)
    ax1=fig.add_axes(rect, label='ax1', frameon=False)
    print('5.show the clusters...')
    numSamples = len(dataSet)   #对象数量
    mark = ['ok', '^b', 'om', 'og', 'sc']  
    #根据每个对象的坐标绘制点
    for i in range(numSamples):  
        markIndex = int(clusterPoints[i, 0])%k          
        ax1.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])  
    #标记每个簇的中心点    
    for i in range(k):  
        markIndex = int(clusterPoints[i, 0])%k         
        ax1.plot(classCenter[i, 0], classCenter[i, 1], '^r', markersize = 12)  
    plt.show()
      
print('1.load dataset...')
dataSet=loadtxt('testSet.txt')
K=5   #类的数量
classCenter,classPoints= myKMeans(dataSet,K)
show(dataSet,K,classCenter,classPoints)

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新手村扛把子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值