征集问题求解:基于NFA的算术表达式的智能解析与运算——挑战与思考——看样子提出问题感兴趣的人少、更多的浏览者还是比较喜欢现成结果

问题描述:如何让智能体学会计算一个数学表达式?

数学表达式,例如:(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进行训练,实现智能求解算法表达式(具体实现策略,需要脑补与实践).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值