Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16449
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2019-02-10 13:28
文章分类
文章存档

2019年(5)

我的朋友
最近访客

分类: C#/.net

2019-02-21 14:29:08

基于规则的人工智能算法整数加法的实现

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。
人工智能算法可以理解为模仿人脑的算法,深度学习是模仿大脑神经网络学习的算法,是分层学习,学习是训练的意思。

计算机进行加法运算

计算机加法计算是怎么进行呢?它是不是模仿人脑计算?脑算?
4+5=9
计算机是这样进行计算的,先把数字转换成二进制,然后进行二进制运算,人脑并没有二进制,所以不是人工智能算法。
4转换成二进制是100
5转换成二进制是101
相加的结果是1001
怎么理解呢?
二进制加法只有两个数0和1,加法规则是逢二进一。
计算规则
0+0=0
0+1=1
1+0=1
1+1=10
1+1=10就是逢二进一,1+1=2,但是二进制并没有2这个数字,只能进一位,把2变成1进位并把原来的位置变成0,结果就是10。
现在可以理解100+101=1001
计算机是用加法器进行二进制运算。
32位计算机就是加法器只能进行32个二进制位计算,超过了32位就溢出,超出了32位表示,计算结果是错误的。
32位的最大值是2147483647,所以最大能计算21亿多一些,超过了只能用64位表示,可以达到九千万亿亿。
只要不是溢出,计算机加法是不会有错误的。

用深度学习进行加法运算

深度学习是用神经网络进行训练,通过大量计算拟合出一个接近答案的算法,模型。
比如直接输入字符串,结果标签也是字符串。
输入4+5,预测出结果,让他接近真实标签9.
这样输入
2+4 结果6
11+22 结果33
333+444结果777
算法是实现输入到输出的映射。
因为输入是数字,可以转换成数字进行计算,实现逻辑回归。
输入两列,输出一列
2,4,6
11,22,33
333,444,777
通过输入数千万样本数据进行训练,结果会越来越准确。
但是数字组合是无穷的,不可能训练所有的数字加法。
训练结果总是会有个准确率,不可能达到百分之百正确,比如达到99.99%,
还是有0.01%的错误率,这种方法如果计算不准确,不正确,可能相差十万八千里,
在要求准确率极高的系统是不可接受的,比如1+2算出1000002,那结果肯定不行的。
其实我们要用深度学习做加法运算训练是要学到加法规则和进位规则,但是能学到吗?

我们说深度学习并没有理解能力,只是一种映射。
1+2我们大脑的理解是一个东西和两个东西合在一起,比如一个苹果和两个苹果放在一起,就能得到三个苹果。
要理解1+2=3,首先要认识1,2,3三个数字,他们代表一定的数量,而加就是规则,是把两个数量合起来。
规则还有减,乘,除,乘方等方法。
所以我认为理解,就是掌握每个数字,或者叫数据,标签,概念,对象,东西,我们用标签来表示。
标签1是数量1,标签人则不是数量,是人类,标签乘法,代表求倍数。
理解,包含两个意思,一是它跟现实事物的关系,也就是它跟其他标签的关系,用其他标签表示它的属性,二是强加在它上面的各种规则。
1表示数量,1个,它能进行加减乘数运算
人表示一种动物,人类,有高级智能,能说话,能操作各种东西。
一旦建立了各种关系和规则,人就可以做各种事情,比如开车。
我们去学车,就是学习理解车,车跟其他东西,环境的关系,并掌握各种规则来操作汽车。
利用关系和规则,我们就可以理解,并拥有人的智能。

深度学习并不会理解,没有抽象和推理功能。
从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
推理,逻辑学指思维的基本形式之一,是由一个或几个已知的判断(前提)推出新判断(结论)的过程,有直接推理、间接推理等。

抽象就是关系,推理就是规则,合起来就是理解!有了这个概念,我们就可以用关系和规则实现理解,因而有了智能。

为什么这样做?因为我们要用计算机来表示并计算,不可能依靠笼统的理解,否则你就没法实现人工智能。
面向对象编程有点像理解的代码实现,他有属性和方法,只是人工智能理解为关系和规则。

基于规则模仿人脑的加法实现

我们不用计算机加法也不用深度学习,利用关系和规则同样可以实现一个加法。当然是模仿人脑的,笔算就是列算式。

222+999=?
从个位算起,2+9=11,高位1是进位,低位是个位
计算十位 2+9=11,但是还有个进位11+1=12,高位1是进位,低位是十位
计算十位 2+9=11,但是还有个进位11+1=12,高位1是进位到千位,低位是百位
现在和在一起,保留最后一个进位,去掉其他进位,并按高地位排列结果是1221
用计算器计算结果1221,说明跟计算机计算结果是一样的。
乘法和除法的算法更复杂。
驾驶汽车理解的对象更多,规则更多。

为了实现模仿人脑的加法,我们要建立关系和规则

标签
0,1,2,3,4,5,6,7,8,9
用十个阿拉伯数字来表示我们要计算的元素对象
他们跟数量有关系,假如用到现实中,比如搬运工,8这个数字代表的可能是8袋水泥。
这个机器人第一次搬3袋水泥,第二次搬5袋,如果系统让他搬9袋,他有了智能就会去搬最后1袋。

规则是加法表
0是没有,加0还是等于自己
1+1=2
1+2=3
1+3=4
一直到
9+9=18

进位规则

只是两个数字加起来,那么查看加法表就得到结果。
如果多位数相加,就会有进位,两个数相加的高一位就是进位,加到高一位去。


减法乘法类似
除法更复杂,要尝试枚举乘法表多个规则。
本文只是抛砖引玉,真有乘法除法实现也不会放出源代码。

sepl规则加法算法实现

用编程实现,要定义算法元素,加法规则表,进位规则,然后就可以查表和进位实现任意两个数字的加法,而且不会溢出。

sepl代码

y引用 System;
//器普sepl语言让编程变成有艺术!本代码在sepl3.0编译器运行正常
m命名空间 基于规则人工智能算法加法实现
m命名空间开始

    l类 加法规则
    l类开始
        g公开的 z字符 数字1;
        g公开的 z字符 数字2;
        g公开的 z字符 进位;
        g公开的 z字符 低位结果;
        g公开的 加法规则(z字符 数字1, z字符 数字2, z字符 进位, z字符 低位结果)
        h函数开始
            z自身.数字1 = 数字1;
            z自身.数字2 = 数字2;
            z自身.进位 = 进位;
            z自身.低位结果 = 低位结果;
        h函数结束
    l类结束

    l类 加法实现
    l类开始

    z字符[] 阿拉伯数字 := s数组初始化开始 '0','1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' s数组初始化结束;
    加法规则[] 加法表 := s数组初始化开始

        x新建 加法规则('0','0','0','0'),
        x新建 加法规则('0','1','0','1'),
        x新建 加法规则('0','2','0','2'),
        x新建 加法规则('0','3','0','3'),
        x新建 加法规则('0','4','0','4'),
        x新建 加法规则('0','5','0','5'),
        x新建 加法规则('0','6','0','6'),
        x新建 加法规则('0','7','0','7'),
        x新建 加法规则('0','8','0','8'),
        x新建 加法规则('0','9','1','9'),

        x新建 加法规则('1','0','0','1'),
        x新建 加法规则('1','1','0','2'),
        x新建 加法规则('1','2','0','3'),
        x新建 加法规则('1','3','0','4'),
        x新建 加法规则('1','4','0','5'),
        x新建 加法规则('1','5','0','6'),
        x新建 加法规则('1','6','0','7'),
        x新建 加法规则('1','7','0','8'),
        x新建 加法规则('1','8','0','9'),
        x新建 加法规则('1','9','1','0'),

        x新建 加法规则('2','0','0','2'),
        x新建 加法规则('2','1','0','3'),
        x新建 加法规则('2','2','0','4'),
        x新建 加法规则('2','3','0','5'),
        x新建 加法规则('2','4','0','6'),
        x新建 加法规则('2','5','0','7'),
        x新建 加法规则('2','6','0','8'),
        x新建 加法规则('2','7','0','9'),
        x新建 加法规则('2','8','1','0'),
        x新建 加法规则('2','9','1','1'),

        x新建 加法规则('3','0','0','3'),
        x新建 加法规则('3','1','0','4'),
        x新建 加法规则('3','2','0','5'),
        x新建 加法规则('3','3','0','6'),
        x新建 加法规则('3','4','0','7'),
        x新建 加法规则('3','5','0','8'),
        x新建 加法规则('3','6','0','9'),
        x新建 加法规则('3','7','1','0'),
        x新建 加法规则('3','8','1','1'),
        x新建 加法规则('3','9','1','2'),

        x新建 加法规则('4','0','0','4'),
        x新建 加法规则('4','1','0','5'),
        x新建 加法规则('4','2','0','6'),
        x新建 加法规则('4','3','0','7'),
        x新建 加法规则('4','4','0','8'),
        x新建 加法规则('4','5','0','9'),
        x新建 加法规则('4','6','1','0'),
        x新建 加法规则('4','7','1','1'),
        x新建 加法规则('4','8','1','2'),
        x新建 加法规则('4','9','1','3'),

        x新建 加法规则('5','0','0','5'),
        x新建 加法规则('5','1','0','6'),
        x新建 加法规则('5','2','0','7'),
        x新建 加法规则('5','3','0','8'),
        x新建 加法规则('5','4','0','9'),
        x新建 加法规则('5','5','1','0'),
        x新建 加法规则('5','6','1','1'),
        x新建 加法规则('5','7','1','2'),
        x新建 加法规则('5','8','1','3'),
        x新建 加法规则('5','9','1','4'),

        x新建 加法规则('6','0','0','6'),
        x新建 加法规则('6','1','0','7'),
        x新建 加法规则('6','2','0','8'),
        x新建 加法规则('6','3','0','9'),
        x新建 加法规则('6','4','1','0'),
        x新建 加法规则('6','5','1','1'),
        x新建 加法规则('6','6','1','2'),
        x新建 加法规则('6','7','1','3'),
        x新建 加法规则('6','8','1','4'),
        x新建 加法规则('6','9','1','5'),

        x新建 加法规则('7','0','0','7'),
        x新建 加法规则('7','1','0','8'),
        x新建 加法规则('7','2','0','9'),
        x新建 加法规则('7','3','1','0'),
        x新建 加法规则('7','4','1','1'),
        x新建 加法规则('7','5','1','2'),
        x新建 加法规则('7','6','1','3'),
        x新建 加法规则('7','7','1','4'),
        x新建 加法规则('7','8','1','5'),
        x新建 加法规则('7','9','1','6'),

        x新建 加法规则('8','0','0','8'),
        x新建 加法规则('8','1','0','9'),
        x新建 加法规则('8','2','1','0'),
        x新建 加法规则('8','3','1','1'),
        x新建 加法规则('8','4','1','2'),
        x新建 加法规则('8','5','1','3'),
        x新建 加法规则('8','6','1','4'),
        x新建 加法规则('8','7','1','5'),
        x新建 加法规则('8','8','1','6'),
        x新建 加法规则('8','9','1','7'),


        x新建 加法规则('9','0','0','9'),
        x新建 加法规则('9','1','1','0'),
        x新建 加法规则('9','2','1','1'),
        x新建 加法规则('9','3','1','2'),
        x新建 加法规则('9','4','1','3'),
        x新建 加法规则('9','5','1','4'),
        x新建 加法规则('9','6','1','5'),
        x新建 加法规则('9','7','1','6'),
        x新建 加法规则('9','8','1','7'),
        x新建 加法规则('9','9','1','8'),
    s数组初始化结束;

w无返回值 计算两个阿拉伯数字相加(z字符 数字1, z字符 数字2, z字符 上次进位, f赋值返回 z字符 进位, f赋值返回 z字符 低位结果)
h函数开始

    进位 = '0';
    低位结果 = '0';
    z整数 加法表长度 = 加法表.Length;
    d带因子循环(z整数 位置索引 = 0;位置索引 < 加法表长度;位置索引 z自加1)
    {
        r如果 ((加法表[位置索引].数字1 == 数字1) b并且 (加法表[位置索引].数字2 == 数字2))
        k开始
            进位 = 加法表[位置索引].进位;
            低位结果 = 加法表[位置索引].低位结果;
            t退出循环;
        j结束
    }
    d带因子循环(z整数 位置索引 = 0; 位置索引 < 加法表长度; 位置索引 z自加1)
    {
        r如果 t条件开始 (加法表[位置索引].数字1 == 低位结果) b并且 (加法表[位置索引].数字2 == 上次进位) t条件结束
        k开始
            低位结果 = 加法表[位置索引].低位结果;
            t退出循环;
        j结束
    }
h函数结束

z字符串 计算两个数字字符串相加(z字符串 数字串1, z字符串 数字串2)
h函数开始

    z整数 最大字符串长度 c初始化 数字串1.Length;
    r如果 (数字串2.Length > 最大字符串长度)
        最大字符串长度 f赋值 数字串2.Length;
    
    z字符 每次进位 c初始化 '0';
    z字符串 总值串 c初始化 "";

    d带因子循环(z整数 次序 = 0; 次序 < 最大字符串长度; 次序 z自加 1)
    x循环开始
        z字符 数字1 c初始化 '0';
        z字符 数字2 c初始化 '0';
        z整数 字符1位置 := 数字串1.Length - 1 - 次序;//从低位开始相加
        z整数 字符2位置 := 数字串2.Length - 1 - 次序;

        r如果 m满足条件 (次序<数字串1.Length) b并且 (字符1位置>=0)  n那么
                数字1=数字串1[字符1位置];
        r如果 t条件 (次序 < 数字串2.Length) b并且 (字符2位置 >= 0) w为真就执行
            数字2 = 数字串2[字符2位置];
            
        z字符 进位 = '0';
        z字符 低位结果 = '0';
        计算两个阿拉伯数字相加(数字1, 数字2, 每次进位, f赋值返回 进位, f赋值返回 低位结果);

        每次进位:= 进位;

        总值串 = 低位结果 + 总值串;
    x循环结束

    r如果 m满足条件 (每次进位  b不等于 '0') n那么
            总值串 f赋值 每次进位 l连接 总值串;

    f返回 总值串;

    l类结束

    g公开的 j静态全局的 w无返回值 主函数(z字符串[] 命令行参数)
    h函数开始
    
    加法实现 加法对象=x新建 加法实现();

    z执行
    x循环开始
    
        Console.WriteLine("请输入数字1(q退出):");
        z字符串 数字串1 = Console.ReadLine();
        r如果  m满足条件 数字串1 d等于 "q" n那么
            t退出循环;
        Console.WriteLine("请输入数字2(非数字当0):");
        z字符串 数字串2 = Console.ReadLine();


        z字符串 总和 = 加法对象.计算两个数字字符串相加(数字串1,数字串2);
        Console.WriteLine("总和:"+总和);

    x循环结束
    m满足条件再循环(z真);

    h函数结束

    l类结束
m命名空间结束


运行测试结果:

请输入数字1(q退出):
11111111
请输入数字2(非数字当0):
22222222
总和:33333333
请输入数字1(q退出):
23214234234242342342342342342342343545656
请输入数字2(非数字当0):
56456456456456564564564645646456456565655
总和:79670690690698906906906987988798790111311
请输入数字1(q退出):
99999999999999999999999999999999999999999999999999999999999999999
请输入数字2(非数字当0):
33333333333333333333333333333333333333333333333333333333333333333
总和:133333333333333333333333333333333333333333333333333333333333333332
请输入数字1(q退出):

阅读(2330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~