何枫 刘闵 杨凤年 何文德
摘要:为了减少电气工程师在复杂用电环境下的多台变压器之间负荷分配的计算工作量,本文采用Python语言,运用背包算法,开发了Windows操作系统环境下用于多台变压器负荷分配的计算程序,输入参数和输出结果均采用Excel表格,将以往烦琐的人工重复计算工作实现由计算机辅助完成,为多台变压器的负荷分配计算提供了新的思路和便捷方法。
关键词:背包算法;Python;变压器;负荷分配
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2021)28-0117-03
开放科学(资源服务)标识码(OSID):
目前,在电气工程项目中,对于将若干个负荷平均分配到多台变压器上这样的计算问题,大多都是以Excel表格为基础,首先利用人工进行负荷的初步分配,然后再来通过不断地人工调整和优化,以便达到最佳分配效果。然而,在负荷数量较少时,上述方法尚不太影响工作效率,若负荷数量在四十个以上时,通常需耗时半天以上,效率不高且劳神费力,且很难达到理想效果,越来越难以适应复杂用电环境的设计要求,若遇到极端情况,甚至可能无法得到变压器容量和补偿功率相对一致的结果,因此,利用计算机实现多台变压器负荷分配的辅助计算,把工程师从烦琐复杂的重复计算工作中解放出来已是当务之急。
本文采用Python编程语言,运用背包算法,设计实现了Windows环境下的变压器负荷分配的计算机辅助计算应用程序,输入参数用Excel文件导入,输出结果用Excel文件导出,将以往繁重的人工计算工作交由计算机自动完成,大大提高了工作效率。
1变压器计算的主要影响因素
为确保变压器能支撑负荷运转,不至于因电流过大导致过热损毁,变压器运行时的视在功率S通常要小于其容量的85%。设S的复数量为[S],虚数单位为j,那么:
[S=Sc.+?PT+j??QT] (1)
其中[?P]为有功损耗,[?Q]为无功损耗,[Sc.]为变压器的计算负荷。若变压器挂载了n个负荷,那么变压器的计算负荷[Sc.]为:
[Sc.=i=1nPi+j?(i=1nQi+?Qc)] (2)
其中[Pi]和[Qi]分别为各负荷的有功功率和无功功率,[?Qc]为该变压器无功补偿的容量。又当变压器负载小于等于额定负载的85%时,其功率损耗如下[1]:
[?PT=0.01Sc] (3)
[?QT=0.05Sc] (4)
另設变压器负载的功率因数角为[θ],即[Sc.=(cosθ+j?sinθ)Sc],那么有:
[S=[cosθ+0.01+j?(sinθ+0.05)]Sc] (5)
在实际应用中,往往会调整无功补偿容量[?Qc]的大小,以使变压器的功率因数在0.95左右;另外由于设备限制,无功补偿容量值只能在有限的几个整数中选择,若补偿稍多,即使是功率因数达到了0.97,其对视在功率也只比0.95时差了2.1%,对整体影响较小,完全可以忽略轻微的过、欠补偿带来的影响,因此可以认定:[cosθ≈0.95],这表示[Sc.]的实部和其模的比值就是[cosθ],即:
[Re(Sc.)Sc=i=1nPiSc≈cosθ] (6)
结合之前[S]与[Sc]的关系式,得到:
[S≈β?i=1nPi] (7)
其中:
[β=cosθ+0.01+j?(sinθ+0.05)cosθ] (8)
而[β]是一个常数,由此得出:变压器的视在功率与其所带负荷的有功功率之和基本成正比;即如果需要控制变压器的视在功率,只需控制其所带负荷的有功功率[1]。
2背包算法
2.1背包问题简介
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,如何选择,才能使得物品的总价格最高。对于最基本的情况,可以将背包问题叙述如下:
有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大[2]。
2.2背包算法与变压器负荷分配计算的关系
如果要将背包算法应用于变压器负荷分配计算,只需将变压器的参数转化为背包问题的参数。即将若干负荷分成两组,使这两组的负荷对各自变压器产生的视在功率基本相同。即找到一种选取方法,在所有负荷中选出一些负荷,使它们的有功功率之和,尽可能地接近总有功功率之和的一半,这样就能将所有负荷均衡分配到两台相同的变压器上。
因此,可将变压器的参数转化为背包问题的参数:
1)将所有负荷的有功功率之和的一半作为背包大小;
2)将每个负荷视为背包的物品;
3)将负荷的有功功率同时视为背包物品价值和重量。
此外,参数转化过程中变压器负荷应进行参数取整和倍数调整。
3计算能力的限制与程序算法流程
将背包算法理论应用到变压器负荷分配计算,还应当考虑计算能力的限制、变压器计算要求的限制。
3.1背包算法的选择
背包算法中,设物品个数为n,背包容量为W。那么,进行一次背包计算,或者说得到一个抓取结果,大致需要[(n+1)?W]次加减计算,且利用背包算法得到的解,基本都不是所有可能解中的最优解。如果物品数量少,用枚举法就能很快得到最优解。但是,枚举法的计算量会随着物品个数增加呈指数级增长;而背包算法的计算量和物品数成线性关系。因此,在物品数较大的时候应选择背包算法,数量小的时候使用枚举法更合适。根据工程经验,两台800~1250KVA变压器的负荷分配使用背包算法计算的负荷数量临界值约为20。
3.2计算精度的取舍
背包算法的计算量大约是每次[(n+1)?W]次加减计算,而计算时应先将变压器负荷值取整。然而取整涉及计算量,因为增加一位取整时的有效数字,那么计算量会增大10倍;有效数字取得太少,计算精度就会下降。就现有的主流个人计算机的计算能力下,背包重量取四位有效数字是尚可。注意,若背包重量的有效数字变化,物品重量也应进行相应的调整,否则计算会出错。
3.3通过随机物品序列产生不同结果
初步测试发现,在处理了应合并的负荷后,经过单次背包计算无法得出令人满意的结果。因为在变压器负荷分配时,除了变压器视在功率,还有变压器的无功补偿容量要考虑[3],而背包算法只能控制视在功率,这样就造成算出的结果不一定满足无功补偿容量的要求。
进一步测试发现,背包算法的结果,还与其物品的排列序列有关,因为背包算法是按顺序对物品进行计算。如果需要得到令人满意的结果,可以通过生成随机序列的方法改变物品排列序列,让背包算法产生多个结果,然后对这些结果进行比较,最终选择一个最符合要求的结果。
3.4程序流程
应用程序采用控制台输入命令启动,初始数据输入和结果的输出都通过Excel文件实现,程序流程图(枚举法的计算流程省略)如图1所示。从Excel文件导入初始数据后,首先对负荷进行分类,要求分配在同一变压器的负荷要合并成一个,然后求出负荷个数的总和、总有功功率和总无功补偿容量,若负荷个数小于等于临界值20,使用枚举法计算;若负荷个数大于临界值20,使用背包算法计算。生成随机负荷序列用于背包计算的物品抓取,完成一轮抓取后求出本次背包中的无功补偿容量,然后判断该值是否符合设计要求,符合则计算完成;不符合进入下一轮,这时,首先看刚得出的无功补偿容量比之前保存的值更好吗?若更好则用新值替换旧值。程序进入重新生成随机负荷序列模块,开始新一轮的计算,如此循环往复,直到无功补偿容量值符合设计要求,或计算次数已达到最大阈值,程序才会停止执行。
4應用实例
应用程序采用Python语言开发,可以从excel表格获取输入数据,将数据整理归类并计算后再用excel表格输出计算结果,可根据实际的负荷数量选择使用枚举法或者背包算法。程序的临界数量值为19,最大背包计算次数为1000次,当两组变压器容量与无功补偿容量分别相等时,会终止计算并输出结果。
4.1测试项目概况
选用某住宅小区项目做测试。该小区有2有个专用配电房,1#配电房共有65个出线回路,总有效计算负荷为1324kW;2#配电房共有54个出线回路,总有效计算负荷为1297kW。
将程序运行2次即可得到2个配电房的计算结果。测试电脑CPU型号为i7-9700k,内存为8GB。
4.2运行结果
1#、2#配电房测试计算分别用时2.1秒和4.3秒,测试结果符合设计要求,与人工计算结果高度接近。以下为1#配电房测试结果如图1和图3所示。
5结语
随着信息技术的飞速发展,很多复杂的工程计算都可以用计算机辅助完成。采用Python语言、利用背包算法设计实现的变压器负荷分配计算应用程序,不仅可以对两台容量相同的变压器进行负荷分配,而且可通过给出合适的背包容量,并添加适当的限制条件,还能对两台容量不同的变压器,或者多台变压器进行负荷分配,可以大大节省设计时间,目前已处于试用阶段,并在持续完善和优化中。试用结果表明,该软件使用方便,性能较稳定,有较大的推广应用价值。
参考文献:
[1] 邱关源. 电路[M]. 北京:高等教育出版社,2006.
[2] 谢绍华. 背包问题(上)——算法分析[J]. 中文信息:程序春秋,2002,(8):25-26.
[3] 中国航空规划设计研究总院有限公司.工业与民用供配电设计手册(第四版)[M].北京:中国电力出版社,2016.
【通联编辑:李雅琪】