Планировщик, который умеет взвешивать операции и выполнять либо дальнюю левую (относительно робота), либо ближайшую правую (относительно робота). Есть небольшой приоритет в левую сторону.
This commit is contained in:
parent
4d7350ac69
commit
aa8d949323
91
scheduler.c
91
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() {
|
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) {
|
||||||
// создаем транзакцию
|
// создаем транзакцию
|
||||||
|
Reference in New Issue
Block a user