当前位置: 首页 > 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函数的使用 学海无涯苦作…...

隐蔽通信技术:原理、实现与应用

1. 隐蔽通信技术概述隐蔽通信&#xff08;Covert Communication&#xff09;是一种特殊的信息传输技术&#xff0c;其核心目标是实现低检测概率&#xff08;Low Probability of Detection, LPD&#xff09;的通信。与传统的加密通信不同&#xff0c;隐蔽通信不仅保护通信内容的…...

使用vscode 搭建Java 开发环境

vscode 是一款开源&#xff0c;免费的代码编译环境&#xff0c;有丰富的插件可以选择&#xff0c;这篇文章就从配置Java环境介绍一下vscode使用的原理。 下载配置Java 从官网下载jdk安装了之后&#xff0c;直接安装即可&#xff0c;这里我安装了jdk1.8和jdk22&#xff0c;这里…...

Cowrie SSH蜜罐:协议层行为建模与威胁情报流水线

1. 为什么一个SSH蜜罐能比防火墙更早告诉你“有人在敲门” 你有没有过这种经历&#xff1a;某天凌晨三点&#xff0c;安全告警平台突然弹出一条“SSH暴力破解尝试激增”&#xff0c;点开一看——IP来自巴西、乌克兰、越南&#xff0c;每秒27次登录请求&#xff0c;用户名穷举了…...

DMA优化与MIMO系统性能分析:6G通信关键技术

1. DMA优化与MIMO系统性能分析概述动态超表面天线&#xff08;Dynamic Metasurface Antenna, DMA&#xff09;作为6G通信系统的关键技术突破&#xff0c;正在重新定义大规模MIMO系统的设计范式。与传统的相控阵天线相比&#xff0c;DMA通过可编程的超表面单元实现对电磁波的精确…...

gmapping算法源码实现分析(一)

gmapping算法源码实现分析&#xff08;一&#xff09; —— slam-gmapping功能包主干流程分析 1. slam_gmapping.cpp 初始化流程: SlamGmapping() 构造函数├─> init() - 创建 GridSlamProcessor 实例&#xff0c;读取参数└─> startLiveSlam() - 设置订阅和回调├─&g…...

Outlook与Gmail OAuth 2.0 Proxy 实现原理与工程实践

1. 这不是“多此一举”&#xff0c;而是绕不开的现实堵点你写了个邮件聚合工具&#xff0c;用户点击“用 Outlook 登录”——页面跳转到微软登录页&#xff0c;输入账号密码&#xff0c;授权完成&#xff0c;回调地址收到一个 code。你兴冲冲拿它去换 access_token&#xff0c;…...

defx.nvim 高级操作技巧:50+动作命令提升文件管理效率

defx.nvim 高级操作技巧&#xff1a;50动作命令提升文件管理效率 【免费下载链接】defx.nvim :file_folder: The dark powered file explorer implementation for neovim/Vim8 项目地址: https://gitcode.com/gh_mirrors/de/defx.nvim defx.nvim 是一款功能强大的 Neovi…...

2026电工杯数学建模竞赛A题论文、代码、数据

2026年电工杯数学建模竞赛A题完整论文 摘要 随着” 双碳” 战略深入推进&#xff0c;新能源消纳难的问题日益凸显&#xff0c;绿电直连型电氢氨园区成为解决新能源就近消纳和化工行业深度脱碳的重要路径。本文针对绿电直连型电氢氨园区的优化运行问题&#xff0c;基于风电 40MW…...

如何用OneNote Markdown插件快速提升笔记效率:终极指南

如何用OneNote Markdown插件快速提升笔记效率&#xff1a;终极指南 【免费下载链接】NoteWidget Markdown add-in for Microsoft Office OneNote 项目地址: https://gitcode.com/gh_mirrors/no/NoteWidget 还在为OneNote复杂的格式调整而烦恼吗&#xff1f;想象一下&…...

Pikachu暴力破解实战:Burp Suite爆破思维训练全解析

1. 这不是“练手”&#xff0c;是真实世界暴力破解的完整沙盘推演很多人第一次点开Pikachu漏洞练习平台的“暴力破解”模块时&#xff0c;下意识觉得&#xff1a;“不就是写个脚本跑密码字典嘛&#xff1f;Python requests for循环&#xff0c;十分钟搞定。”我当年也是这么想…...