首页 > 其他分享 >基于三次样条插值和单纯形法的加氢站选址优化

基于三次样条插值和单纯形法的加氢站选址优化

时间:2024-07-11 13:29:29浏览次数:18  
标签:dist 样条 单纯形法 插值 car 公里 df num new

问题描述

已知定点交通流量,求解加氢站建设位置

求解方法

已知国道或省道定点交通流量若干,根据已知交通流量插值得到每3km对应的交通流量。如图所示。
插值得到车流量
将该问题转换为p-中值问题:
p-中值问题参数
其中,
需求点位置集合=每3km一个需求点

在i点的客户人数=i点(每个需求点)的车流量

设施总数=需要建设的加氢站数量

i点与j点之间的距离由第4步构建

整体模型思路参考https://blog.csdn.net/m0_45008035/article/details/127017479

将该问题转换到加氢站选址,最终实现整个山西省吕梁市的加氢站规划建设

  1. 加氢站数量选定和数据集读取
loc_nums = 6
sheet_name = 'S223'
df_1 = pd.read_excel('路段平均日交通量(1).xlsx',sheet_name=sheet_name)
  1. 累计公里数计算
def re_cal_km(df_car):
    if len(df_car)>1:
        df_car = df_car.drop([0, 1, 2, len(df_1)-1])
        df_car = df_car.reset_index(drop=True)
    df_car = df_car[['汽车(辆/日)','观测里程(公里)']]
    if len(df_car)>1:
        df_car.at[0,'累计公里'] = df_car.at[0,'观测里程(公里)']
        df_car.at[1,'累计公里'] = df_car.at[1,'观测里程(公里)'] + df_car.at[0,'观测里程(公里)']
        for i in range(2,len(df_car)):
            df_car.at[i,'累计公里'] = df_car.at[i,'观测里程(公里)'] + df_car.at[i-1,'累计公里']
        df_car = df_car.drop('观测里程(公里)',axis=1)
        df_car.at[0,'累计公里'] = 0
    else:
        df_car.rename(columns={'观测里程(公里)': '累计公里'}, inplace=True)
        total_km = df_car['累计公里'].values[0]
        medin_km = total_km/2
        medin_cars = df_car['汽车(辆/日)'].values[0]
        r_num = np.random.randint(0, 10)
        cars_start = medin_cars - medin_km*3*r_num
        cars_end = medin_cars + medin_km*3*r_num
        df_car.at[0,'累计公里'] = 0
        df_car.at[1,'累计公里'] = total_km
        df_car.at[0,'汽车(辆/日)'] = cars_start
        df_car.at[1,'汽车(辆/日)'] = cars_end
        df_car = df_car.sort_index()
    return df_car
  1. 交通流量插值
from scipy.interpolate import interp1d
import numpy as np

def inter_traffic(df_car,loc_nums):
    # 使用累计公里作为X轴,汽车(辆/日)作为Y轴
    x = df_car['累计公里']
    y = df_car['汽车(辆/日)']

    # 插值函数
    if len(x) <= 2:
        interp_function = interp1d(x, y, fill_value=0, bounds_error=False)
    else:    
        interp_function = interp1d(x, y, kind='cubic', fill_value=0, bounds_error=False)

    max_km = df_car.tail(1)['累计公里'].values[0]
    dist_col = int(max_km/loc_nums)
    if (loc_nums * 6) > max_km:
        if dist_col == 1:
            dist_col = 1.5
        print('公里数过小',max_km,loc_nums,dist_col)
        new_x = np.arange(0, x.max(),dist_col)
    else:
        new_x = np.arange(0, x.max(), 6)
        dist_col = 6
    # 使用插值函数计算新的Y轴数据
    new_y = interp_function(new_x)

    # 创建新的DataFrame以查看结果
    new_df = pd.DataFrame({'累计公里': new_x, '汽车(辆/日)': new_y})
    return new_df,dist_col
  1. 距离矩阵构建
def cal_dist(new_df):
    # 计算两两之间的距离
    num_points = len(new_df)
    dist_matrix = {}

    for i in range(num_points):
        for j in range(num_points):
            # 计算绝对差值
            dist = abs(new_df['累计公里'].iloc[i] - new_df['累计公里'].iloc[j])
            # 存储在字典中
            dist_matrix[(i, j)] = dist
    return dist_matrix
  1. 优化选址
from gurobipy import *
import numpy as np
import random

def gen_result(new_df,loc_nums,dist_matrix,dist_col):
    # 参数
    num_points = len(new_df)
    random.seed(0)
    np.random.seed(0)

    # 假设有预定义的距离矩阵 dist_matrix,
    num_people = new_df['汽车(辆/日)'].values

    # 创建模型
    m = Model("p-median Problem")
    m.setParam('MIPGap', 0.01)  # 设置1%的最优间隙
    m.setParam('MIPFocus', 2)  # 优先提高解的质量

    # 创建变量
    select = m.addVars(num_points, vtype=GRB.BINARY, name='Select') # X
    assign = m.addVars(num_points, num_points, vtype=GRB.BINARY, name='Assign') # Y

    # 添加约束
    m.addConstr((select.sum() == loc_nums), name='Num_limit')
    m.addConstrs((assign[i, j] <= select[j] for i in range(num_points) for j in range(num_points)), name='Assign_before_locate')
    m.addConstrs((assign.sum(i, '*') == 1 for i in range(num_points)), name='Unique_assign')

    # 设置目标
    m.setObjective(sum(num_people[i] * dist_matrix[i, j] * assign[i, j] for i in range(num_points) for j in range(num_points)), GRB.MINIMIZE)

    # 优化模型
    m.optimize()

    # 打印结果
    selected = [i for i in range(num_points) if select[i].X > 0.5]
    assigned = [(i, j) for i in range(num_points) for j in range(num_points) if assign[i, j].X > 0.5]
    print("\n选址间距(km) = "+str(dist_col)+" \nSelected positions ="+ str(selected))
    # print("Assigned relationships =", assigned)
    # print('Objective value = %g' % m.objVal)
    return dist_col,selected

运行结果
运行结果

标签:dist,样条,单纯形法,插值,car,公里,df,num,new
From: https://blog.csdn.net/qq_42492056/article/details/140349007

相关文章

  • 几何建模基础-样条曲线和样条曲面介绍
    1.概念介绍1.1样条曲线的来源样条的英语单词spline来源于可变形的样条工具,那是一种在造船和工程制图时用来画出光滑形状的工具:富有弹性的均匀细木条/金属条/有机玻璃条,它围绕着按指定位置放置的重物或者压铁做弹性弯曲,以获得所需要的曲线,如下图所示。在计算机科学的计算机辅......
  • 5034. 【NOI2017模拟3.28】B —— 矩阵树定理和拉格朗日插值的结合
    题目大意给你一棵\(n\)(\(n\le50\))个点的树,可以进行不超过\(k\)次操作,每次断掉一条边,再连上一条边,要求树一直是树,求一共有多少种树的形态。思路把题意转换为对于一个\(n\)个点的完全图,是树边的话权值是\(1\),否则是\(x\)。跑一遍矩阵树定理,矩阵树定理求的是一个图所有生......
  • 三次插值曲线--插值技术
    三次插值曲线1.1.三次样条曲线三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。1.1.1.数学定义给定一组点(P_0,P_1,…,P_n),其中(P_i=(x_i,y_i)),(x_0<......
  • 插值技术研究
    过采样与欠采样&图像重采样(上采样&下采样)研究图像插值技术:2016年苏州大学的钟宝江等人《图像插值技术综述》[1]图像插值利用图像已知采样点的灰度值估计未知采样点的灰度值,是图像数据的一种生成过程。图像插值的目的在于通过升采样的方式提高图像的分辨率。插值分类线性......
  • 线性插值出现负值
    在线性插值过程中出现负数可能有几种原因:数据不适合线性插值:线性插值是基于线性关系进行估算的方法。如果数据在插值区间内存在非线性或不光滑的变化,线性插值可能无法准确地反映数据的真实趋势,从而导致插值结果出现负数。插值区间外的外推:线性插值是通过已知数据点之间的线......
  • 对偶理论和对偶单纯形法——Python实现
    对偶单纯形法是从对偶可行性逐步搜索出原始问题最优解的方法。由线性规划问题的对偶理论,原始问题的检验数对应于对偶问题的一组基本可行解或最优解;原始问题的一组基本可行解或最优解对应于对偶问题的检验数;原始问题约束方程的系数矩阵的转置是对偶问题约束条件方程的系数矩阵。所......
  • 二维有限元,线性插值
    设置u=-(x*x+y*y),c=(x+y),可得f=6*(x+y),设置所有边界条件为dirichlet边界条件,其他条件应该也不复杂。boundaryedge矩阵是自己对着生成网格给出来的。感觉最难的地方就是在计算单元刚度矩阵的时候,因为使用了坐标变换,变成平面的标准三角形。(xi,yi),(xj,yj),(xm,ym)分别对应到(0,0),(1,0),(0,1)......
  • ZingChart绘制透明样条面积图
    代码案例,参考<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>ZingSoftDemo</title><scriptnonce="undefined"src="https://cdn.zingchart.com/zingchart.min.js"></scrip......
  • 单纯形法的平滑分析
    我们采用这样的形式来讨论线性规划:\(\maxc^\topx\)subjectto\(Ax\leqb\),其中\(x,c\in\R^n\),\(A\in\R^{m\timesn},b\in\R^m\)。其中\(P=\{x\midAx\leqb\}\)称为可行域,是\(\R^n\)中的多面体。求解线性规划问题的最常用算法就是单纯形法,它指出我们从\(P\)的一个顶点\(x_......
  • 学习笔记:FFT与拉格朗日插值
    多项式的表示形式系数表示与点值表示假设\(f(x)\)是一个\(n\)次多项式,则\(f(x)\)的系数表示为\(f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots+a_0\)\(f(x)\)的点值表示为\((x_0,f(x_0)),\(x_1,f(x_1)),\dots,(x_n,f(x_n))\),其中\(\foralli\neqj,\x_i......