正则表达式在优化计算中的应用正则表达式在优化计算中的应用
在编写优化算法软件时,用户输入的表达式通常是字符串类型,如何实现用户与计算机的交互,即怎样让计算机
读懂用户输入的字符串类型的数学表达式,是计算机优化计算所要面临的首要问题。在VS中调用DEELX正则语言
库,采用匹配、替换的方法实现对用户输入函数表达式的判别、计算,并在实现计算表达式的基础上计算表达式
导数和求解极值。
摘摘 要:要: 在编写优化算法
关键词:关键词:
传统的优化程序一般都是针对某个具体的待优化问题进行编写的,缺乏通用性,用户还需要花费一段时间来学习如何使用
软件。优化软件若具有良好的交互性,用户只需要输入目标函数、约束条件、自变量、初始点就可以求得最优解和此时的函数
值。要实现对用户输入问题的求解,首先面对的问题就是如何让计算机读懂用户所输入的待求解问题。由于用户所输入的目标
函数、约束条件、自变量都是字符串类型的,所以要通过对字符串进行处理来实现计算机对函数表达式的理解。而正则表达式
通常用检索和替换那些符合某个模式的文本内容,本文采用正则表达式进行字符串的匹配、替换来实现计算机对用户输入表达
式的读入[1-2]。
1 优化程序结构优化程序结构
用户通过一个问题输入对话框与计算机进行交互,在对话框中用户需要输入待优化问题的目标函数,约束条件,计算精度
等参数,点击求解按钮进行运算。若用户有非法输入则提示用户重新输入,如果求解失败则弹出求解失败对话框。例如用户需
要求解问题min f (t,s)=0.5t2+s2/4,s.t ts=1,则需要在目标函数栏输入0.5*t^2+s^2/4,在约束条件栏输入t*s-1=0。
程序主要由COptimize、CFunctionCaluclate、CNumericalCaluclate三个类构成。CFunctionCaluclate用于实现对用户输入
表达式的校验,将表达式中的变量替换为数值并计算结果,获取表达式在指定点的一、二阶导数等功能。
CNumericalCalculation用于实现对替换后只包含数字项的表达式进行基础运算,包括基本的四则运算以及幂函数运算。
COptimize通过实例化CFunctionCaluclate,在实现表达式求值、求导的基础上完成对用户输入函数的求解极值。在交互界面
上,用户需要输入函数表达式,以及表达式中所包含的变量和变量的初始值大小。程序的对象模型如图1所示。
2 正则表达式运用于函数表达式的计算正则表达式运用于函数表达式的计算
正则表达式在很多文本编辑器或其他工具里,用来检索和替换符合某个模式的文本内容,目前许多程序设计语言都支持利用
正则表达式进行字符串操作[3]。由于用户输入的目标函数和约束条件都是字符串类型的,所以正则表达式可以应用于函数表
达式的计算。
DEELX 是一个在C++环境下的正则表达式引擎[4],全部采用模板 template 编写,可将 DEELX 用于char、 wchar_t 以及其
他基类型,比如unsigned char、int等。但只能是简单数据类型,不可以是 struct 或者 union 等复合类型。DEELX全部代码位
于一个头文件(deelx.h)中,使用时只需要简单地添加一个 #include"deelx.h"就可以了。
在本文中,采用匹配、替换的方法实现对用户输入函数表达式的判别、计算。首先,用给定初始点的值对自变量进行替
换,将函数表达式变为只含有数字项的数学表达式,再通过正则语言的匹配将数学表达式划分为各个子运算块,然后将计算结
果代替原表达式中的子运算块,如此循环,直到最后只剩下一个数字,即为计算结果。
2.1 自变量的替换自变量的替换
在CFunctionCaluclate中添加两个公有函数Capture_Variables( ):void和Capture_GivenPoints( ):void,分别用来获取自变
量和给定值,并将捕获到的自变量和给定值分别放入两个vector<const char*>类型的成员变量m_vecVariables和m_vecValues
中。
首先将储存自变量的m_vecVariables中的元素作为正则表达式,将其进行匹配并替换为相应的给定值,这时函数表达式已
变成只含有数字项的数学表达式。变量替换的流程图如图2所示。
2.2 只含数字项表达式的计算只含数字项表达式的计算
CNumericalCalculation用来对替换后只包含数字项的函数表达式进行运算,包括基本的四则运算以及幂函数运算。在
CFunctionCaluclate中通过实例化一个CNumericalCalculation的对象m_Calcution来调用它的计算函数。按照运算的优先级,
调用的顺序依次为幂函数运算、乘除函数运算、加减函数运算。
CNumericalCalculation类中有私有函数CString Genral_Calculation( CString expression, MODEL calculation_model
),Genral_Calculation( ) 的程序流图如图3所示。
评论0
最新资源