问题描述:如何让智能体学会计算一个数学表达式?
数学表达式,例如:(1)3,(2)-3,(3)3+5,(4)3+(5),(5)3+5*3;(6)3++5*3,(7)3--5*3....
从现象而言,表达式长度变化不一;但其本质是一个确定有限自动机;
问题定义:应通过什么方式,让智能体学会解析一个算术表达式,并智能地计算其结果(设表达式本身语法正确)?或者,如何让智能体学习到一个DFA,以得到问题的本质模型?
算术表达式的生成python代码:
# 一个算术表达式生成器
# 考量Agent自动构建认知模型的能力
import random
# 生成元
values = [str(i - 5) for i in range(11)]
for i in range(5000):
s = random.choice([0, 1, 2])
if s == 0:
k = random.randint(0, len(values)-1)
val = '(' + values[k] + ')'
elif s == 1:
k = random.randint(0, len(values)-1)
val = random.choice('+-') + values[k]
else:
k2 = [random.randint(0, len(values)-1), random.randint(0, len(values)-1)]
if k2[0] > k2[1]:
k2 = [k2[1], k2[0]]
k1, k2 = k2
if k1 == k2:
val = values[k]
val = val + random.choice('+-*/') + val
else:
val2 = values[k2]
val1 = values[k1]
val = val1 + random.choice('+-*/') + val2
values.append(val)
try:
print(val, eval(val))
except ZeroDivisionError:
pass
except:
raise
for val in values:
print( val )
生成的结果(部分):
(+-((((-3-+1))))) 4
-(+-4*3)*(-4)/(-5-(3))+-+0-(-4*3)/(-5)*(++1) 3.6
-+(--(+-4))*((((--2-(3))))) -4
+(-4)--+-4*3-(++2+-(-4)/(-5-(3))) -17.5
-((-4)) 4
+((+-4))/(((((-3-+1)))*-+2))/-(+1--+2++(-4))*+(-5-(3))/(--1) 4.0
((+-(-3-+1))) 4
(+++1+--(((0/(-4)))/(+-4))) 1.0
(++2+-(-4)/(-5-(3)))-((-(+-4))) -2.5
(++2)*-4*3/(++2)++((-0-2--+2))-(((+2)*((0/(-4)))/(+-4)))/(++0-2--+2*---1) -12.0
-(-5-(3))+(+(--2-(3))) 7
((0-2--+2)) 0
(-(-(+-4))/(-4+-1)) 0.8
(+(-3-+1)) -4
(--4+-1) 3
+((--(3)-(-3-+1)++2+(-4))) 5
-(((((-3-+1)))*-+2)) -8
((0-2)--+2) 0
+0-2*(0-2)--+2--(+0)-++2+-(-4)/(-5-(3))+(+(-5)) -1.5
(-1+(+1)-+(-4)) 4
((++(--(+-4)))) -4
-((-(-0/(-4)))) -0.0
(+((-2))) -2
-+(-++0-2--+2*---1) 4
((+2)) 2
((((+0)))) 0
(((-3-+2--(+-4))))/(+(-4)) 2.25
+0-2--+2/-+2-((+-4))/((+(-3-+2--(+-4))))/+-((0-2--+2*---1/(--4))) -3.1777777777777776
-(+(-3-+1)) 4
((-2+(-4)/--+1-(+(-5))-+-(+-4)-++-4*+(+(-5)))) -25.0
(+-(3)) -3
-(-5-(3))+(+0-2--+2*(+1*+2+(-4))--3+(-+0)) 5
((2+(-4))) -2
+-((-(-0/(-4)))) -0.0
(+0-2--+2*---1) -4
--(+-4)*(((+0)))-((+2))*+0-2--+2+(+0)*((-(+-4))) 0
((((--2-(3))))) -1
(((--+2))) 2
(+(++0-2--+2*---1*++-(0))) -2
(-3-+1)+(((+0)))-((++0-2))*(((0))) -4
(+-(-4)/(-5-(3))+(+-(-3-+1))) 3.5
+++--(+-4) -4
-((((+0)))) 0
(++-(0)*+(-+1)) 0
(((0-2--+2))) 0
-(((0/(-4)))/(+-4))+-(3) -3.0
-((-(-0/(-4)))) -0.0
((2+(-4))) -2
++-(5*-2-(3))-(-(-3-+1))/-4 14.0
(++0-(-4*3)/(-5)) -2.4
+((0-2--+2))+(+2+(-4))+((-5-(3))) -10
(+((0-2--+2))+(+2+(-4))+((-5-(3)))) -10
+-++-(0-2)/-+((+0-2))+(-0-2--+2) -1.0
(((+0)-++2+-(-4)/(-5-(3))+(+(-5)))) -7.5
((((-3-+2--(+-4))))) -9
(((+-((-(+-4)))))*(4*-(-4)/(-5-(3)))) 8.0
(0-2--+2)/+-3/+(++2+-(-4)/(-5-(3))) -0.0
+(((+-(-3-+1))*((-(+-4))+(0))/-(5*-2-(3))-(-(-3-+1))/-4)/((((-3-+1)))*+0-(-4*3)/(-5)*(++1))) -0.9294871794871795
((--+2---((+2))*(+(-4)))-((-((-(+-4)))))) 14
(+(0/(-4))*(-(+-4))) -0.0
+(((-(+-4))+(0))) 4
+((-(-4))) 4
((-(0-2--+2))) 0
(--+1)-+++-(-3-+1) -3
-(++0-(-4*3)/(-5)) 2.4
+(((-(+-4))+(0)))++--+2/((+-4))-(0-2--+2*(+1*+2+(-4))/-(+-(-3-+1)))+(((++-(-3-+1)))-((-(0/(-4)))))*((-+1-((++-(-3-+1))))) -15.5
0/(-4)/+(-4)*-5-(-5-(3))+-+2-(-(+-4))-((0))--((+2))*(--+2) 6.0
(-3-+1)-+(+0)++-+-4*3 8
+(+(-5))*((-(+-4))+(0)) -20
--((++2+-(-4)/(-5-(3))))*-+(-3-+1) 6.0
-++-4/(--1) 4.0
((((((-3-+1)))*-+2))) 8
(+++(-4)*+2) -8
(((5*-2-(3)))) -13
((-+1/(+(+(-5))))) 0.2
(++++(-4)*+2) -8
-(--+2--(+-4)) 2
(((5*-2-(3))+((-4)/(-5-(3)))))+-((((-(+-4))))) -16.5
-((-(+-4))) -4
((+2+(-4))) -2
+-(-5-(3))+(+0-2--+2*(+1*+2+(-4))--3+(-+0)) 5
+(+((((0-2--+2))))) 0
要求:使用ANN完成表达式的解析,而不是人工编程解析计算过程.
进一步的思考与提示:
对与一个表达式而言,存在字符token类型可分为3类:
(1)左右括号类A;
(2)+-——可被看作一元运算符(一个算术表达式可以被看作+式——模式计算模式)——这样的话,表达式中的+-只作为修饰后面的数的用途,避免了其作为一元或二元运算符理解上的歧义现象——B类;
(3)*/被作为二元运算符——C类
用状态码A、B、C类的状态码序列作为特征序列码可以表示一个算术表达式,
例如exp = ((1+2)*(3--4))
则状态码:
(1)括号范围状态码——12222212222221
'('的状态码为1(左括号升级范围从0到1),'('的状态码为2(左括号升级范围从1到2),'1'的状态码为2(延续状态),'+'保持状态2,'2'保持状态2,')'输出状态2后降低状态码为1,'*'保持状态吗1,'('升状态码为2,'('升状态码为2,'-'保持状态2,'-'保持保持状态2,'4'保持2,')'输出状态2后降状态为1),')'输出状态后将状态为0.
(2)一元运算符状态码——000100000200(1表示+,2表示-,0表示不是'+'或'-'.
(3)二元运算符状态码——00000010000000(1表示*,2表示/,0表示不是'*'或'-/'.
由上分析,得到表达式的状态码:
mat = ['12222212222221', '000100000200', '00000010000000']
假设上述mat对表达式的信息表达是信息完整的(若不完整请自行补充),
则每个算术表达式都可以利用上述方法进行编码,并利用LSTM进行训练,实现智能求解算法表达式(具体实现策略,需要脑补与实践).