当前位置: 首页 > news >正文

2024华为软件精英挑战赛记录

  1. 前言
    本次主要是记录自己第一次参加华为软件挑战赛的经历。第一次参加比赛还是缺少经验,训练赛中拿到赛区的20多名,最后在正式赛中被反超了,只拿了40多名,实在是感到可惜。
  • 题目:本次题目是一个智慧港口的问题。10个机器人,10个泊位,5个轮船运货,轮船到虚拟点之后就可以产生价值。
  • 目标最大化价值
  1. 处理思维
    在高层思维上,本次的思维比较简单,就是让前几任在15000帧率里面都拿到货物,轮船拼命拿货。
  • 算法要求:
    • 巡路算法:本次大概有两个考虑,由于机器人只能走曼哈顿距离所以考虑就有A和BFS算法。最后尝试之后发现,A的速度比较快,但是由于其引导函数一直找不到合适的,所以求得的路径一直就不是最优的(曼哈顿距离函数做引导函数不科学),最后还是选择了最朴素的广度优先搜索算法,对其进行改进,基本上满足了帧率要求。
    • 策略:5个轮船分别分到10个一近一远的码头,这样子可以保证每个机器人的来回运输时间差不多,基本可以达到最优效果。在最后一次来码头搬货的时候,在第二个码头的时候就要压缩轮船的离开时间为最后的5帧率+自己返回码头的时间的,将时间完全利用上。机器人也是在分配码头的时候,分配一个最近,且可达的码头。
    • 碰撞挽救:由于地图的各种情况,不可避免会出现碰撞和异常问题,个人在这个方面做的最差,不然也就进决赛了。大概做了下面几个策:
      • 单通道内出现碰撞:大致就是倒车和目标交货策略。两个机器人发生碰撞,直接进行目标交换,然后pop出第一个路径即可。倒车也是种更好选择
      • 非单管道碰撞:可以选择在碰撞时候选择绕行。
# 机器人控制函数
void control_robots() {std::vector<std::pair<int, int>> robot_next; // 最新机器人坐标for (int i = 0; i < 10; ++i) {robot_next.push_back({robot[i].x, robot[i].y});}for (int robot_id : robot_list) {//改成,先判断机器人是否存在异常if(robot[robot_id].status == 0){if (robot[robot_id].goods == 1)//机器人携带货物异常{robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; robot[robot_id].berth = -1;robot[robot_id].ops.clear();search_berth(robot_id, best_robot_map[robot_id].second);}else //机器人没有携带货物发生异常,则可以搜索货物{  robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; robot[robot_id].ops.clear();search_goods( robot_id, 100, 1);}}//如果机器人有目标的话,就执行下面的操作。有目标但是不一定有货物。可能是泊位目标,也可能是货物目标if (robot[robot_id].target[0] != -1) { //有货物但是没有泊位,就搜匹配的泊位路径if (robot[robot_id].goods == 1 && robot[robot_id].berth == -1) {     search_berth(robot_id, best_robot_map[robot_id].second);          //search_berth()函数前面是机器人id,后面是泊位id}//前面不执行的话说明就是机器人是有目标,身上没货,其实就是有货物目标但是没有拿到,那么传的就是机器人目标auto target_i = robot[robot_id].target;  //不管如何,都要将机器人的目标传出去,前面如果执行目标位置就是泊位,如果不执行,目标位置就是原来的货物if (!robot[robot_id].ops.empty()) {auto DOA = robot[robot_id].ops.front();auto temp_next = direction(robot[robot_id].x, robot[robot_id].y, DOA);if (std::find(robot_next.begin(), robot_next.end(), temp_next) == robot_next.end()) {//如果当前机器人的下一个位置,在10个机器人机器人坐标里面都没有找到,则说明没有发生碰撞if (robot[robot_id].status == 1) //如果机器人status正常,处于正常状态,那么就移动机器人{robot_next.push_back(temp_next);robot[robot_id].ops.erase(robot[robot_id].ops.begin()); // 移除已执行的操作printf("move %d %d\n", robot_id, DOA);}}}//机器人到达指定位置if (robot[robot_id].x==target_i[0] && robot[robot_id].y == target_i[1] && robot[robot_id].goods == 0) { printf("get %d\n", robot_id);gds[target_i[0]][target_i[1]].reset();}//机器人到达了指定码头if (robot[robot_id].goods == 1 && robot[robot_id].x==berth[best_robot_map[robot_id].second].x && robot[robot_id].y == berth[best_robot_map[robot_id].second].y) {printf("pull %d\n", robot_id);berth[best_robot_map[robot_id].second].goods += 1;robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; // 重置目标robot[robot_id].berth = -1;search_goods( robot_id, 100, 1); //一放下货物就开始搜}}else //如果机器人没有目标的话,就搜索货物,因为没有目标的情况只有一种,就是在码头放完货的时候search_goods( robot_id, 100, 1);}
}
#轮船控制函数
void control_robots() {std::vector<std::pair<int, int>> robot_next; // 最新机器人坐标for (int i = 0; i < 10; ++i) {robot_next.push_back({robot[i].x, robot[i].y});}for (int robot_id : robot_list) {//改成,先判断机器人是否存在异常if(robot[robot_id].status == 0){if (robot[robot_id].goods == 1)//机器人携带货物异常{robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; robot[robot_id].berth = -1;robot[robot_id].ops.clear();search_berth(robot_id, best_robot_map[robot_id].second);}else //机器人没有携带货物发生异常,则可以搜索货物{  robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; robot[robot_id].ops.clear();search_goods( robot_id, 100, 1);}}//如果机器人有目标的话,就执行下面的操作。有目标但是不一定有货物。可能是泊位目标,也可能是货物目标if (robot[robot_id].target[0] != -1) { //有货物但是没有泊位,就搜匹配的泊位路径if (robot[robot_id].goods == 1 && robot[robot_id].berth == -1) {     search_berth(robot_id, best_robot_map[robot_id].second);          //search_berth()函数前面是机器人id,后面是泊位id}//前面不执行的话说明就是机器人是有目标,身上没货,其实就是有货物目标但是没有拿到,那么传的就是机器人目标auto target_i = robot[robot_id].target;  //不管如何,都要将机器人的目标传出去,前面如果执行目标位置就是泊位,如果不执行,目标位置就是原来的货物if (!robot[robot_id].ops.empty()) {auto DOA = robot[robot_id].ops.front();auto temp_next = direction(robot[robot_id].x, robot[robot_id].y, DOA);if (std::find(robot_next.begin(), robot_next.end(), temp_next) == robot_next.end()) {//如果当前机器人的下一个位置,在10个机器人机器人坐标里面都没有找到,则说明没有发生碰撞if (robot[robot_id].status == 1) //如果机器人status正常,处于正常状态,那么就移动机器人{robot_next.push_back(temp_next);robot[robot_id].ops.erase(robot[robot_id].ops.begin()); // 移除已执行的操作printf("move %d %d\n", robot_id, DOA);}}}//机器人到达指定位置if (robot[robot_id].x==target_i[0] && robot[robot_id].y == target_i[1] && robot[robot_id].goods == 0) { printf("get %d\n", robot_id);gds[target_i[0]][target_i[1]].reset();}//机器人到达了指定码头if (robot[robot_id].goods == 1 && robot[robot_id].x==berth[best_robot_map[robot_id].second].x && robot[robot_id].y == berth[best_robot_map[robot_id].second].y) {printf("pull %d\n", robot_id);berth[best_robot_map[robot_id].second].goods += 1;robot[robot_id].target[0] = -1;robot[robot_id].target[1] = -1; // 重置目标robot[robot_id].berth = -1;search_goods( robot_id, 100, 1); //一放下货物就开始搜}}else //如果机器人没有目标的话,就搜索货物,因为没有目标的情况只有一种,就是在码头放完货的时候search_goods( robot_id, 100, 1);}
}

写在最后:由于代码较长,版幅有限所以就把资源放到个人哪里,明年再战。
2024年3月25日于深圳大学

相关文章:

2024华为软件精英挑战赛记录

前言 本次主要是记录自己第一次参加华为软件挑战赛的经历。第一次参加比赛还是缺少经验&#xff0c;训练赛中拿到赛区的20多名&#xff0c;最后在正式赛中被反超了&#xff0c;只拿了40多名&#xff0c;实在是感到可惜。 题目&#xff1a;本次题目是一个智慧港口的问题。10个机…...

数据可视化艺术:Matplotlib与Seaborn实战

目录 1.Matplotlib基础绘图与定制化 1.1. 基础绘图 1.2. 定制化 2.Seaborn高级图表类型与样式设定 2.1. 高级图表类型 2.2. 样式设定 3.实战&#xff1a;绘制多维度数据可视化报告 4.总结 1. 前言 在数据科学领域&#xff0c;数据可视化扮演着至关重要的角色。通过图形化…...

python初级第一次作业

一、 dayint(input("enter today day")) fdayint(input("enter num of day since today")) c((fday%7)day)%7 if c0:print("sunday") elif c1:print("monday") elif c2:print("tuesday") elif c3:print("wendnsday&quo…...

Spring Boot整合Camunda打造高效工作流程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…...

2.8、下拉刷新与上拉加载

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。 实现思路 以下拉刷新为例,其实现主要分成三步: 监听手指按下事件,记录…...

java Web餐馆订单管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 餐馆订单管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…...

小程序从入门到入坑:事件系统

前言 哈喽大家好&#xff0c;我是 SuperYing&#xff0c;本文是小程序从入门到入坑系列的第 3 篇&#xff0c;将比较详尽的讲解 小程序事件系统 的相关知识点&#xff0c;欢迎小伙伴阅读。 读完本文您将收获&#xff1a; 了解小程序事件及基础使用。了解小程序事件分类及多种的…...

Windows蓝牙驱动开发之模拟HID设备(二)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)

by fanxiushu 2024-03-24 转载或引用请注明原作者 接上文,当我们建立了蓝牙链接请求之后,就该传输数据了, 其实传输数据比起上章阐述的创建SDP和建立连接要简单许多。 使用类型 BRB_L2CA_ACL_TRANSFER 的BRB请求,就可以实现接收和发送操作, 至于具体是接收还是发送,根据设…...

快速区分清楚图形渲染中的AABB,KD树和BVH这些概念

快速区分清楚图形渲染中的AABB&#xff0c;KD树和BVH这些概念 主要想形象去区分好这些术语&#xff0c;目的是扫盲&#xff0c;先开好坑&#xff0c;内容持续填充。 0.先摆出这些词的全称 AABB&#xff1a; 原名&#xff1a;axis aligned bounding box&#xff1b;中文直译名…...

Rust 的 HashMap 特定键值元素值的累加方法

在Rust中&#xff0c;如果你想要对HashMap中特定键对应的值进行累加操作&#xff0c;你需要首先检查该键是否已存在。如果存在&#xff0c;则取出其值&#xff0c;进行累加&#xff0c;然后将结果存回HashMap。如果不存在&#xff0c;则可能需要插入一个新的键值对&#xff0c;…...

Java后端项目性能优化实战-群发通知

背景 公司群发通知模块性能存在问题&#xff0c;我进行全面的系统调优&#xff0c;系统处理能力大幅提升。 原发送流程 优化后的发送流程 优化的点 说明&#xff1a;以下问题基本都是压测过程遇到的&#xff0c;有些问题普通的功能测试暴露不了。优化目标&#xff1a;保证高…...

5、Jenkins持续集成-Maven和Tomcat的安装与配置

文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…...

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件

目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中&#xff0c;布局管理器&#xff08;Layouts&#xff09;是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…...

自动驾驶的几种名词

1. 自适应巡航控制&#xff08;ACC&#xff09; 自适应巡航控制&#xff08;Adaptive Cruise Control&#xff0c;ACC&#xff09;是一种汽车驾驶辅助系统&#xff0c;它可以根据前方车辆的速度和距离自动调整车辆的速度&#xff0c;以保持与前车的安全距离。ACC系统由控制层和…...

华为全套企业管理资料合集(21专题)

华为全套企业管理资料合集-知识星球下载 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制度.docx 华为公司实用性各种绩效图表汇总.doc 华为公司考勤管理制度.doc 华为IPD模式中跨部门团队成员的考核激励制度.doc 2.企业管理 华为公司人力资源…...

LeetCode Python - 74. 搜索二维矩阵

目录 题目描述解法方法一&#xff1a;二分查找方法二&#xff1a;从左下角或右上角搜索 运行结果方法一方法二 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给…...

如何安全地添加液氮到液氮罐中

液氮是一种极低温的液体&#xff0c;它在许多领域广泛应用&#xff0c;但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作&#xff0c;需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…...

LGBM算法 原理

简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#xff0c;通常被…...

【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例

在WPF&#xff08;Windows Presentation Foundation&#xff09;开发中&#xff0c;TextBlock控件是一个常用的元素&#xff0c;用于显示静态或动态文本内容。它提供了丰富的属性和事件&#xff0c;使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…...

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…...

【C语言】C语言经典小游戏:贪吃蛇(下)

文章目录 一、游戏前准备二、游戏开始1、游戏开始函数&#xff08;GameStart&#xff09;1&#xff09;打印欢迎界⾯&#xff08;WelcomeToGame&#xff09;2&#xff09;创建地图&#xff08;CreateMap&#xff09;3&#xff09;初始化蛇⾝&#xff08;InitSnake&#xff09;4…...

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…...

虚拟机CentOS 7 网络连接显示“以太网(ens33,被拔出)“、有线已拔出、CentOS7不显示网络图标

文章目录 一、问题描述二、解决方法1、查看网络连接方式2、开启相关服务3、确认虚拟机网络连接 一、问题描述 问题描述&#xff1a;在VmWare中安装CentOS7, 启动后界面不显示网络的图标。 在GONE桌面—》设置中找到网络设置&#xff0c;发现显示线缆已拔出。 二、解决方法 …...

c++中的输入输出流(标准IO,文件IO,字符串IO)

目录 &#xff08;1&#xff09;I/O概述 I/O分类 不同I/O的继承关系 不同I/O对应的头文件 &#xff08;2&#xff09;iostream 标准I/O流 iostream头文件中的IO流对象 iostream头文件中重载了<<和>> 缓冲区示意图 标准输入流 cin用法 cin&#xff1a;按空…...

AIGC赋能前端开发

一、引言&#xff1a;AIGC对前端开发的影响 1. AIGC与前端开发的关系 从“写代码”到“生成代码”传统开发痛点&#xff1a;重复性编码工作、UI 设计稿还原、问题定位与调试...核心场景的AI化&#xff1a;需求转代码&#xff08;P2C&#xff09;、设计稿转代码&#xff08;D2…...

AI Infra运维实践:DeepSeek部署运维中的软硬结合

发布会资料 《AI Infra运维实践&#xff1a;DeepSeek部署运维中的软硬结合》 袋鼠云运维服务 1、行业痛点 随着数字化转型的深入&#xff0c;企业面临的运维挑战日益复杂&#xff0c;所依托的平台在长期使用的过程中积累了各式各样的问题或者难点。这些问题不仅影响效率&…...

【学习笔记】构造函数+重载相关

【学习笔记】构造函数重载相关 一、构造函数 构造函数在创建对象的过程就会执行&#xff0c;带参数与不带参数&#xff0c;带参数的构造函数会默认将成员变量赋值传进去的参数。 class Layer { private:int layer_id; // 层IDstd::string layer_json; // 层的JSON配置…...

idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题

1、删除本地仓库中的文件 进入本地仓库对应jar包文件目录中删除_remote.repositories文件和结尾为.lastUpdated的文件 2、回到IDEA刷新Maven 3、查看之前引用不了的jar是否引入成功...

山西省第十八届职业院校技能大赛 网络建设与运维赛项 样题

山西省第十八届职业院校技能大赛 网络建设与运维赛项 &#xff08;学生组&#xff09; 样题 2024 年 11 月 xx 日 2 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为模块一&#xff1a;网络理论测试与网络 运维&#xff1b;模块二&#xff1a; 网络建设与调试&a…...

【数据结构】树形结构--二叉树(二)

【数据结构】树形结构--二叉树&#xff08;二&#xff09; 一.二叉树的实现1.求二叉树结点的个数2.求二叉树叶子结点的个数3.求二叉树第k层结点的个数4.求二叉树的深度&#xff08;高度&#xff09;5.在二叉树中查找值为x的结点6.判断二叉树是否为完全二叉树7.二叉树的销毁 一.…...