康托展开 双向广搜

康托展开:

        公式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0!;

      利用这个公式,我们可以求出在一列数中,已知的这一列数是这列数的全排列的字典序中的的几个。我们可以应用康拓展开来求出一列数的全排列,也可以用康托展开进行判重。

int KT(int n,int s[])
{
	int i,j,sum=0,t=0;
	for(i=0;i<n;++i)
	{
		t=0;
		for(j=i+1;j<n;++j)
		  if(s[j]<s[i])
		    t+=1;
		sum+=t*fac[n-i-1];
	}
	return sum+1;
}



双向广搜:

 双向广搜:
    当已知目标状态和起始状态时,在搜素时可以选择双向广搜,双向广搜,这样在搜索时的时间复杂度就由原来的b^len缩小到2*b^(len/2),同时空间也会缩小,只要在搜索时多开一个队列,当在这个队列中的状态已经在另一个队列中出现时,就可以停止搜索了,但其中有一个需要注意的问题,这也是为什么我的第一个双向广搜做了好久才A的原因:
    在搜索时,我们不应该交替节点搜索:
      
while(  )
{
        扩展一个正向的节点;
        if(达到状态)
        {
                break;
        } 
        扩展一个反向的节点
        if(达到状态)
        {
              break;
        } 
}     
    这种搜索方法是有问题的,当我们在逐个扩展时,可能会等不到这一层的最优解被扩展出就停止搜索了

S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时

Step 1 : S –> 1 , 2

Step 2 : T –> 3 , 4

Step 3 : 1 –> 5

Step 4 : 3 –> 5   返回最短路为4,错误的,事实是3S-2-4-T
    所以当我们在进行搜索时,应该把正向或反向的队列的这一步中的状态全部扩展完以后,再去扩展另一个方向中的队列,这样我们就可以保证不会出现最优的情况还没有被搜索出来的时候就已经break掉了。



例题:   codevs         1225 八数码难题
 
题目描述 Description

Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.
问题描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。  
输入描述 Input Description
输入初试状态,一行九个数字,空格用0表示
输出描述 Output Description
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
样例输入 Sample Input
283104765
样例输出 Sample Output
4


题解: 在这个题中,我们已知起始状态和目标状态,此时就可以利用双向广搜去解决,但在搜索的过程中还有一个小问题,就是判重的问题,因为这是3*3的方格,所以如果我们把每一个格用一位数字保存的话,布尔数组就会开到9位,内存是不允许的,所以这个时候我们可以选择用康托展开判重,这样空间复杂度就变成了9!,就可以实现了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct point 
{
	int b[3][3],xx,yy;
}l[1000000][3];
int fac[10]={1,1,2,6,24,120,720,5040,40320,362880};
int c[1000000][3]={0},h1,h2,t1,t2,xi[4]={-1,0,0,1},yi[4]={0,-1,1,0},en[9]={1,2,3,8,0,4,7,6,5};
char a[10];
bool f[500000][3],ff=false;
int KT(int s[])
{
	int i,j,sum=0,t=0;
	for(i=0;i<9;++i)
	{
		t=0;
		for(j=i+1;j<9;++j)
		  if(s[j]<s[i])
		    t+=1;
		sum+=t*fac[9-i-1];
	}
	return sum+1;
}
int change(int x,int y)
{
	int i,j,aaa[9];
	for(i=0;i<3;++i)
	  for(j=0;j<3;++j)
	    aaa[i*3+j]=l[x][y].b[i][j];
	return KT(aaa);
}
int main()
{
	int i,j,xxx,yyy,aa,bb,k,u;
	scanf("%s",&a);
	memset(f,1,sizeof(f));
	for(i=0;i<9;++i)
	{
		l[1][1].b[i/3][i%3]=a[i]-'0'; l[1][2].b[i/3][i%3]=en[i];
		if(a[i]=='0')  l[1][1].xx=i/3, l[1][1].yy=i%3;
		if(en[i]==0)  l[1][2].xx=i/3, l[1][2].yy=i%3;
	}
	aa=change(1,1); bb=change(1,2);
	f[aa][1]=false; f[bb][2]=false; h1=h2=t1=t2=1; 
	while(h1<=t1&&h2<=t2)
	{
		for(i=0;i<4;++i)
		{
			xxx=l[h1][1].xx+xi[i]; yyy=l[h1][1].yy+yi[i];
			if(xxx>=0&&xxx<3&&yyy>=0&&yyy<3)
			{
				for(j=0;j<3;++j)
				  for(k=0;k<3;++k)
				    l[t1+1][1].b[j][k]=l[h1][1].b[j][k];
				l[t1+1][1].xx=xxx; l[t1+1][1].yy=yyy;
				l[t1+1][1].b[xxx][yyy]=0; l[t1+1][1].b[l[h1][1].xx][l[h1][1].yy]=l[h1][1].b[xxx][yyy];
			    u=change(t1+1,1);
			    if(f[u][1])
			    {
			    	t1+=1; c[t1][1]=c[h1][1]+1; f[u][1]=false;
			    	if(!f[u][2]) 
					{
					    ff=true; 
					    for(int k=1;k<=t2;++k)
					      if(change(k,2)==u)
					      {
						      printf("%d\n",c[t1][1]+c[k][2]);
						      break;
						  }
						break;
					}
			    }
			}
		}
		if(ff) break;
		h1+=1;
		for(i=0;i<4;++i)
		{
			xxx=l[h2][2].xx+xi[i]; yyy=l[h2][2].yy+yi[i];
			if(xxx>=0&&xxx<3&&yyy>=0&&yyy<3)
			{
				for(j=0;j<3;++j)
				  for(k=0;k<3;++k)
				    l[t2+1][2].b[j][k]=l[h2][2].b[j][k];
				l[t2+1][2].xx=xxx; l[t2+1][2].yy=yyy;
				l[t2+1][2].b[xxx][yyy]=0; l[t2+1][2].b[l[h2][2].xx][l[h2][2].yy]=l[h2][2].b[xxx][yyy];
			    u=change(t2+1,2);
			    if(f[u][2])
			    {
			    	t2+=1; c[t2][2]=c[h2][2]+1; f[u][2]=false;
			    	if(!f[u][1]) 
					{ 
					    ff=true; 
					    for(int k=1;k<=t1;++k)
					      if(change(k,1)==u)
					      {
						      printf("%d\n",c[t2][2]+c[k][1]);
						      break;
						  }
					    break;
					}
			    }
			}
		}
		if(ff) break;
		h2+=1;
	}
}



C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)​ 内容概要:本文围绕动态环境下多无人机系统的协同路径规划与防撞问题展开研究,提出基于Matlab的仿真代码实现方案。研究重点在于在复杂、动态环境中实现多无人机之间的高效协同飞行与避障,涵盖路径规划算法的设计与优化,确保无人机集群在执行任务过程中能够实时规避静态障碍物与动态冲突,保障飞行安全性与任务效率。文中结合智能优化算法,构建合理的成本目标函数(如路径长度、飞行高度、威胁规避、转弯角度等),并通过Matlab平台进行算法验证与仿真分析,展示多机协同的可行性与有效性。; 适合人群:具备一定Matlab编程基础,从事无人机控制、路径规划、智能优化算法研究的科研人员及研究生。; 使用场景及目标:①应用于灾害救援、军事侦察、区域巡检等多无人机协同任务场景;②目标是掌握多无人机系统在动态环境下的路径规划与防撞机制,提升协同作业能力与自主决策水平;③通过Matlab仿真深入理解协同算法的实现逻辑与参数调优方法。; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注目标函数设计、避障策略实现与多机协同逻辑,配合仿真结果分析算法性能,进一步可尝试引入新型智能算法进行优化改进。
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 StudentInfo 基于SSM的学生信息管理系统(选课) 已停更 项目简介: 由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。 前端主要由bootstrap完成,背景用particles.js插件。 数据库交互查询用到pagehelper分页。 在添加修改相关功能时通过ajax来验证其主键是否存在可用。 代码层次清晰,输入框约束较高,已配置登录拦截。 一、应用技术 #### 工具:eclipse、navicat 环境:JDK1.8、tomcat9.0、mysql8.0 前端:JavaScript、jQuery、bootstrap4、particles.js 后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页 二、功能 #### 这是在上个springmvc选课系统的基础上进行修改完善的,目前功能基本相同,修复诸多bug,上个系统中有详细介绍:B/S基于springMVC的网上选课系统 主要功能模块图: 新增: 增加分页查询 输入框约束 学号、身份证、课程编号、教师编号只能输入数字,并且有最大输入限制,其中学号固定12位,若小于12位将会有提示。 姓名只能输入中文。 几乎所有输入框不能输入空格等约束 下拉框联动 添加、修改课程采用二级联动,即所属系别——所属专业; 添加、修改学生采用三级联动,即系别——专业——班级。 (三级联动代码有些复杂,因为JavaScript学的不好=-=)。 ajax+springmvc验证 用于验证学号、课程编号、教师...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值