分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
原文地址:
http://www.cnblogs.com/lxfqlcz/archive/2011/08/02/2124854.html
从5月中旬到7月中旬,我一直在做焊接工程中接头图的参数化和自动化生成软件。主要是将各种标准接头图分解为一个个的图元,并自定义图元参数和图参数,用户在使用时,只需修改相关参数值,即能生成其所需要的接头图,无须再人工用CAD软件手动绘画。如下图所示。
其中采用了自定义公式来描述参数的变化将导致的图形变化。例如对于厚度的变化,定义的公式为:“dotAll.x=dotAll.x*t1/dot1.y;dotAll.y=dotAll.y*t1/dot1.y;”。这个公式表示对于图形中的所有点,当厚度变化时,点的x坐标变为 原x坐标值乘以新的厚度,再除以原来的序号为1的点的y坐标(即原来的厚度),同理对于y坐标的变化也一样。
最终公式将解析成 x=2.0 * 3 / 1.5, 最终结果为 4.0。问题的焦点在于如何将“2.0 * 3 / 1.5”这种字符串的表达式,让计算机能理解,并计算出结果。这里我采用了“逆波兰式算法”来解决这个问题。
关于“逆波兰式算法”的具体内容,请看这里 http://baike.baidu.com/view/2582.htm ,里面解释得很好。
最终程序里面的算法描述如下 :
逆波兰式算法
1、从左至右扫描一中缀表达式。
2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
3、若读取的是运算符
(1) 该运算符为左括号"(",则直接存入运算符堆栈。
(2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止,此时抛弃该左括号。
(3) 该运算符为非括号运算符:
(a) 若运算符堆栈栈顶的运算符为左括号,则直接存入运算符堆栈。
(b) 若比运算符堆栈栈顶的运算符优先级高,则直接存入运算符堆栈。
(c) 若比运算符堆栈栈顶的运算符优先级低或相等,则输出栈顶运算符到操作数堆栈,直至运算符栈栈顶运算符低于(不包括等于)该运算符优先级,或为左括号,
并将当前运算符压入运算符堆栈。
4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。
2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
3、若读取的是运算符
(1) 该运算符为左括号"(",则直接存入运算符堆栈。
(2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止,此时抛弃该左括号。
(3) 该运算符为非括号运算符:
(a) 若运算符堆栈栈顶的运算符为左括号,则直接存入运算符堆栈。
(b) 若比运算符堆栈栈顶的运算符优先级高,则直接存入运算符堆栈。
(c) 若比运算符堆栈栈顶的运算符优先级低或相等,则输出栈顶运算符到操作数堆栈,直至运算符栈栈顶运算符低于(不包括等于)该运算符优先级,或为左括号,
并将当前运算符压入运算符堆栈。
4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。
下面我们来具体实现下这个算法,代码中注释较全,就不详细解说了。
首先,我们来定义下操作数类。
定义操作数类型枚举
1 /// <summary>
2 /// 操作数类型
3 /// </summary>
4 public enum OperandType
5 {
6 /// <summary>
7 /// 函数
8 /// </summary>
9 FUNC = 1 ,
10
11 /// <summary>
12 /// 日期
13 /// </summary>
14 DATE = 2 ,
15
16 /// <summary>
17 /// 数字
18 /// </summary>
19 NUMBER = 3 ,
20
21 /// <summary>
22 /// 布尔
23 /// </summary>
24 BOOLEAN = 4 ,
25
26 /// <summary>
27 /// 字符串
28 /// </summary>
29 STRING = 5
30
31 }
2 /// 操作数类型
3 /// </summary>
4 public enum OperandType
5 {
6 /// <summary>
7 /// 函数
8 /// </summary>
9 FUNC = 1 ,
10
11 /// <summary>
12 /// 日期
13 /// </summary>
14 DATE = 2 ,
15
16 /// <summary>
17 /// 数字
18 /// </summary>
19 NUMBER = 3 ,
20
21 /// <summary>
22 /// 布尔
23 /// </summary>
24 BOOLEAN = 4 ,
25
26 /// <summary>
27 /// 字符串
28 /// </summary>
29 STRING = 5
30
31 }
操作数类 Operan