至于重心法是什么我就不多说了,我们直接来看例题:
运用图中数据运用重心法来选址:
代码:
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)
运行结果如下图:
最后重点警告!!!如果要迭代多次最好不要一次次画图。