From aa8d949323633f9fe5f017de77da5b8a0e2938a3 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Sat, 19 Nov 2022 17:54:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D1=89=D0=B8=D0=BA,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=83=D0=BC=D0=B5=D0=B5=D1=82=20=D0=B2=D0=B7?= =?UTF-8?q?=D0=B2=D0=B5=D1=88=D0=B8=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D1=82=D1=8C=20=D0=BB=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=B0=D0=BB=D1=8C=D0=BD=D1=8E=D1=8E=20=D0=BB?= =?UTF-8?q?=D0=B5=D0=B2=D1=83=D1=8E=20(=D0=BE=D1=82=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=80=D0=BE=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0),=20=D0=BB=D0=B8=D0=B1=D0=BE=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D0=B6=D0=B0=D0=B9=D1=88=D1=83=D1=8E=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D1=83=D1=8E=20(=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=80=D0=BE=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0).=20=D0=95=D1=81=D1=82=D1=8C=20=D0=BD=D0=B5=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B9=20=D0=BF=D1=80=D0=B8=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D0=B5=D1=82=20=D0=B2=20=D0=BB=D0=B5=D0=B2?= =?UTF-8?q?=D1=83=D1=8E=20=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=BD=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scheduler.c | 91 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/scheduler.c b/scheduler.c index c2777f9..a2da4ae 100644 --- a/scheduler.c +++ b/scheduler.c @@ -192,6 +192,61 @@ struct scheduler_task { }; +static short scheduler_find_task(struct scheduler_task* tasks, const short curr_pos) { + // ищем первый барабан слева, и ближайший справа + short left = -1, right = -1; + for (short i = 0; i < BARRELS_COUNT; i++) { + short target = tasks[i].start_zone; // фактическая зона откуда тащить барабан + if (tasks[i].dest_zone == -2) { + target = 18; + } else if (tasks[i].dest_zone < 0) { + continue; + } + + if (curr_pos <= target) { + // это таск справа, надо найти ближайший + if (right == -1) { + right = i; + } else { + if (barrels[right].zone > target) { + right = i; + } + } + } else { + // таск слева, ищем максимально дальний (с минимальной зоной) + if (left == -1) { + left = i; + } else { + if (barrels[left].zone > target) { + left = i; + } + } + } + } + + // итого есть результат: есть ли таски, которые надо тащить вперед (и если надо то какой ближний), и есть первый таск + if (left < 0) { + return right; // вернем таск справа (если его нет, в переменной будет -1) + } + if (right < 0) { + return left; // если вдруг задачи справа не оказалось, вернем задачу слева если есть + } + + // вычисляем что ближе + short ld = curr_pos - left; // левая дельта + short rd = right - curr_pos; // правая дельта + + // дальше сравниваем дельты + // по идее если они равны то с бОльшим приоритетом робот поедет в левую часть + // а левую дельту вообще уменьшу на 1, чтобы цель слева казалась ближе + if (rd > ld - 1) { + return left; + } else { + return right; + } +} + + void schedule_robot_1() { static short transaction_state = 0; @@ -209,41 +264,7 @@ void schedule_robot_1() { // найти подходящую задачу if (schedulerOneRobotMode) { - char forward_is_exist = 0; - short target_task = -1, first_task = -1; - for (short i = 0; i < BARRELS_COUNT; i++) { - short target = tasks[i].start_zone; // фактическая зона откуда тащить барабан - if (tasks[i].dest_zone == -2) { - target = 18; - } else if (tasks[i].dest_zone < 0) { - continue; - } - - if (robot1.curr_zone <= target) { - forward_is_exist = 1; - if (target_task == -1) { - target_task = i; - } else { - if (barrels[target_task].zone > target) { - target_task = i; - } - } - } - - // тут нахождение первой задачи, нужно если вдруг - if (first_task == -1) { - first_task = i; - } else { - if (barrels[first_task].zone > target) { - first_task = i; - } - } - } - - // итого есть результат: есть ли таски, которые надо тащить вперед (и если надо то какой ближний), и есть первый таск - if (!forward_is_exist) { - target_task = first_task; - } + short target_task = scheduler_find_task(tasks, robot1.curr_zone); if (target_task >= 0) { // создаем транзакцию