还不会ida*算法?看完这篇或许能理解点。
IDA*
算法分析
IDA* 本质上就是带有估价函数和迭代加深优化的dfs与,A * 相似A *的本质便是带
有估价函数的bfs,估价函数是什么呢?估价函数顾名思义,就是估计由目前状态达
到目标状态的总费用,这个费用可以是距离,可以是路程,估价函数用于对dfs过
程进行优化,由当前状态借助估价函数判断怎么搜索更优,从而去走较优的状态,
\]
\(f(n)\)就是我们的估价函数,\(n\)表示当前状态,\(g(n)\)表示由当前状态的费用,
\(h(n)\)当前状态到目标状态的费用,估价函数的设计因题而异,一道题的估价函数
也有很多种,不同设计方案对dfs起到的优化作用不同,\(h(n)\)设计的越准确,对dfs
的优化越高,但如果求h(n)太复杂也没有什么实际意义,也就是说,\(h(n)\)不保证绝对准确
介绍完估价函数,我们再来介绍迭代加深优化,什么是迭代加深优化?其本质就是对
搜索层数进行限制,避免无意义的搜索,比如需要找到的答案在搜索树的第四层,我
们先搜第一层,设置搜索上限深度为1 ,我们搜索搜索树的第一层,没找到答案,停
止搜索,搜索上限+1,继续从起点进行搜索,直到找到答案,为什么这样可以对dfs起
到优化?考虑一颗深度非常大,并且答案在较小层的右侧的树,如果普通进行dfs明
显是很慢的,这时候IDA * 的优点就显现出来了
例题
以此题举例
下面是代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=100;
int t;
char ca;
int x1,y1;
int map[maxn][maxn];
int cr[maxn][maxn]={
{0,0,0,0,0,0},
{0,1,1,1,1,1},
{0,0,1,1,1,1},
{0,0,0,2,1,1},
{0,0,0,0,0,1},
{0,0,0,0,0,0}
};//目标状态
int gu(){//估价函数
int cnt=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(map[i][j]!=cr[i][j]){
cnt++;
}
}
}
return cnt;
}
bool success=0;
int y2[maxn]={0,2,-2,2,-2,1,-1,1,-1};
int x2[maxn]={0,-1,-1,1,1,2,2,-2,-2};
void astar(int deep,int x,int y,int us){
if(us==deep){
if(!gu()){
success=1;
// cout<<1;
return ;
}
}
for(int i=1;i<=8;i++){
int xx=x;
int yy=y;
xx=x+x2[i];
yy=y+y2[i];
if(xx<1||xx>5||yy>5||yy<1){
continue;
}
swap(map[xx][yy],map[x][y]);
// cout<<xx<<" "<<yy<<" "<<x<<" "<<y<<endl;
if(us+gu()>deep){
swap(map[xx][yy],map[x][y]);
continue;
}
if(success){
return ;
}
astar(deep,xx,yy,us+1);
swap(map[xx][yy],map[x][y]);
}
return ;
}
int main(){
freopen("a.txt","r",stdin);
cin>>t;
while(t--){
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
cin>>ca;
// cout<<ca<<" ";
if(ca=='*'){
x1=i;
y1=j;
map[i][j]=2;
// cout<<map[i][j]<<" ";
}
else{
map[i][j]=ca-'0';
// cout<<map[i][j]<<" ";
}
}
// cout<<endl;
}
// cout<<gu();
if(!gu()){
cout<<-1;//所给的图符合题意,所以直接结束,此处剪枝优化比较明显
return 0;
}
for(int i=1;i<=15;i++){
astar(i,x1,y1,0);
if(success){
cout<<i<<endl;
break;
}
}
if(!success){
cout<<-1<<endl;
}
success=0;
}
return 0;
}
完结撒花
还不会ida*算法?看完这篇或许能理解点。的更多相关文章
- 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?
简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...
- [转帖]看完这篇文章你还敢说你懂JVM吗?
看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...
- 看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
引言 在 android 开发过程中,我们经常需要对一些手势,如:单击.双击.长按.滑动.缩放等,进行监测.这时也就引出了手势监测的概念,所谓的手势监测,说白了就是对于 GestureDetector ...
- [转帖]看完这篇文章,我奶奶都懂了https的原理
看完这篇文章,我奶奶都懂了https的原理 http://www.17coding.info/article/22 非对称算法 以及 CA证书 公钥 核心是 大的质数不一分解 还有 就是 椭圆曲线算法 ...
- Mysql快速入门(看完这篇能够满足80%的日常开发)
这是一篇mysql的学习笔记,整理结合了网上搜索的教程以及自己看的视频教程,看完这篇能够满足80%的日常开发了. 菜鸟教程:https://www.runoob.com/mysql/mysql-tut ...
- APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了 彻底理解android中的内部存储与外部存储 存储在内部还是外部 所有的Android设备均有两个文件存储区域:"intern ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- 看完这篇Redis缓存三大问题,保你面试能造火箭,工作能拧螺丝。
前言 日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题. 一旦涉及大数据量的需求,如一些商品抢购的情景,或者主页访问量瞬间较 ...
- 看完这篇 Linux 权限后,通透了!
我们在使用 Linux 的过程中,或多或少都会遇到一些关于使用者和群组的问题,比如最常见的你想要在某个路径下执行某个指令,会经常出现这个错误提示 . permission denied 反正我大概率见 ...
随机推荐
- MYSQL中的where ‘1=1‘ 探讨
在学习MySQL时候,关于MySQL注入的例子 首先针对以下代码,实现的是关于sql注入时,一个普通登录所产生的的问题 package com.java.lesson02; import com.ja ...
- TNFE-Weekly[第七十二周已更新]
前端行业发展飞速,新技术如雨后春笋般快速出现,尤其是各种小程序陆续推出,相关的信息.文章也铺天盖地的遍布在各处,我们有时候会困惑,不知道哪些信息对于自己是有价值的,那么TNFE-腾讯新闻前端团队启动了 ...
- Node.js向MongoDB中插入并查询数据
首先必须要保持Node.js与MongoDB保持连接 具体教程见:Node.js连接MongoDB数据库步骤 插入数据步骤如下 node项目文件如下:在routes文件夹下新建insert.js文件, ...
- XXE外部实体注入漏洞
XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...
- Unit1:Android
unit1 1.安卓版本 最新数据访问维基百科 2008年,android1.0 2011年,android3.0,平板失败 同年10月,android4.0,无差别使用 2014年,android5 ...
- [LeetCode]66. 加一(数组)
###题目 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 ...
- NOIP2017 Day1 T1 小凯的疑惑
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价 ...
- vue父子组件状态同步的最佳方式续章(v-model篇)
大家好!我是木瓜太香!一名前端工程师,之前写过一篇<vue父子组件状态同步的最佳方式>,这篇文章描述了大多数情况下的父子组件同步的最佳方式,也是被开源中国官方推荐了,在这里表示感谢! 这次 ...
- 首发!Alibaba内部:Spring源码培训课件笔记曝光!
本文包含的内容 Spring占有的市场 阅读源码的重要性 阅读源码困难度 课件笔记的主要内容 Spring占有的市场 先来简单说一下现在各个企业常用并与Spring相关的: ssh = spring ...
- 使用vue-cli(vue脚手架)快速搭建项目-2
接上一篇文章,这篇文章对如何使用IDEA打开并运行项目做教程 1.将在窗口模式启动的Vue关闭 只需要按住Ctrl+C,输入Y就可以了 2.打开idea 3.复制你项目所在地址,然后点击OK 4.下面 ...