做网站是不是就能上传东西,嘉兴网站备案去哪里,wordpress主题企业,怎么样自己做网站IDA*
定义
IDA*#xff08;Iterative Deepening A*#xff09;是一种结合了深度优先搜索#xff08;DFS#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。
IDA* 是…IDA*
定义
IDA*Iterative Deepening A*是一种结合了深度优先搜索DFS的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题尤其是当搜索空间很大或者搜索成本不确定时。
IDA* 是一种最佳优先搜索算法其基本思想是在深度优先搜索的基础上通过逐步增加搜索深度并结合A*算法中的估价函数f(n)g(n)h(n)来找到从初始节点到目标节点的最短路径。其中g(n)是从初始节点到当前节点的实际代价h(n)是从当前节点到目标节点的启发式估计代价。
运用情况
内存限制: IDA特别适合那些内存有限制的环境因为它不像A那样需要维护一个开放列表open list而是采用递归的方式逐步深入搜索。未知或变化的成本: 当搜索空间中节点的移动成本不是预先完全已知或可能变化时IDA*通过逐步探索来适应这种不确定性。最优解搜索: 当寻找问题的最优解而非任一解时IDA*通过其最佳优先的特性保证找到的是从起点到终点的最短路径。大型或无限状态空间: 对于状态空间非常大或理论上无限的情况IDA*通过逐步加深搜索深度来逐步逼近解避免了一次性需要大量内存来存储整个搜索树的问题。
注意事项
启发式函数的选择: h(n)的选择至关重要它需要保证不大于实际的最小代价否则算法可能不会终止。理想的h(n)接近实际成本但又易于计算。深度限制: 初始时设置一个合理的深度限制随着搜索的进行逐渐增加直到找到解或达到某个预设的深度上限。效率: 虽然IDA避免了A中的开放列表维护但如果启发式不够好或搜索空间极大递归调用可能会导致大量的重复计算和较慢的收敛速度。栈溢出风险: 由于使用递归如果搜索深度过大可能会导致栈溢出。在实现时可以考虑使用迭代版本来避免这一问题。
解题思路
初始化: 设定初始深度限制d0以及一个足够大的上限D作为退出条件。计算阈值: 使用当前深度限制计算f(n)的阈值即f_limit g(start) d * h(start)其中g(start)0因为是从初始节点开始。深度优先搜索: 从初始节点开始执行深度优先搜索只有当节点的f(n)g(n)h(n)小于当前的f_limit时才继续扩展该节点的子节点。递归加深: 如果在当前深度限制下没有找到解则增加深度限制dd1回到步骤2继续搜索。结束条件: 当搜索到目标节点或达到预设的深度上限D时结束搜索。
AcWing 180. 排书
题目描述
180. 排书 - AcWing题库 运行代码
#include iostream
#include cstring
#include algorithm
const int N 15; // 书的数量上限
using namespace std;
int n; // 实际的书的数量
int q[N]; // 存储书的初始排列
int w[5][N]; // 辅助数组用于在搜索过程中保存中间状态
// 估价函数计算当前状态与目标状态的差异返回还需要多少步才能达到目标状态
int f() { int tot 0;for (int i 0; i 1 n; i) {if (q[i 1]! q[i] 1) {tot;}}return (tot 2) / 3;
}
// 深度优先搜索函数
bool dfs(int depth, int max_depth) { if (depth f() max_depth) { // 如果当前深度加上估计的剩余深度超过了限制深度进行剪枝return false; }if (f() 0) { // 如果估价函数为0说明已经达到目标状态return true; }for (int len 1; len n; len) { // 枚举要移动的连续段的长度for (int l 0; l len - 1 n; l) { // 枚举连续段的起始位置int r l len - 1; for (int k r 1; k n; k) { // 枚举要插入的位置连续段的结束位置的后面memcpy(w[depth], q, sizeof q); // 复制当前状态到辅助数组int y l; for (int x r 1; x k; x, y) { // 将连续段插入到指定位置q[y] w[depth][x]; }for (int x l; x r; x, y) {q[y] w[depth][x]; }if (dfs(depth 1, max_depth)) { // 递归搜索下一层return true; }memcpy(q, w[depth], sizeof q); // 如果不成功恢复当前状态 }}}return false;
}
int main() { int T; cin T; while (T--) { cin n; for (int i 0; i n; i) {cin q[i]; }int depth 0; // 迭代加深搜索从深度0开始每次增加1直到找到解或者深度达到5while (depth 5 !dfs(0, depth)) { depth; }if (depth 5) {cout 5 or more endl; } else {cout depth endl; }}return 0;
}
代码思路
估价函数 f()用于估计从当前状态到达目标状态书按照 1∼n 的顺序依次排列还需要的最少操作次数。通过计算当前排列中顺序不正确的后继关系的数量 tot 然后返回 (tot 2) / 3 作为估计值。这是因为每次移动一个连续段最多可以改变 3 个元素的后继关系。dfs(int depth, int max_depth) 函数进行深度优先搜索。 参数 depth 表示当前搜索的深度即已经进行的操作次数。max_depth 是限制的最大深度。如果在当前深度 depth 下加上估计的还需要的最少操作次数 f() 超过了 max_depth 就意味着即使后面按照最优方式操作也无法在限制深度内达到目标状态此时进行剪枝直接返回 false 不再继续搜索该路径。通过三重循环来枚举移动连续段的长度、起始位置和插入位置模拟进行抽取连续段并插入到其他位置的操作。在每次尝试一种可能的操作后递归调用 dfs(depth 1, max_depth) 搜索下一层。如果找到解即达到目标状态则返回 true 否则恢复原来的状态通过 memcpy(q, w[depth], sizeof q); 继续尝试其他可能的操作。主函数中的迭代加深搜索从深度 0 开始每次增加 1调用 dfs(0, depth) 进行搜索。如果在深度小于等于 4 时找到了解就输出对应的操作次数如果直到深度达到 5 还没有找到解就输出 5 or more 。
改进思路
优化内存使用可以减少使用的辅助数组数量或者使用更高效的数据结构来存储中间状态。改进剪枝策略可以进一步优化估价函数使其更加准确从而增强剪枝效果减少不必要的搜索。优化循环结构对于一些循环的边界条件和步长进行优化以减少不必要的计算。
改进代码
#include iostream
#include cstring
#include algorithmconst int N 15; // 书的数量上限int n; // 实际的书的数量
int q[N]; // 存储书的初始排列// 估价函数计算当前状态与目标状态的差异返回还需要多少步才能达到目标状态
int f() { int tot 0;for (int i 0; i 1 n; i) {if (q[i 1]! q[i] 1) {tot;}}return (tot 2) / 3;
} // 深度优先搜索函数
bool dfs(int depth, int max_depth) { if (depth f() max_depth) { // 如果当前深度加上估计的剩余深度超过了限制深度进行剪枝return false; }if (f() 0) { // 如果估价函数为0说明已经达到目标状态return true; }for (int len 1; len n; len) { // 枚举要移动的连续段的长度for (int l 0; l len - 1 n; l) { // 枚举连续段的起始位置int r l len - 1; for (int k r 1; k n; k) { // 枚举要插入的位置连续段的结束位置的后面int temp[N];memcpy(temp, q, sizeof(q)); // 复制当前状态int y l; for (int x r 1; x k; x, y) { // 将连续段插入到指定位置q[y] temp[x]; }for (int x l; x r; x, y) {q[y] temp[x]; }if (dfs(depth 1, max_depth)) { // 递归搜索下一层return true; }memcpy(q, temp, sizeof(q)); // 如果不成功恢复当前状态 }}}return false;
} int main() { int T; std::cin T; while (T--) { std::cin n; for (int i 0; i n; i) {std::cin q[i]; }int depth 0; // 迭代加深搜索从深度0开始每次增加1直到找到解或者深度达到5while (depth 5 !dfs(0, depth)) { depth; }if (depth 5) {std::cout 5 or more std::endl; } else {std::cout depth std::endl; }}return 0;
}
文章转载自: http://www.morning.27asw.cn.gov.cn.27asw.cn http://www.morning.pzrnf.cn.gov.cn.pzrnf.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.frpfk.cn.gov.cn.frpfk.cn http://www.morning.xdpjf.cn.gov.cn.xdpjf.cn http://www.morning.mdlqf.cn.gov.cn.mdlqf.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.dmwck.cn.gov.cn.dmwck.cn http://www.morning.kqgsn.cn.gov.cn.kqgsn.cn http://www.morning.rqlf.cn.gov.cn.rqlf.cn http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn http://www.morning.ksggl.cn.gov.cn.ksggl.cn http://www.morning.kpxzq.cn.gov.cn.kpxzq.cn http://www.morning.xdpjf.cn.gov.cn.xdpjf.cn http://www.morning.hxgly.cn.gov.cn.hxgly.cn http://www.morning.qsy37.cn.gov.cn.qsy37.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.drytb.cn.gov.cn.drytb.cn http://www.morning.qkbwd.cn.gov.cn.qkbwd.cn http://www.morning.xnymt.cn.gov.cn.xnymt.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.ltywr.cn.gov.cn.ltywr.cn http://www.morning.npqps.cn.gov.cn.npqps.cn http://www.morning.rqhbt.cn.gov.cn.rqhbt.cn http://www.morning.tsyny.cn.gov.cn.tsyny.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.jbshh.cn.gov.cn.jbshh.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.xphcg.cn.gov.cn.xphcg.cn http://www.morning.txjrc.cn.gov.cn.txjrc.cn http://www.morning.smyxl.cn.gov.cn.smyxl.cn http://www.morning.gqfks.cn.gov.cn.gqfks.cn http://www.morning.rwrn.cn.gov.cn.rwrn.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn http://www.morning.gqfbh.cn.gov.cn.gqfbh.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.hphrz.cn.gov.cn.hphrz.cn http://www.morning.qxwwg.cn.gov.cn.qxwwg.cn http://www.morning.httpm.cn.gov.cn.httpm.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.hqxyt.cn.gov.cn.hqxyt.cn http://www.morning.rkdw.cn.gov.cn.rkdw.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.tqfnf.cn.gov.cn.tqfnf.cn http://www.morning.cnxpm.cn.gov.cn.cnxpm.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.snnkt.cn.gov.cn.snnkt.cn http://www.morning.zpqk.cn.gov.cn.zpqk.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.sjjtz.cn.gov.cn.sjjtz.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.yrngx.cn.gov.cn.yrngx.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.yfstt.cn.gov.cn.yfstt.cn http://www.morning.fbqr.cn.gov.cn.fbqr.cn http://www.morning.npkrm.cn.gov.cn.npkrm.cn http://www.morning.snnwx.cn.gov.cn.snnwx.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.bqdpy.cn.gov.cn.bqdpy.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.aa1585.com.gov.cn.aa1585.com http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn http://www.morning.hmwjk.cn.gov.cn.hmwjk.cn http://www.morning.crrmg.cn.gov.cn.crrmg.cn http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn