赞
踩
灵感引用自王永等人研究论文:
以下是论文中通过软件EPANET导出的其节点数据和管段数据:
以下是论文代码:
- Public sub demand()
- const totalq As Double =2812.16 '2812.16为总流量
- const nodei AS Integer =6
- const nodej AS Integer =1292
- const pipei AS Integer =1304
- const pipej AS Integer =2167 '节点和管段的范围
-
- Dim i, j As Integer
- Dim sumq,suml As Double
- Dim strNode As String
- Dim strNode1,strNode2 As String
- sumq=0
- suml=0
-
- For i=nodei to nodej
- sumq=sumq+Cells(i,3)
- Next i
- ' 计算节点的集中流量demand
- ' Cells(m,n) 表示第m行第n列的数据
- For j=pipei To pipej
- suml=suml+Cells(j,4)
- Next j
- ' 计算管段的总长度length
- For i=nodei To nodej
- '对节点进行流量分配
- strNode = Cells(i,1) '节点ID
- strNode = Trim(strNode) '去除头部和尾部空格
- For j =pipei To pipej
- strNode1 = Cells(j,2)'管段连接的头结点
- strNode2 = Cells(j,3)'管段连接的尾结点
- strNode1 = Trim(strNode1)
- strNode2 = Trim(strNode2)
- If strNode =strNode1 or strNode=strNode2
- Then Cells(i,3)=Cells(i,3)+(totalq-sumq)*Cells(j,4)/suml/2
- '比流量=(总流量-集中流量)/总长度 即(totalq-sumq)/suml
- '需要的流量=比流量*配水长度/2 即sumq/2
- End If
- Next j
- Next i
- End Sub

代码分析:
时间复杂度为:O(m+n+m*n),即O(n^2)
空间复杂度为:O(1)
其实代码内核很简单,就是通过遍历节点流量和管段长度,来计算比流量,最后通过计算比流量和配水长度来计算各节点的节点流量。
代码是在EXCEL中调用VBA宏来实现。
本人在论文源代码的基础上进行了注释说明,同时进行了两处修改:
① 把原先for循环的起始点和终止点改为了常量,这样便于维护;
② 同时此代码还有一个问题,那就是不能判断配水长度,即 第34行代码suml/2 中默认管网全部为双向配水,个人认为可以在之后在双循环内部添加一个判断语句,即判断是否是单向供水,若是,则在原有基础上减去即可一份比流量即可,但是在EPANET的软件中无法导出单向供水的数据,故此处也是一个难点。
此论文为本人学习过程的一个记录,希望在之后的学习过程中能在此代码基础上进行修正,若有侵权,请联系我立马删。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。