设施规划选址——重心法

重心法

数据准备-格式

在这里插入图片描述

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

# 初始化工厂位置
def init_factory():
    data = [281.84548388749425, 288.61186536195504]
    
    return data


# 成本函数
def cost(x_d, y_d, data):
    cost = np.sum(data.loc[:, 'A'].to_numpy() * data.loc[:, 'W'].to_numpy() * data.loc[:, 'D'].to_numpy()) 
    return cost

# 读取数据:固定点坐标-二维
file = "data1.xlsx"               # 每行为一个点坐标,列为x,y,aj, wj
data = pd.read_excel(file)

#设置迭代次数
iteration = 10000


#初始值设置
x_factory = init_factory()[0]
y_factory = init_factory()[1]

#最优工厂位置
opt_x_factory = 0
opt_y_factory = 0
low_cost      = 100

#开始迭代
for k in range(iteration):
    
    print("第{0}次迭代".format(k +1))
    # 计算工厂到点的距离-并堆叠在data后一列
    distance=  np.sum((data.loc[:, ['X', 'Y']].to_numpy() - np.array([x_factory, y_factory]))**2, axis=1)**0.5
    data.loc[:, 'D'] = np.reshape(distance, (-1, 1))
    
    # 计算初始成本
    T_0 = cost(x_factory, y_factory, data)
    
    print("工厂位置为:(x, y)=({0}, {1})".format(x_factory, y_factory))
    
    
    #验证数据
    print(data)
    
    # 存储前一个工厂位置
    before_x_factory = x_factory
    before_y_factory = y_factory
    
    #工厂位置更新
    WC_j = np.sum(data.loc[:, 'A'].to_numpy()*data.loc[:, 'W'].to_numpy()/data.loc[:, 'D'].to_numpy())    
    WCX_j = np.sum(data.loc[:, 'A'].to_numpy() * data.loc[:, 'W'].to_numpy() * data.loc[:, 'X'].to_numpy()/data.loc[:, 'D'].to_numpy())
    WCY_j = np.sum(data.loc[:, 'A'].to_numpy()*data.loc[:, 'W'].to_numpy()*data.loc[:, 'Y'].to_numpy()/data.loc[:, 'D'].to_numpy())
    
    
    x_factory  = WCX_j  / WC_j
    y_factory  = WCY_j  / WC_j
    
    
    # 计算成本函数
    # 计算工厂到点的距离-并堆叠在data后一列
    distance=  np.sum((data.loc[:, ['X', 'Y']].to_numpy() - np.array([x_factory, y_factory]))**2, axis=1)**0.5
    data.loc[:, 'D'] = np.reshape(distance, (-1, 1))
    T_1 = cost(x_factory, y_factory, data)
    
    
    #判断是否达到成本函数最低
    if T_0 < T_1:
        # 最优工厂位置
        opt_x_factory = before_x_factory
        opt_y_factory = before_y_factory
        
        #最低运输成本
        low_cost = T_0
        print("------------end-----------------")
        break
        
    
# 最优工厂位置
print("最优工厂位置为:(x, y)=({0}, {1})".format(opt_x_factory, opt_y_factory))
print("最低成本:{0}".format(low_cost))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值