Планировщик, который умеет взвешивать операции и выполнять либо дальнюю левую (относительно робота), либо ближайшую правую (относительно робота). Есть небольшой приоритет в левую сторону.

This commit is contained in:
VladislavOstapov 2022-11-19 17:54:26 +03:00
parent 4d7350ac69
commit aa8d949323

View File

@ -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() { void schedule_robot_1() {
static short transaction_state = 0; static short transaction_state = 0;
@ -209,41 +264,7 @@ void schedule_robot_1() {
// найти подходящую задачу // найти подходящую задачу
if (schedulerOneRobotMode) { if (schedulerOneRobotMode) {
char forward_is_exist = 0; short target_task = scheduler_find_task(tasks, robot1.curr_zone);
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;
}
if (target_task >= 0) { if (target_task >= 0) {
// создаем транзакцию // создаем транзакцию