Esempio n. 1
0
File: vnr.py Progetto: hunanhd/vns
 def eval1(cs):
     for i,r in enumerate(cs):
         vno.edges[i].r=r
     #解算网络
     cvno(vno)
     Q11=np.array([vno.edges[E_dict[x[0]]].q for x in TQ])
     Q22=np.array([x[1] for x in TQ])
     P11=np.array([vno.nodes[N_dict[x[0]]].p for x in TP])
     P22=np.array([x[1] for x in TP])
     a,b=0.5,0.5
     return a*np.log10(1+np.var(Q11-Q22))+b*np.log10(1+np.var(P11-P22))
Esempio n. 2
0
File: vnr.py Progetto: hunanhd/vns
def cvno_test():
    print("[vno模块]测试...")

    #初始化vno数据(测试用)
    vno = vno_data()
    initVNO(vno)
    #解算通风网络
    ret = cvno(vno)

    #打印解算结果
    if not ret:
        print("解算失败")
    else:
        #打印解算风量与测试风量的差值'
        #plot_Q(vno,Q1)
        #plot_P(vno,P1)
        #输出解算风量
        #PrintVN(vno)
        #计算风量灵敏度
        #edge_sst_test(vno)
        #lb=np.array(R)-0.01
        #ub=np.array(R)+1.5
        lb=np.array(R)*0.95
        ub=np.array(R)*1.05
        #lb=np.array(R)*0.9
        #ub=np.array(R)*1.1
        TQ=zip(E,Q1)
        TP=zip(N,P1)
        ec_test(vno,lb,ub,TQ,TP)
Esempio n. 3
0
def cvno_test():
    print("[vno模块]测试...")

    # 初始化vno数据(测试用)
    vno = vno_data()
    #initVNO(vno)
    #initVNO2(vno)
    #initVNO3(vno)
    initVNO4(vno)

    # 解算通风网络
    ret = cvno(vno)

    # 打印解算结果
    if not ret:
        print("解算失败")
    else:
        # 输出解算风量
        PrintVN(vno)
        # 计算风量灵敏度(2维数组,即数组的数组)
        Dq=edge_sst(vno,nCount=10,accuracy=0.01)
        print Dq
        # 计算压力灵敏度(2维数组,即数组的数组)
        Dp=node_sst(vno,nCount=50,accuracy=0.01)
        print Dp
Esempio n. 4
0
File: sst.py Progetto: hunanhd/vns
def __node_sst(vno, i, nCount=10, accuracy=0.0001, factor=0.45):
    # nodes和edges就是c++中的vector
    #节点的个数
    NE=vno.edges.size()
    #节点个数
    NN=vno.nodes.size()
    #第i条节点的原始风阻
    r0=vno.edges[i].r
    #记录第i条节点的风阻没有变化之前的所有节点压力
    P0=[vno.nodes[j].p for j in range(NN)]
    #记录第k次迭代时的所有节点压力
    Pk=[vno.nodes[j].p for j in range(NN)]
    #第i条节点风阻变化时,其它节点的压力灵敏度
    D=np.zeros(NN-1) #要去掉第一个节点(压力始终等于0)
    #记录迭代次数
    nIter=0
    #记录上次的风量误差和
    last_std=0
    #gen_seq1生成一个数列(收敛因子[w  w^2  w^3  w^4...])
    #注意:包含yield关键词的函数可以视为一个迭代器,可以使用for语句对迭代器进行迭代
    for w in gen_seq1(factor,nCount):
        #第i条节点的风阻变化(r=(1+w)*r)
        vno.edges[i].r=(1+w)*r0
        #print i,w,r0,(1+w)*r0
        #第i条节点风阻变化后,执行一次网络解算
        if cvno(vno):
            #用压力的收敛判定替代灵敏度的收敛判定(参见论文)
            f1=lambda pkk, pk, p0: pkk-(1-w)*p0-w*pk
            #(pk-p0)/dr --> (pk-p0)/(r0*w)
            f2=lambda pk, p0: (pk-p0)/(r0*w)
            #收敛性判定(计算两个数列的差值,然后求方差--平方和然后开根号)
            offset=[f1(vno.nodes[j].p, Pk[j], P0[j]) for j in range(NN)]
            #print i,w,'std',np.std(offset),offset
            if abs(np.std(offset)-last_std) < accuracy:
                #print i,w,[vno.nodes[j].p-P0[j] for j in range(NN)]
                #print i,'shoulian'
                D[:]=[f2(vno.nodes[j].p, P0[j]) for j in range(1,NN)]
                break
            else:
                nIter = nIter+1
                #记录上一次迭代的压力值
                Pk[:]=[vno.nodes[j].p for j in range(NN)]
                #记录上一次迭代的方差
                last_std = np.std(offset)
        else:
            #vno不收敛的情况应该非常少见
            #因为我们只是第i条分支的风阻发生了微小的变化dr(非常接近0)
            #print i,'vno error'
            D.fill(0)
            break
    #print 'iter:',nIter
    #if nIter == nCount:
        #print i,'reach max count'
    #恢复第i条节点的风阻
    vno.edges[i].r=r0
    return D
Esempio n. 5
0
File: sst.py Progetto: hunanhd/vns
def __edge_sst(vno, i, nCount=10, accuracy=0.0001, factor=0.45):
    # edges就是c++中的vector
    #分支的个数
    NE=vno.edges.size()
    #第i条分支的原始风阻
    r0=vno.edges[i].r
    #记录第i条分支的风阻没有变化之前的所有分支风量
    Q0=[vno.edges[j].q for j in range(NE)]
    #记录第k次迭代时的所有分支风量
    Qk=[vno.edges[j].q for j in range(NE)]
    #第i条分支风阻变化时,其它分支的风量灵敏度
    D=np.zeros(NE)
    #记录迭代次数
    nIter=0
    #记录上一次的偏差
    last_std=0
    #生成一个数列(收敛因子[w  w^2  w^3  w^4...])
    #注意:包含yield关键词的函数可以视为一个迭代器,可以使用for语句对迭代器进行迭代
    for w in gen_seq1(factor,nCount):
        #第i条分支的风阻变化(r=(1+w)*r)
        vno.edges[i].r=(1+w)*r0
        #print i,w,r0,(1+w)*r0
        #第i条分支风阻变化后,执行一次网络解算
        if cvno(vno):
            #用风量的收敛判定替代灵敏度的收敛判定(参见论文)
            f1=lambda qkk, qk, q0: qkk-((1-w)*q0+w*qk)
            #(qk-q0)/dr --> (qk-q0)/(r0*w)
            f2=lambda qk, q0: (qk-q0)/(r0*w)
            #收敛性判定(计算两个数列的差值,然后求方差--平方和然后开根号)
            offset=[f1(vno.edges[j].q, Qk[j], Q0[j]) for j in range(NE)]
            #print i,w,'std',np.std(offset)
            if abs(np.std(offset)-last_std) < accuracy:
                #print i,w,[vno.edges[j].q-Q0[j] for j in range(NE)]
                D[:]=[f2(vno.edges[j].q, Q0[j]) for j in range(NE)]
                break
            else:
                nIter = nIter+1
                #记录上一次迭代的风量值
                Qk[:]=[vno.edges[j].q for j in range(NE)]
                #记录上一次迭代的方差
                last_std=np.std(offset)
        else:
            D.fill(0)
            break
    #print 'iter:',nIter
    #if nIter == nCount:
        #print i,'reach max count'
    #恢复第i条分支的风阻
    vno.edges[i].r=r0
    return D
Esempio n. 6
0
File: test.py Progetto: hunanhd/vns
def cvno_test():
    print("[vno模块]测试...")

    # 初始化vno数据(测试用)
    vno = vno_data()
    #initVNO(vno)
    #initVNO2(vno)
    #initVNO3(vno)
    initVNO4(vno)

    # 解算通风网络
    ret = cvno(vno)

    # 打印解算结果
    if not ret:
        print("解算失败")
    else:
        # 输出解算风量
        PrintVN(vno)

        # 计算风量灵敏度(2维数组,即数组的数组)
        Dq=edge_sst(vno,nCount=10,accuracy=0.01)
        #print Dq
        np.savetxt('Dq.txt',Dq)
        #数据标准化(白化)
        whiten_Dq = whiten(np.abs(Dq))
        #print whiten_Dq
        np.savetxt('whiten_Dq.txt',whiten_Dq)
        #分类后计算聚类重心的索引位置
        print '------------fengliang-----------'
        for n in range(1,9):
            centroids=fca(whiten_Dq,n)
            print n,'-->',[vno.edges[i].id for i in centroids]

        # 计算压力灵敏度(2维数组,即数组的数组)
        Dp=node_sst(vno,nCount=50,accuracy=0.01)
        #print Dp
        np.savetxt('Dp.txt',Dp)
        whiten_Dp = whiten(np.abs(Dp))
        #print whiten_Dp
        np.savetxt('whiten_Dp.txt',whiten_Dp)
        #分类后计算聚类重心的索引位置
        print '--------yali--------------'
        for n in range(1,9):
            centroids=fca(whiten_Dp,n)
            #print centroids
            print n,'-->',[vno.nodes[i+1].id for i in centroids]
        #np.savetxt('centroids_Dq.txt',[vno.edges[i].id for i in centroids])

        #---------------------------------------#
        ZDq=sst(Dq)
        print ZDq
        np.savetxt('ZDq.txt',ZDq)
        #数据标准化(白化)
        whiten_ZDq = whiten(ZDq)
        #print whiten_ZDq
        np.savetxt('whiten_ZDq.txt',whiten_ZDq)
        print '--------whiten fengliang--------------'
        for n in range(1,9):
            centroids=fca(whiten_ZDq,n)
            print n,'-->',[vno.edges[i].id for i in centroids]

        #------------------
        ZDp=sst(Dp)
        np.savetxt('ZDp.txt',ZDp)
        #数据标准化(白化)
        whiten_ZDp = whiten(ZDp)
        print whiten_ZDp
        np.savetxt('whiten_ZDp.txt',whiten_ZDp)
        print '--------whiten yali--------------'
        for n in range(1,9):
            centroids=fca(whiten_ZDp,n)
            print centroids
            print n,'-->',[vno.nodes[i+1].id for i in centroids]