zoupaper的个人博客分享 http://blog.sciencenet.cn/u/zoupaper

博文

设计模式与现代C++ 连载(四)

已有 936 次阅读 2019-4-9 22:12 |系统分类:科研笔记

10 表驱动模式

表驱动法是我重点介绍的最后1个模式,这个模式并不属于23种经典的设计模式。但是它很重要,代表着一种极其有用的思维方式;另一方面,这种模式又极其简单,简单到不必要给出任何的示例代码。

早在2011年,我就在编程实践中思考过表驱动法,当时也给同事说过了,只不过当时不知道表驱动法这个名词。后来读《代码大全》这本书,才知晓早有人总结过。

下面举一个例子,写程序计算某个月的天数。可以写成这样:如果输入的1月,那么输出31;如果输入2月(暂时不考虑闰年的问题),那么输出28;以此类推。把所有的判断都用代码实现。

如果用表驱动法,那就很简单了,定义一个数组:31,28。保存12月的天数。输入数字,返回该下标的元素即可。定义的数组不一定写死在代码里面,也可以放到配置文件,GUI界面,或者数据库里面。如果我们遇到外星人,他们的历法是1年有13个月,那么很简单,改数组就好了,都不需要改程序代码,更不用重编程序了。

下面结合我的专业(电力系统),继续谈谈有发散性的想法。

今年清华大学孙宏斌老师的项目组拿了国家科技进步一等奖,他们的获奖项目就是AVC(自动电压控制)。我现在讲的AVC是另一家公司的产品。对于地区电网的AVC控制,最核心的部分就是复杂策略是怎么生成的。由于地区电网的量测质量等问题,不一定适合完全用优化算法去做,因此普遍性的做法是采取启发式的专家策略。

变电站AVC技术,就是在一张平面图上有横纵坐标(电压和无功),划分出9个区域,每个区域代表系统状态,每个状态都有各自的控制策略。但实际上,地区电网的分区要比单个的变电站还是要复杂一些的,要考虑到站与站之间的协调。因此,地区电网的AVC控制技术,有更复杂的策略。代码那是相当的长啊,但大体上都是这么个套路:判断系统(分区)当前是什么状态,然后执行相应的策略。

由于AVC控制的一切策略都在代码里实现,隔绝了用户的参与,对于用户来说,AVC这个东西就像一个黑盒子。虽然有说明文档,但黑盒子里面究竟有什么终究不清楚(连AVC厂家自己的人往往也不清楚,毕竟历史代码太多太冗余,缺少重构)。一方面,用户绝不缺少业务专家,更何况最终对电网控制负责的是用户,用户绝对会负责到底的;另一方面,只要黑盒子表现的过得去,不出现离谱的控制(比如把用户的负荷当成电容器给拉掉了),用户也很难提出针对性的改进意见。

理论上用户是对AVC策略最有发言权的,也必然要深度参与的(因地制宜,每个地方具体情况都不相同,策略需要有所调整)。但他们却被排除在外,AVC策略完全由厂家来负责。但厂家的开发人员,大部分从纯软件开发角度来工作,比如说做做维护界面、展示界面,真正懂核心策略的,也还是少数。一个覆盖了中国国土相当面积的重要的控制产品,其核心的控制策略居然是由凤毛麟角的人来编写和决定的。

如果控制策略采取了表驱动法,控制系统的逻辑策略可展示、可配置、可修正。那么,用户必然会深度参与,必然会快速的迭代改善产品。就算从知识产权保密的角度,不想开放给用户,对于厂家内部来说,其改进测试的速度也会快的多。最起码,项目组可以有更高比例的业务专家,而不必全都是写代码的。

下面是一些技术性的问题。一个是组合爆炸,表驱动法考虑的维度过多,自然有这样的问题。解决方法是把1张表变成多张表。对于电力系统,第一步是解决不安全的问题,例如电压越限;第二步是解决控制资源备用的问题;最后一步才是优化,减少网损的问题。每一步都有各自的重点,都有各自的表。不会搅合在一起出现爆炸。

另一个是防止有人搞破坏。因为策略可配置可修正,那么如果有人蓄意破坏或者工作失误了怎么办呢?其实可以设立安全校核程序,这部分不采用表驱动法,无论怎么控制,安全校核程序都可以保证控制后的局面比当前要好(大不了拒绝控制并发出告警,由调度员接管),如果发现用户配置的表不行,可以切换至默认的内置表。




http://blog.sciencenet.cn/blog-3316223-1172359.html

上一篇:设计模式与现代C++ 连载(三)
下一篇:颠覆性创新的特点与应对之道--读《创新者的窘境》

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

全部作者的精选博文

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2020-1-18 11:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部