人工智能—问题规约法(Reduction)[一]

问题规约表示

问题规约(Problem reduction)是另一种基于状态空间的问题描述与求解方法。已知问题的描述,通过一系列变换把此问题最终变成另一个本原问题(事实,定理)集合;这些本原问题的解可以直接得到,从而解决了初始问题。

问题规约表示可以由下列三部分组成: 
(1)一个初始问题描述; 
(2)一套把问题变换为子问题的操作符; 
(3)一套本原问题描述。

先把问题分解为子问题和子-子问题,然后解决较小的问题。对该问题的某个具体子集的解答就意味着对原始问题的一个解答。问题归约表示的组成部分:一个初始问题描述;一套把问题变换为子问题的操作符;一套本原问题描述。问题归约的实质:从目标(要解决的问题)出发逆向推理,建立子问题以及子问题的子问题,直至最后把初始问题归约为一个平凡的本原问题集合。

本原问题的描述

1.梵塔难题(hanoi)

有3个柱子(1,2和3)和3个不同尺寸的圆盘(A,B和C)。在每个圆盘的中心有一个孔,所以圆盘可以堆叠在柱子上。最初,3个圆盘都堆在柱子1上:最大的圆盘C在底部,最小的圆盘A在顶部。要求把所有圆盘都移到柱子3上,每次只许移动一个,而且只能先搬动柱子顶部的圆盘,还不许把尺寸较大的圆盘堆放在尺寸较小的圆盘上。这个问题的初始配置和目标配置如图2.6所示。

如图所示:

enter image description here

图 2.6 梵塔问题

解题过程:

将原始问题归约为一个较简单问题集合,要把所有圆盘都移至柱子3,我们必须首先把圆盘C移至柱子3;而且在移动圆盘C至柱子3之前,要求柱子3必须是空的。只有在移开圆盘A和B之后,才能移动圆盘C;而且圆盘A和B最好不要移至柱子3就不能把圆盘C移至柱子3。因此,首先应该把圆盘A和B移到柱子2上。然后才能够进行关键的一步,把圆盘C从柱子1移至柱子3,并继续解决难题的其余部分。 
  将原始难题归约(简化)为下列子难题:移动圆盘A和B至柱子2的双圆盘难题,如图(a)所示。

enter image description here  
图 2.7 梵塔问题解答(a)

enter image description here  

图 2.8 梵塔问题解答(b) 

enter image description here  
图 2.9 梵塔问题解答(c)

梵塔问题归约图:子问题2可作为本原问题考虑,因为它的解只包含一步移动。应用一系列相似的推理,子问题1和子问题3也可被归约为本原问题,如图2.10所示。这种图式结构,叫做与或图(AND/OR graph)。 
它能有效地说明如何由问题归约法求得问题的解答。

enter image description here  

图 2.10 梵塔问题归约图


 (参考文献:《人工智能及其应用》-第五版-清华大学出版社-蔡自兴)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的基于TensorFlow的人工智能项目代码示例,该项目是用于识别手写数字的: ```python import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 加载MNIST数据集 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 定义输入和输出的占位符 x = tf.placeholder(tf.float32, [None, 784]) # 输入为28*28=784维的向量 y_ = tf.placeholder(tf.float32, [None, 10]) # 输出为10维的向量,代表0~9 # 定义模型参数 W = tf.Variable(tf.zeros([784, 10])) # 权重参数 b = tf.Variable(tf.zeros([10])) # 偏置参数 # 定义模型输出 y = tf.nn.softmax(tf.matmul(x, W) + b) # 定义损失函数(交叉熵) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 定义优化器 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) # 定义评估准确率的操作 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 启动会话,开始训练模型 sess = tf.Session() sess.run(tf.global_variables_initializer()) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) if i % 100 == 0: train_accuracy = sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}) print("Step %d, training accuracy %g" % (i, train_accuracy)) # 在测试集上评估模型准确率 test_accuracy = sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}) print("Test accuracy %g" % test_accuracy) # 关闭会话 sess.close() ``` 在这个示例,我们使用了一个简单的全连接神经网络模型,并使用梯度下降优化算进行训练。在训练完成后,我们在测试集上对模型进行了评估,输出了测试准确率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值