void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return task_1.completed < task_2.completed; // 未完成的任务排在已完成的任务前面 } else { return task_1.priority < task_2.priority; // 同一完成状态下,按照优先级排序 } }); for (const auto& task : tasks) { //std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (task.completed == 0) { // 只分配未完成的任务 AGV* closest_agv = nullptr; int wait_time = 0; // 等待时间计数器 // 初始化为 nullptr while (closest_agv == nullptr && wait_time < 1) { // 最多等待 1 秒钟 // 查找可用的小车 for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); wait_time++; } } if (closest_agv != nullptr) { // 找到可用小车 // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } // 将任务分配给 AGV 对象的起点和终点坐标 closest_agv->set_task_id(task.id); closest_agv->setStartCoord(task.start_x, task.start_y); closest_agv->setEndCoord(task.end_x, task.end_y); closest_agv->setState(false); // 小车被占用 task.completed = 1; // 任务状态修改为进行中 std::cout << "agv_id" << closest_agv->getid() << "————" << "task_id"<<task.id << "task_completed"<< task.completed << endl; } else { std::cout << "task_id-" << task.id << "No available AGV!" << "task_completed"<< task.completed <<endl; } } },修改代碼為在最後輸出所有task的agvid,taskid和task的completed
时间: 2023-12-10 15:40:28 浏览: 141
可以在遍历完所有任务后,再次遍历任务列表,输出每个任务所分配的 AGV id、任务 id 和完成状态。具体修改代码如下:
```
void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) {
// 首先按照任务的完成状态、优先级进行排序
std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) {
if (task_1.completed != task_2.completed) {
return task_1.completed < task_2.completed; // 未完成的任务排在已完成的任务前面
} else {
return task_1.priority < task_2.priority; // 同一完成状态下,按照优先级排序
}
});
for (const auto& task : tasks) {
//std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl;
}
// 遍历任务列表,分配任务给可用的小车
for (auto& task : tasks) {
if (task.completed == 0) { // 只分配未完成的任务
AGV* closest_agv = nullptr;
int wait_time = 0; // 等待时间计数器
// 初始化为 nullptr
while (closest_agv == nullptr && wait_time < 1) { // 最多等待 1 秒钟
// 查找可用的小车
for (auto& agv : agvs) {
if (agv.getState()) {
closest_agv = &agv;
break;
}
}
if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找
std::this_thread::sleep_for(std::chrono::seconds(1));
wait_time++;
}
}
if (closest_agv != nullptr) { // 找到可用小车
// 找到最近的可用小车
int min_distance = INT_MAX;
for (auto& agv : agvs) {
if (agv.getState()) {
int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y);
if (distance < min_distance) {
min_distance = distance;
closest_agv = &agv;
}
}
}
// 将任务分配给 AGV 对象的起点和终点坐标
closest_agv->set_task_id(task.id);
closest_agv->setStartCoord(task.start_x, task.start_y);
closest_agv->setEndCoord(task.end_x, task.end_y);
closest_agv->setState(false); // 小车被占用
task.completed = 1; // 任务状态修改为进行中
// 输出任务分配情况
std::cout << "AGV id: " << closest_agv->getid() << ", Task id: " << task.id << ", Completed: " << task.completed << std::endl;
} else {
std::cout << "Task id: " << task.id << ", No available AGV!" << ", Completed: " << task.completed << std::endl;
}
}
}
}
```
阅读全文