选址(重心法、微分法迭代)

选址(重心法、微分法)

设某区域有交通发生点2个,分别为P1、P2,吸引点3个, 分别为M1、M2、M3。各点的货物流量和运输费率以及坐标见下表,现需要在该区域设置一个枢纽
发生地货物流量t运费区域坐标吸引地货物流量t运费区域坐标
P180001(6,7)M150001(1,6)
P270001(4,2)M240001(9,3)
M360001(3,10)

1 引入所需要的库

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

2 调入数据

data = pd.read_excel(r"G:\Data.xlsx")
data

在这里插入图片描述
3 源码

WC = np.array(data['W']) * np.array(data['C'])
WCX = (np.array(data['X_c']) * WC).sum()
WCY = (np.array(data['Y_c']) * WC).sum()
x0 = WCX / WC.sum()
y0 = WCY / WC.sum()
d_j = ((np.array(data['X_c']) - x0)**2 + (np.array(data['Y_c'])-y0)**2)**0.5
T = (WC * d_j).sum()
print('重心法初始选点大致位置:({},{})'.format(x0,y0))
print('总费用T0:{}'.format(T))
# print(d_j)
plt.rcParams['font.sans-serif'] = [u'SimHei']
for i in range(10):
    WC_j = WC/d_j
    WCX_j = ((np.array(data['X_c']) * WC)/d_j).sum()
    WCY_j = ((np.array(data['Y_c']) * WC)/d_j).sum()
    x = WCX_j / WC_j.sum()
    y = WCY_j / WC_j.sum()
    d_j = ((np.array(data['X_c']) - x)**2 + (np.array(data['Y_c'])-y)**2)**0.5
    T = (WC * d_j).sum()
    print('经{}次迭代后选址点位置:({},{})'.format(i+1,x,y))
    print('总费用T{}:{}'.format(i+1,T))
    plt.figure(figsize=(7,7))
    plt.scatter(np.array(data['X_c']),np.array(data['Y_c']),[300,300,300,300,300,300],c = 'green',marker = '*',alpha = 0.7,label='配送点')
    plt.scatter(x,y,[300,300,300,300,300,300],c = 'red',marker = 'p',alpha = 0.7,label='选址点')
    plt.xlabel('纬度',fontsize=11)
    plt.ylabel('经度',fontsize=11)
    plt.grid(True)
#     plt.text(1,3,'总费用{}'.format(T),fontsize=16)
    plt.title('重心法选址,第{}次结果示意图'.format(i+1),fontsize=14)
    plt.legend(loc='lower left')

4 结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值