Python实现重心法

至于重心法是什么我就不多说了,我们直接来看例题:

运用图中数据运用重心法来选址:

代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def dis(WC,data):
    WCX = (np.array(data['x']) * WC).sum()
    WCY = (np.array(data['y']) * WC).sum()
    x0 = WCX / WC.sum()
    y0 = WCY / WC.sum()
    d_j = ((np.array(data['x']) - x0)**2 + (np.array(data['y'])-y0)**2)**0.5
    T = (WC * d_j).sum()
    print('重心法初始选点大致位置:({},{})'.format(x0,y0))
    print('总费用T0:{}'.format(T))

    #迭代10次
    plt.rcParams['font.sans-serif'] = [u'SimHei']
    for i in range(10):
        WC_j = WC/d_j
        WCX_j = ((np.array(data['x']) * WC)/d_j).sum()
        WCY_j = ((np.array(data['y']) * WC)/d_j).sum()
        x = WCX_j / WC_j.sum()
        y = WCY_j / WC_j.sum()
        d_j = ((np.array(data['x']) - x)**2 + (np.array(data['y'])-y)**2)**0.5
        T = (WC * d_j).sum()
        print('经{}次迭代后选址点位置:({},{})'.format(i+1,x,y))
        print('总费用T{}:{}'.format(i+1,T))
        #画图,如果需要迭代次数多,建议只画第一次和最后一次
        plt.figure(figsize=(8,4))
        plt.scatter(np.array(data['x']),np.array(data['y']),[300,300,300,300,300],c = 'green',marker = '*',alpha = 0.7,label='站点')
        plt.scatter(x,y,[270],c = 'red',marker = 'p',alpha = 0.7,label='选址点')
        plt.xlabel('x坐标',fontsize=11)
        plt.ylabel('y坐标',fontsize=11)
        plt.grid(True)
        plt.title('重心法选址,第{}次结果示意图'.format(i+1),fontsize=14)
        plt.show()
if __name__=='__main__':
    # 读取文件
    data = pd.read_excel(r"C:\Users\pan15\Desktop\重心法\data.xlsx")
    # print(data)
    WC = np.array(data['W']) * np.array(data['C'])
    dis(WC,data)

 运行结果如下图:

 

 最后重点警告!!!如果要迭代多次最好不要一次次画图。

  • 4
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值