灵感引用自王永等人研究论文:
以下是论文中通过软件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的软件中无法导出单向供水的数据,故此处也是一个难点。
此论文为本人学习过程的一个记录,希望在之后的学习过程中能在此代码基础上进行修正,若有侵权,请联系我立马删。