2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模

E题 校园供水系统智能管理

原题再现

  校园供水系统是校园公用设施的重要组成部分,学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展,校园内已经普遍使用了智能水表,从而可以获得大量的实时供水系统运行数据。后勤部门希望基于这些数据,通过数学建模和数据挖掘及时发现和解决供水系统中存在的问题,提高校园服务和管理水平。
  附件是某校区水表层级关系以及所有水表四个季度的读数(以一定时间为间隔,如15分钟)与相应的用水数据。请利用这些信息和数据,建立数学模型,讨论以下问题:

  1. 统计、分析各个水表数据的变化规律,并给出校园内不同功能区(宿舍、教学楼、办公楼、食堂等)的用水特征。
  2. 结合校区水表层级关系,建立水表数据之间的关系模型,并利用已有数据分析模型误差。
  3. 输水管网的漏损是一个严重问题。资料显示,在维护良好的公共供水网络中,平均失水在5%左右;而在比较老旧的管网中,失水则会更多。请利用附件提供的数据,建立数学模型,分析该校园供水管网的漏损情况。
  4. 地下水管暗漏不容易被发现,需要花费大量人力对供水管道的漏损进行检测及定位,如果能够从水表的实时数据及时发现并确定发生漏损的位置,将极为有益。请帮助学校解决这个问题。
  5. 管网维修需要一定的人工费和材料费,但同时可以降低管网漏损程度。请根据以上结果和你了解的水价及维修成本确定管网漏损的最优维修决策方案。

整体求解过程概述(摘要)

  智能水表的使用伴随着人工智能与科技的发展,变得越来越广泛,它的使用极大的方便了管理人员对用水情况的管理,它产生的数据也可以帮助其进行合理的数据估计,从而合理规划维修,本文基于某校园智能水表产生的数据,进行了挖掘和分析,具体如下:
  对问题一,首先借助Python中的pandas库对大规模、多种数据类型共存数据处理的优势进行数据的操作和处理,描述分析了宿舍、教学楼、办公楼、食堂的用水特征:
  对问题二,在问题一的基础上,首先利用水表层级关系附件,建立各级表的数据关系拓扑图,结合实际情况分析得出,一级水表中 401X、403X、405X 处的数据与二级水表相比误差率分别为 11%、11%、4%: 其他一级水表按照优质水表+0.5%-+3%:二级以上水表按照普通水表-5%-3%来标记误差;
  对于问题三,首先利用时间点左右各5个点对其本身进行样条插值平滑预测,利用预测值与原始值的差值估计漏损量,总漏损量为 32215,总漏损率为9.8%,该校园漏损率低于全国的平均漏损率,此外还分析评估了各水表漏损情况;
  对于问题四,根据上一问的估计结果,以 9.8%为闽值,漏损率超出闽值则标记一次漏损事故,结合各水表处的漏水量情况,按照漏损次数对水表进行漏损等级评定,得到40118T/40121T/40331T 等水表点的漏水可能性较高:
  对于问题五,通过查看相关文献资料,获得平均水价范围5.5元/吨-6.5元/吨,单次维修费用500元/次-1500元/次,建立了每天是否维修的0-1规划模型,并取平均水价6元/吨以及单次维修成本均价1000元/次分析维修次数、损失金额与水价和维修成本的关系,最终的漏水维修33 次,总损失金额为 174630 元。
  本文由数据驱动,建立模型挖掘校园用水的特性,对于供热网、高速路网等问题都具有良好的推广应用价值。

模型假设:

  1.假设一级水表采用测量精度较高的电磁水表:
  2.假设二级至四级采用均已广泛使用机械速度式水表,并有 2%-5%的相对误差
  3.无人蓄意破坏供水管道:
  4.各水表工作在理想状态下,不受强磁等外界因素干扰;
  5.水质良好,无明显杂质,不对机械速度式水表产生过大影响:

问题分析:

  问题一分析
  问题需要根据已有季度用水表(附件)、水表层次(附件)的数据分析宿舍、教学楼、办公楼、食堂的用水情况特性。为此需要有以下几个分析步骤。
  1. 对数据进行描述性统计,获得缺失值、异常值,以及校园用水的总体特征。
  2. 需要对数据进行缺失值、异常值的处理,并对水表进行功能区划分,建立用水情况的水表层级关系表。
  3. 对宿舍功能区、教学楼功能区、办公楼功能区、食堂功能区进行用水分析。

  问题二分析
  问题需要根据附件中提供的水表层级关系,建立不同层级间水表的关系模型,利用已知数据分析模型误差。
  水表的合理使用:
  由资料可知电磁水表的误差率较小,而机械速度式水表可检测的最小水流量与管道直径成正比,在直径较大的骨干管道中,采用机械速度式水表难以检测弱水流,误差较大,因此:
  1一级水表采用精度更高的电磁水表;
  2二级至四级均采用已广泛使用的机械速度式水表,
  我们采用拓扑图将水表间的层级关系可视化;
  计算上级水表表显读数和下属水表表显读数之和的差值,将误差分为三类;一级水表误差按电磁水表统计, 二级至四级水表按照机械速度式水表统计,二级水表按照实际误差来计算,利用其表显数据与一级表数据做差得出误差;

  问题三分析
  问题需要根据各级水表的显示数据分析出校园水网的具体漏损情况,文献2采用时间序列神经网络 (NAR神经网络) 的预测方法,基于当前各水表读数时间序列,对每个读数进行预测,表显读数与预测值波动超过一定闯值的则视为该时刻发生漏水,为解决本问题提供了思路,但是根据附件的数据,各水表的年用水情况各不相同,如若进行时间序列分析,需分水表、分时间段进行稳定性、白噪声以及参数预置的讨论,所有情况过于繁琐复杂,本问题并不合适。
  有鉴于此,我们参考其预测方法,对时间序列 t 时刻的值进行样条插值平滑预测,从而进行漏损估计,具体的步骤如下:
  1.首先对数据进行预处理工作。对一级水表按照超过一定误差的阙值的异常数据进行置均值的平滑处理:
  2.其次对一级水表的时间序列数据进行样条插值平滑预测:
  3.利用表显数据与预测值之差进行漏损量的估计.

  问题四分析
  问题需要从水表的实时数据中发现供水管网的漏损位置:
我们基于问题三的样条插值平滑预测模型:
  1.对二级水表及下属水表进行漏损偏差统计:
  2.计算漏损率
                漏损率=(原始值-预测值)/预测值
  3.对漏损率超过总体漏损率的时间点和地点判定其发生漏损现象,根据偏差统计划分风险等级,给出供水管网中,可能出现漏损的位置及概率。

  问题五分析
  问题五需要根据查询资料,结合前面所得到的漏水数据,做出最佳维修策略,为此应首先查阅国家相关水务数据 3,劳务数据以及材料费用数据 4,从而确定水价范围和单次维修价格的范围。以总损失金额最小作为规则目标函数,以每天是否维修作为决策变量,建立 0-1 规划模型,从而得到维修决策。

模型的建立与求解整体论文缩略图

在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

import pandas as pd
shuju1=pd.read_excel('一季度.xlsx')
shuju2=pd.read_excel('二季度.xlsx')
shuju3=pd.read_excel('三季度.xlsx')
shuju4=pd.read_excel('四季度.xlsx')
print(shuju1)

#==查看一季度的统计描述:====
#可以得到一季度的最大值、最小值、平均值等信息
print(shuju1.describe())

#==为了快速浏览数据集,我们使用dataframe.info()功能===
print(shuju1.info())

#===查看缺失值======
print(shuju1.isnull().sum())

'''2 读取水表层:'''
shui_biao = pd.read_excel("水表层级.xlsx")
print(shui_biao)

#查看水表有哪些不同类型:
print(shui_biao['水表名'].unique())

#查看四个季度水表名数量:
print(len(shuju1['水表名'].unique()))
print(len(shuju2['水表名'].unique()))
print(len(shuju3['水表名'].unique()))
print(len(shuju4['水表名'].unique()))

#给数据表添加上具体季度更方便观察:
import numpy as np
# 合并数据
shuju1['季度'] = pd.Series(["一季度" for i in range(len(shuju1.index))])
shuju2['季度'] = pd.Series(["二季度" for i in range(len(shuju2.index))])
shuju3['季度'] = pd.Series(["三季度" for i in range(len(shuju3.index))])
shuju4['季度'] = pd.Series(["四季度" for i in range(len(shuju4.index))])
print(shuju1)

#添加合并:
shuju = shuju1.append([shuju2,shuju3,shuju4],ignore_index=True) # 添加合并
print(shuju)

#再查看表数量:
print(len(shuju['水表名'].unique()))
print(len(shui_biao['水表名'].unique()))

'''3 按照水表名分类,统计总用量'''
use_water = shuju.groupby(by='水表名')['用量'].sum() # 按照水表名分类,统计总用量
print(use_water)

#从高到低排序下:
use_water.sort_values(ascending=False)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
#mpl.rcParams['font.sans-serif'] = ['Times New Roman'] #Times New Roman字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
import matplotlib; matplotlib.use('TkAgg')
#====根据使用绘制直方图:=====
use_water.plot.hist(histtype='bar', rwidth=0.5)
plt.savefig('可视化/0.1.png', dpi=300, bbox_inches="tight")
plt.show()

'''4 对这些功能区的类型进行分析:'''

# 全部水表

list_table_name = list(shuju['水表名'].unique())  #合并后的数据

'''4.1 功能区分类'''

#======4.1.1 找到所有宿舍的水表==========
list_home = []  #宿舍
list_teaching_build = []  #教学楼
list_teacher_build = []  #活动地方
for name in list_table_name.copy():
    if name.find("学生宿舍") != -1 or name.find("留学生楼") != -1:
        list_home.append(name)
        list_table_name.remove(name)
print(list_home)

#=======4.1.2 同理,找到教学楼=========
for name in list_table_name.copy():
    if name.find("XX") != -1 and name.find("楼") != -1:
        print(name)
        list_teaching_build.append(name)
        list_table_name.remove(name)
print(list_teaching_build)

#======4.1.3 农业区=================
list_agritural = []
for name in list_table_name.copy():
    if name.find("养殖") != -1 or name.find("养鱼") != -1 or name.find("大棚")!=-1 or name.find("花")!=-1:
        list_agritural.append(name)
        list_table_name.remove(name)
print(list_agritural)

#=======4.1.4 后勤===============
for name in list_table_name.copy():
    if name.find("楼")!= -1:
        list_teaching_build.append(name)
        list_table_name.remove(name)
print(list_table_name)

#========类型添加上去·:================

list_backup = list_table_name
name_list = shuju['水表名'].tolist()  #.tolist:将数组转化为列表
type_list = []
for name in name_list:
    if name in list_backup:
        type_list.append("后勤")
    elif name in list_agritural:
        type_list.append("农业")
    elif name in list_home:
        type_list.append('宿舍')
    elif name in list_teaching_build:
        type_list.append("活动地方")
    else:
        type_list.append('教学楼')

shuju['类型'] = pd.Series(type_list)
print(shuju)

'''4.2 不同类型的用量:'''
type_sum = shuju.groupby(by='类型')['用量'].sum()
print(type_sum)

#===对不同类型可视化:=====

type_sum.plot.barh(alpha=0.7)
df_group_two = shuju.groupby(by=['类型'])
i = 0
colors=['r','g','b','m','c']
plt.figure(figsize=(35, 35), dpi=100)
for types ,group in df_group_two:
    i += 1
    plt.subplot(3,2,i)
    group.groupby(by='水表名').sum()["用量"].plot.barh(title=types,color=colors[i-1],alpha=.5)
plt.savefig('可视化/1不同类型可视化.png', dpi=300, bbox_inches="tight")
plt.show()

#分析完把合并后的数据保存起来:
shuju.to_csv('data1.txt',index=False)  #data1.csv容易数据缺失,所以考虑txt
#shuju.to_xlsx('total.xlsx',index=False)

#按照时间聚合:
shuju['timeStamp'] = pd.to_datetime(shuju['采集时间'])
shuju.set_index("timeStamp", inplace=True)
data_quarter = shuju.resample("Q")  # 时间聚合采样。.resample:重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。


'''4.3 接下来分析每个季度、月份、天数、24小时变化:'''

#===4.3.1 季度变化规律:===================
data_quarter.sum()["用量"].plot.line(style="m>-.",alpha=0.5,title="用水量随着季度变化趋势")  #Q:季度
plt.savefig('可视化/0.2用水量随着季度变化趋势.png', dpi=300, bbox_inches="tight")
plt.show()

#===4.3.2 月份变化规律:===================
data_month = shuju.resample('M').sum()["用量"].plot.line(style="c*-.",alpha=0.5,title="用水量随着月份变化趋势")  #M:月份
plt.savefig('可视化/0.3用水量随着月份变化趋势.png', dpi=300, bbox_inches="tight")
plt.show()

'''添加具体时间:'''
shuju['hour'] = pd.to_datetime(shuju['采集时间']).dt.hour
shuju['day'] = pd.to_datetime(shuju['采集时间']).dt.day
print(shuju)

#====4.3.3 用水量一天随着小时变化规律:=============
shuju.groupby(by='hour').sum()['用量'].plot.line(style="gh-.",alpha=0.5,title="用水量随着时间变化趋势")
plt.grid()
plt.savefig('可视化/0.4用水量一天随着小时变化规律.png', dpi=300, bbox_inches="tight")
plt.show()

#=====4.3.4 一个月内用水量随着天数变化:=======
shuju.groupby(by='day').sum()['用量'].plot.line(style="rd-.",alpha=0.5,title="用水量随着天变化趋势")
plt.grid()
plt.savefig('可视化/0.5一个月内用水量随着天数变化.png', dpi=300, bbox_inches="tight")
plt.show()

'''4.4 不同区域的特征:'''
# 不同区域用水特征

#=======4.4.1 不同区域随着季度用水变化=======================
i = 0
styles=['*-.','-.','1-.','2-.','3-.']
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='类型'):
    i += 1
    plt.subplot(3,2,i)
    group.resample("Q").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量随着季度变化趋势".format(index))  #四个季度
plt.savefig('可视化/2 不同区域随着季度用水变化.png', dpi=300, bbox_inches="tight")
plt.show()


#======4.4.2 不同区域随着月份用水变化===============
i = 0
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='类型'):
    i += 1
    plt.subplot(3,2,i)
    group.resample("M").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量随着月份变化趋势".format(index))
plt.savefig('可视化/3不同区域随月份变化.png', dpi=300, bbox_inches="tight")
plt.show()

#=====4.4.3 不同区域随着每月的天数用水变化==============
i = 0
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='类型'):
    i += 1
    plt.subplot(3,2,i)
    group.groupby(by='day').sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量随着天数变化趋势".format(index))
    plt.grid()
plt.savefig('可视化/4不同区域随着每月的天数用水变化.png', dpi=300, bbox_inches="tight")
plt.show()

#=====4.4.4 不同区域随着每天的时辰用水变化==============
i = 0

plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='类型'):
    i += 1
    plt.subplot(3,2,i)
    group.groupby(by='hour').sum()['用量'].plot.line(style="r*-.",alpha=0.5,title="{}用水量随着时辰变化趋势".format(index))
    plt.grid()
plt.savefig('5.png', dpi=300, bbox_inches="tight")
plt.show()
#分析完毕~把数据保存起来:
shuju.to_csv('data2.txt',index=False)    #data2.csv容易装不下数据,照成数据缺失
#shuju.to_xlsx('all.xlsx',index=False)
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA |日常开发中连接Sqlite数据库详解

JAVA |日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…

图像超分辨率技术新进展:混合注意力聚合变换器HAAT

目录 1. 引言: 2. 混合注意力聚合变换器(HAAT): 2.1 Swin-Dense-Residual-Connected Block(SDRCB): 2.2 Hybrid Grid Attention Block(HGAB): 3. 实验结…

【Appium】AttributeError: ‘NoneType‘ object has no attribute ‘to_capabilities‘

目录 1、报错内容 2、解决方案 (1)检查 (2)报错原因 (3)解决步骤 3、解决结果 1、报错内容 在PyCharm编写好脚本后,模拟器和appium也是连接成功的,但是运行脚本时报错&…

1.1 Beginner Level学习之“创建 ROS msg 和 srv”(第十节)

学习大纲: 1. msg 和 srv msg 文件是描述 ROS 消息字段的简单文本文件。它们用于为不同语言生成消息的源代码。srv 文件则描述了一个服务,包括两部分:请求和响应。Srv 文件用于生成服务的源代码。msg 文件存储在包的 msg 目录中。srv 文件存…

Android仿美团左右联动购物列表

Android仿美团左右联动购物列表 左右联动购物列表,不难。 一、思路: 两个RecycleView 二、效果图: 三、关键代码: public class MainActivity extends AppCompatActivity {private RecyclerView rl_left;private RecyclerVie…

微信小程序 运行出错 弹出提示框(获取token失败,请重试 或者 请求失败)

原因是:需要登陆微信公众平台在开发管理 中设置 相应的 服务器域名 中的 request合法域名 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: true, // 默认为网格布局page: 0, // 当前页码size: 10, // 每页大小hasMore…

室联人形机器人:家政服务任务结构化、技术要点、深入应用FPGA的控制系统框架设计(整合版)

目录: 0 引言 1 人形机器人对室内家政服务任务的结构化 1.1人形机器人在室内家政服务中的比较优势 1.1.1 人形机器人拟人性的7个维度 1.1.2 拟人性在室内家政服务工作中的比较优势 1.1.3 潜在的重要用户:宠物爱好者 1.2 居所室内环境的特征与结构…

【YOLO部署Android安卓手机APP】YOLOv11部署到安卓实时目标检测识别——以火焰烟雾目标检测识别举例(可自定义更换其他目标)

前言:本项目基于YOLOv11部署到手机APP实现对火焰烟雾的检测识别,当然,以此你可以按照本项目开发步骤扩展更换为其他目标进行检测,例如更换为车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物等等部署手机APP进行检测。本文为详细设计/…

python 执行celery

1、redis安装并启动redis安装与使用-CSDN博客 2、安装 celery 、eventlet 3. Task handler raised error: ValueError(not enough values to unpack (expected 3, got 0)) - Redskaber - 博客园 pip install celery pip install eventlet 3、python 版本3.10 #创建异步任…

未完成_RFdiffusion应用案例_从头设计pMHC的结合剂

目录 1. 论文导读1)摘要2)设计流程3)设计流程的验证 2. 实战 1. 论文导读 Liu, Bingxu, et al. “Design of high specificity binders for peptide-MHC-I complexes.” bioRxiv (2024): 2024-11. 1)摘要 MHC-I 将胞内抗原肽递呈…

【css】基础(一)

本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:css专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &a…

【Python高级语法与正则表达式】

目录 1.正则表达式 1.1概述: 1.2re模块介绍 1.3re模块相关方法(常用): 1.4案例 1.5正则表达式详解 1.5.1查什么 1.5.2查多少 1.5.3 从哪查 1.6重要概念 1.6.1子表达式 1.7 正则表达式的其他方法 1.7.1选择匹配符 1.7.2…

Vue03

目录 一、今日目标 1.生命周期 2.综合案例-小黑记账清单 3.工程化开发入门 4.综合案例-小兔仙首页 二、Vue生命周期 三、Vue生命周期钩子 四、生命周期钩子小案例 1.在created中发送数据 六、工程化开发模式和脚手架 1.开发Vue的两种方式 2.Vue CLI脚手架 基本介绍…

云轴科技ZStack出席中国电信国际EMCP平台香港发布会,持续推动海外合作

近日,以“云聚未来 翼起新篇”为主题的中国电信国际多云服务一站式平台(E-surfing Managed Cloud Platform,简称EMCP平台)新闻发布会在香港成功举办,标志着中国电信国际在云计算服务领域取得了又一重大进展。云轴科技…

Alibaba Druid(简称Druid)

目录 核心功能 数据源配置与管理: 高性能与可扩展性: 监控与SQL解析: 安全性: 应用场景 使用方式 配置示例 通过yaml方式配置 web.xml中配置 访问Druid的监控页面 监控页面展示 Alibaba Druid(简称Druid&am…

JavaWeb学习--cookie和session

目录 (一)Cookie概述 1.什么叫Cookie 2.Cookie规范 3.Cookie的覆盖 4.cookie的最大存活时间 ​​​​​​(Cookie的生命) (二) Cookie的API 1.创建Cookie:new 构造方法 2.保存到客户端浏…

策略模式实战 - 猜拳游戏

**可以整体的替换一套算法,这就是策略模式。**这样对于同一个问题,可以有多种解决方案——算法实现的时候,可以通过策略模式来非常方便的进行算法的整体替换,而各种算法是独立封装好的,不用修改其内部逻辑。 具体的实…

Transformer简述和实现

Transformer 1、概述 (一)、诞生 自从2017年此文《Attention is All You Need》提出来Transformer后,便开启了大规模预训练的新时代,也在历史的长河中一举催生出了GPT、BERT这样的里程碑模型。 (二)、优势 相比之前占领市场的LSTM和GRU模型&#xf…

Astro 5.0 发布

Astro 5.0 发布! 使用 Astro Content Layer 可以从任何来源加载内容,并使用 Server Islands 将缓存的静态内容与动态个性化内容结合起来。 什么是 Astro Astro 是用于构建内容驱动网站(包括博客、营销和电子商务)的 Web 框架。…

数据结构与算法-03链表-04

链表与递归 在链表操作中移除、反转经常会用到递归实现。通过力扣案例理解链表常规操作中的递归实现。 移除数据 删除链表的节点 问题 LCR 136. 删除链表的节点 - 力扣(LeetCode) 问题描述 给定单向链表的头指针和一个要删除的节点的值,定…