当前位置: 首页 > 编程日记 > 正文

人工智能--野人过河

人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的定义可以分为两部分,即“人工”和“智能”。“人工”比较好理解,争议性也不大。有时我们会要考虑什么是人力所能及制造的,或者人自身的智能程度有没有高到可以创造人工智能的地步,等等。但总的来说,“人工系统”就是通常意义下的人工系统。

人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。

人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。

  • 上机题简介

用JAVA语言编写和调试一个基于宽度优先搜索法的解决“野人与传教士过河”问题的程序。目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单问题,熟悉简单智能算法的开发过程并理解其实现原理。

野人与传教士渡河问题:3个野人与3个传教士打算乘一条船到对岸去,该船一次最多能运2个人,在任何时候野人人数超过传教士人数,野人就会把传教士吃掉,如何用这条船把所有人安全的送到对岸?

野人与传教士渡河问题实验原理:

先实现宽度优先搜索

定义一个结构体或类来保存状态信息,状态信息包括当前某一岸边野人和传教士的人数,船所在位置,以及指向前次状态节点的指针或其在链表中的编号等

每次船运载的人数只有5种可能

1野人;1传教士;2野人;2传教士;1野人1传教士

1.为了避免重复,我们将搜索过的状态记录下来,之后避开搜索这个状态。

2.我们把满足条件的状态称为安全状态,首先要定义出安全状态,通过对问题的分析, 不难得出只有满足以下条件之一的状态才是安全的(以左岸为例): 
1)传教士与野人的数目相等; 
2)传教士都在左岸; 
3)传教士都不在左岸。 
我们只对安全的状态进行深度优先搜索,直至找到一个合法的解。

野人传教士渡河问题程序功能结构图:

流程图:

数据结构定义:

class state   //定义状态类

public int left_c;    //定义左岸传教士

public int left_y;    //定义左岸野人

public int boat;      //定义船的位置

public int right_c;   //定义右岸传教士

public int right_y;   //定义右岸野人

主要变量:

nullboat.setleft_c   //空数组中左岸传教士人数

nullboat.setleft_y   //空数组中左岸野人人数

nullboat.setright_c  //空数组中右岸传教士人数

nullboat.setright_y  //空数组中右岸野人人数

nullboat.setboat   //空数组中船的位置

import java.util.ArrayList;  //Java数组类
import java.util.List;class state{   //定义状态类public int left_c;    //定义左岸传教士public int left_y;    //定义左岸野人public int boat;      //定义船的位置public int right_c;   //定义右岸传教士public int right_y;   //定义右岸野人public state(int left_c,int left_y,int boat,int right_c,int right_y)	//state方法重写{	super();this.left_c=left_c;this.left_y=left_y;this.boat=boat;this.right_c=right_c;this.right_y=right_y;}public void setleft_c(int i) {  // TODO Auto-generated method stubthis.left_c=i;}public void setleft_y(int left_y2) {// TODO Auto-generated method stubthis.left_y=left_y2;}public void setright_c(int i) {// TODO Auto-generated method stubthis.right_c=i;}public void setright_y(int right_y2) {// TODO Auto-generated method stubthis.right_y=right_y2;}public void setboat(int i) {// TODO Auto-generated method stubthis.boat=i;}
}public class Cross {   //过河方法//static List<state> list=new ArrayList<state>();  //数组集合
//	static state state; 
//	static List<state> list;public static void robot(state state,List<state> list){  //将class state变成数组if (state.right_c == 3 && state.right_y== 3)   //判断是否完成过河{			System.out.println("\n\n以下本次过河的方法以及实时状态。\n");System.out.println("船位置"+"\t"+"左传"+"\t"+"左野"+"\t"+"右传"+"\t"+"右野");for (int i = 0; i < list.size(); i++){//输出船的位置,左岸传教士人数,左岸野人数,右岸传教士人数,右岸野人数System.out.println(list.get(i).boat+"\t "+list.get(i).left_c+"\t "+list.get(i).left_y+"\t "+list.get(i).right_c+"\t "+list.get(i).right_y);}return ;}// 判断是否重复操作	for (int i= 0; i < list.size() - 1; i++) {if (list.get(i).left_c == state.left_c && list.get(i).left_y == state.left_y&&list.get(i).boat==state.boat) {return ;}}// 人数合理吗for (int i= 0; i < list.size() - 1; i++) {if (state.left_c< 0 || state.left_y< 0 || state.right_c< 0 || state.right_y< 0)  //判断人数是否小于0{return ;}}// 传教士被吃了没if ((state.left_c < state.left_y && state.left_c != 0)|| (state.right_c< state.right_y && state.right_c != 0)){return ;}	//定义一个空的状态		state nullboat = new state(0, 0, 0, 0, 0);//两个传教士过河nullboat.setleft_c(state.left_c - 2 * state.boat);   //此时左岸传教士人数为1nullboat.setleft_y(state.left_y);              //此时左岸野人人数为3nullboat.setright_c(state.right_c + 2 * state.boat);  //此时右岸传教士人数为2nullboat.setright_y(state.right_y);   //此时右岸野人人数为0nullboat.setboat(-state.boat);      //此时船在右岸list.add(nullboat);robot(nullboat, list);list.remove(list.size() - 1);// 两个野人过河nullboat.setleft_c(state.left_c);         //此时左岸传教士人数为3nullboat.setleft_y(state.left_y - 2 * state.boat);  //此时左岸野人人数为1nullboat.setright_c(state.right_c);      //此时右岸传教士人数为0nullboat.setright_y(state.right_y + 2 * state.boat); //此时右岸野人人数为2nullboat.setboat(-state.boat);  //此时船在右岸list.add(nullboat);robot(nullboat,list);list.remove(list.size() - 1);// 一个野人,一个传教士		nullboat.setleft_c(state.left_c - 1 * state.boat);    //此时左岸传教士人数为2nullboat.setleft_y(state.left_y - 1 * state.boat);    //此时左岸野人人数为2nullboat.setright_c(state.right_c + 1 * state.boat); //此时右岸传教士人数为1nullboat.setright_y(state.right_y + 1 * state.boat); //此时右岸野人人数为1nullboat.setboat(-state.boat);   //此时船在右岸list.add(nullboat);robot(nullboat, list);list.remove(list.size() - 1);// 一个传教士过河nullboat.setleft_c(state.left_c - 1 * state.boat);     //此时左岸传教士人数为2nullboat.setleft_y(state.left_y);         //此时左岸野人人数为3nullboat.setright_c(state.right_c + 1 * state.boat);  //此时右岸传教士人数为1nullboat.setright_y(state.right_y);  //此时右岸野人人数为0nullboat.setboat(-state.boat);   //此时船在右岸list.add(nullboat);robot(nullboat, list);list.remove(list.size() - 1);// 一个野人过河nullboat.setleft_c(state.left_c);         //此时左岸传教士人数为3nullboat.setleft_y(state.left_y - 1 * state.boat);  //此时左岸野人人数为2nullboat.setright_c(state.right_c);     //此时右岸传教士人数为0nullboat.setright_y(state.right_y + 1 * state.boat); //此时右岸野人人数为1nullboat.setboat(-state.boat);   //此时船在右岸list.add(nullboat);robot(nullboat, list);list.remove(list.size() - 1);return ;}	public static void main(String[] args) {   //主函数		List<state> list = new ArrayList<state>();state begin =new state(3,3,1,0,0);    //定义初始状态的船位置、左右传教士人数和野人人数list.add(begin);robot(begin, list);}
}

体会

在传教士和野人渡河问题中,在讨论用产生式系统求解问题时,有时引入状态空间图的概念很有帮助。状态空间图是一个有向图,其节点可表示问题的各种状态(综合数据库),节点之间的弧线代表一些操作(产生式规则),它们可把一种状态导向另一种状态。这样建立起来的状态空间图,描述了问题所有可能出现的状态及状态和操作之间的关系,因而可以较直观地看出问题的解路径及其性质。

转载于:https://www.cnblogs.com/951201193-wzc/p/10294929.html

相关文章:

java对cookie的操作

原文&#xff1a;http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html java对cookie的操作比较简单&#xff0c;主要介绍下建立cookie和读取cookie&#xff0c;以及如何设定cookie的生命周期和cookie的路径问题。 建立一个无生命周期的cookie&#xff0c;即随着…

【ACM】POJ 3069

【问题描述】 Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of R u…

sparkCore源码解析之思维脑图

2019独角兽企业重金招聘Python工程师标准>>> 在学习sparkCore时&#xff0c;有几个模块的概念理解不是很透彻&#xff0c;故对照源码进行学习&#xff0c;并将结果一脑图的形式呈现&#xff0c;方便后续的持续学习。 详细内容见&#xff1a; sparkCore源码解析之blo…

pangilin 安装编译

make pangolin 的时候报错 ootsun:/home/sun/AR/orb/Pangolin-0.5/build# make [ 1%] Building CXX object src/CMakeFiles/pangolin.dir/log/packetstream.cpp.o /home/sun/AR/orb/Pangolin-0.5/src/log/packetstream.cpp: 在函数‘void pangolin::WaitUntilPlaybackTim…

PHP实现求阶乘

function factorial ($x){if ($x > 1) {$s $x * factorial ($x - 1);} else {$s $x;}return $s; }$x 100;echo $x."的阶乘的为".factorial($x);转载于:https://blog.51cto.com/chensenlin/1854679

【ACM】杭电OJ 2064(汉诺塔III)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2064 思路&#xff1a; 1、将n-1个盘从A移到C f(n-1)次 2、将第n个从A移到B 1次 3、将n-1个盘从C移到A f(n-1)次 4、将第n个从B移到C 1次 5、将n-1个盘从A移到C f(n-1)次 #include<cstdio> #inclu…

文件上传至阿里云

public static String uploadFile2OSS(InputStream instream, String fileName) throws IOException {String imageName null;OSSClient ossClient null;try {ClientConfiguration conf new ClientConfiguration();// 请求超时时间设置conf.setConnectionTimeout(5000);// 请…

ORB-SLAM2安装

安装顺利与否可能会与Ubuntu版本有关。&#xff08;ubuntu16.04 gcc4.8.5这个很重要偶&#xff0c;本班的直接决定Pangolin能不能安装成功&#xff0c;如果遇到哦问题的朋友可以参考一下链接 http://blog.csdn.net/Darlingqiang/article/details/78928873&#xff09;亲测可用…

iOS 系统分析(一) 阅读内核准备知识

原文出自【听云技术博客】&#xff1a;http://blog.tingyun.com/web/a... 0x01 iOS体系架构1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer )&#xff1a;SpringBoard 同时支持 Spotlight。 应用软件开发框架&#xff08;The Application Frameworks layer&a…

【数据结构】拓扑排序

如果一个有向图中没有包含简单的回路&#xff0c;这样的图为有向无环图。 图中的顶点代表事件&#xff08;活动&#xff09;&#xff0c;图中的有向边说明了事件之间的先后关系。这种用顶点表示活动&#xff0c;用弧表示活动时间的优先关系的有向图称为顶点表示活动的网&#…

Java8自定义条件让集合分组

** 将一个指定类型对象的集合按照自定义的一个操作分组&#xff1b; 每组对应一个List、最终返回结果类型是:List<List<T>> param <T>*/static class GroupToList<T> implements Collector<T, List<List<T>>, List<List<T>&g…

ROS_Kinetic ubuntu 16.04

ROS_Kinetic系列学习(一)&#xff0c;在ubuntu 16.04安装ROS Kinetic。 http://wiki.ros.org/kinetic/Installation/Ubuntu 通过网页快速了解Linux&#xff08;Ubuntu&#xff09;和ROS机器人操作系统&#xff0c;请参考实验楼在线系统如下&#xff1a; 纯净定制版镜像已经…

android 获取手机GSM/CDMA信号信息,并获得基站信息

本文转自&#xff1a;http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表&#xff0c;那如何获取CDMA或者GSM的手机信号呢&#xff1f;系统提供了TelephonyManager类&#xff0c;此类非常丰富&#xff0c;基本你所…

【数据结构】关键路径

在有向图中&#xff0c;如果用顶点表示事件&#xff0c;弧表示活动&#xff0c;弧上的权值表示活动持续的时间&#xff0c;这样的活动称为边表示活动的网&#xff0c;简称AOE网&#xff08;Activity On Edge&#xff09;。通常可以用AOE网来估算工程的完成时间&#xff0c;他不…

呼伦湖国家级自然保护区管理局投放草料保野生黄羊过冬

图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 中新网呼伦贝尔1月16日电 (记者 李爱平)中国北方正是最为寒冷的时节&#xff0c;呼伦湖国家级自然保护区管理局内的60只野生黄羊正在面临食草…

buildroot httpd php

/********************************************************************* buildroot httpd php* 说明&#xff1a;* 在buildroot中选择了php&#xff0c;但是在测试的时候发现总是出现下面这行* 错误&#xff0c;库是存在的&#xff0c;但是却没有放对…

VS快速注释多行 以及 取消

快速注释多行&#xff1a;Ctrl K 然后 Ctrl C 快速取消多行注释 &#xff1a;Ctrl K 然后 Ctrl U

前端的一些小的效果

1 . 移动端字体自适应大小&#xff08;暂时没用过&#xff0c;不过据说很有用也很好用&#xff09; body{font-family: "Microsoft YaHei";font-size: 0.14rem;color: #666;max-width: 640px;margin: auto;}media screen and (min-width: 360px) { html {font-s…

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数在计算机系统的发展过程中&#xff0c;曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数&#xff08;Fixed Point Number&#xff09;。在这种表达方式中&#xff0c;小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式&#…

【ACM】杭电OJ 5055(Bob and math problem)

http://acm.hdu.edu.cn/showproblem.php?pid5055 注意几点&#xff1a; 1、全部都是偶数&#xff0c;输出-1 2、n-1个是0&#xff0c;第n个不论是奇数&#xff0c;还是偶数&#xff0c;输出-1 3、n1的情况 4、将所有数字从大到小排列&#xff0c;挑出最小的奇数放在最后…

每天工作4小时的程序员【转】

每个人都熟悉这种作息规律&#xff1a;早上9点去上班&#xff0c;坐在电脑前面&#xff0c;编一天的程序&#xff0c;下午5点下班回家。如今&#xff0c;非常感谢蒂莫西费里斯 (Timothy Ferriss)的《每周工作4小时》&#xff0c;我开始重新思考应该如何工作&#xff0c;如何让自…

ARKIT/ARCore对比分析(一)

ARKit简介 ARkit是什么&#xff1f; 苹果为什么发布ARkit&#xff1f;&#xff08;6月5日的苹果WWDC 2017全球开发者大会上&#xff0c;苹果发布了AR开发平台ARkit&#xff09; 1.概述&#xff1a;ARkit应用平台是苹果的首个 AR 产品。iOS 11引入了ARKit应用平台&#xff0c;…

每个程序员必看:如何在40岁后继续做软件开发?

导读: 这是一个 42 岁的开发者所写经验分享文章&#xff0e;并且列出一些他 18 年多身为软件开发者的经验谈&#xff0e;许多部分看完后都会希望自己当时就能够了解&#xff0c;所以很推荐不论是新手或是老手都要好好阅读这一篇文章。 故事很长&#xff0c;一切从 1997 年开始讲…

【ACM】杭电OJ 1009 (FatMouse' Trade)。

两个条件貌似缺一不可 不明白为什么不能是sum&#xff08;s[i].value*s[i].cat_food&#xff09;&#xff1b; #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;const int maxn 1010;typedef …

Java图形化:布局方式

布局方式 FlowLayout:流布局 BorderLayout:边框布局 GridLayout:网格布局FlowLayout&#xff08;流布局&#xff09; 像Word打字&#xff0c;组件从左向右排列&#xff0c;一列排满后自动换下一行。组件默认居中对齐&#xff0c;可以设置左/右对齐。流布局会维持组件的原始大小…

ARKIT/ARCore对比分析(二)

ARKit(2) ARCore 和 ARKit平台特点比对 曾与一家最大的 IMU OEM 交谈过&#xff0c;为了节省成本&#xff0c;他们的智能机IMU 在工厂中只是在单一温度下进行标定。这意味着 IMU 硬件在某一指定的温度下&#xff0c;误差被调节到最低。但当手机发热的时候&#xff0c;IMU 就不…

【ACM】杭电OJ 1789(Doing Homework again)

http://acm.hdu.edu.cn/showproblem.php?pid1789 cmp函数&#xff1a; 先按扣分由多到少进行排序&#xff0c;然后如果遇到扣分一样的&#xff0c;则先做时间少的。 vis数组&#xff1a; 最要的事&#xff0c;放在它的截至日期那一天去做&#xff0c;然后&#xff0c;之后…

推荐使用的几款Java常用基础工具库

通用工具类(字符串、时间格式化、BeanUtils、IO)1. commons-lang3库1.1. org.apache.commons.lang3.StringUtils类日常代码中&#xff0c;我们经常和String字符串打交道&#xff0c;经常对字符串进行处理&#xff0c;稍微不注意的话&#xff0c;很容易出现类似NullPointerExcep…

ARKit 与 ARCore比对(三)

ARKit 和 ARCore剖析、结构、原理介绍 ARKit 和 ARCore 都是三部分&#xff1a;相机姿态估计&#xff0c; 环境感知&#xff08;平面估计&#xff09;及光源感知。 ARCore 的部分源码&#xff1a;https://github.com/google-ar/arcore-unity-sdk/tree/master/Assets/GoogleARCo…

前端开发之retina屏幕

像素 && ppi 首先先说一下pixel(picture element)&#xff0c;显示图像的最小单位&#xff0c;有多个带色彩的像素点组成的整体就是一张图像。然后再说一下ppi(pixel per inch)这个概念&#xff0c;其实就是在每英寸显示的像素数。 设备像素 && 逻辑像素 &…