Praneeth Kumar E Ответов: 2

Кодирующий вопрос: минимизируйте время, необходимое для завершения всех заданий


I got this problem in a coding exam but unable to find the algorithm during the exam and find the solution online. Please help me solve it.

There are 'm' jobs which have to be completed by 'n' people. An nxm array will be given in which the value in the 'i' th row and 'j' th column represent the time taken by the 'i' th person to complete the 'j' th job. Any person can do any number of jobs. Find the least time to complete the jobs.
Conditions:
1<n<30
1<m<30
eg input:= n=5, m=4

nxm matrix= is:

5 5 5 5 
6 9 2 6
8 7 8 8
1 1 1 1
6 7 8 2

output:= 2

Explanation: The fourth person can do all jobs in unit time. The second person can do third job in a unit time, the fifth person can do fourth job in a unit time. So, as time starts, fourth guy will start doing first job, second guy the third job and the fifth guy the fourth job. After completing first, the fourth guy will complete second.


Что я уже пробовал:

I tried to solve but didn't get any idea.
Any algorithm which is better than brute-force?

KarstenK

у вас есть побочное условие, что каждый человек должен делать работу, в то время как другие работают.

Я думаю, что его концы с матрицей нужно решить.

2 Ответов

Рейтинг:
12

Stefan_Lang

Это не вопрос программирования. Речь идет о поиске алгоритма, который дает вам правильный результат. Кроме того, речь может идти о поиске алгоритма, который быстро даст вам результат, но вы этого не сказали. В любом случае, вы можете получить больше ответов, если просто удалите языковые теги.

Хитрость в поиске (и оценке) алгоритмов заключается в том, чтобы найти *некоторый* способ, который работает, а затем проверить, работает ли он в угловых случаях, или если есть что-то, что вы можете сделать, чтобы ускорить его, если он слишком медленный.

Самый простой подход к практически любой проблеме с ограниченным числом потенциальных решений называется "грубой силой". Грубая сила означает, что вы пробуете все возможные комбинации и выясняете, какая из них работает.

В этом случае единственная проблема заключается в том, каковы комбинации, и как я могу убедиться, что я пробую их все? Итак, давайте рассмотрим задачу: у вас есть m рабочих мест и n людей, которые могли бы работать на любом из этих рабочих мест. Это типичная задача планирования. Вы можете выразить эту задачу в виде списка назначений заданий людям, например {задание 1, Лицо 1}, {Задание 2, лицо 3}, задание 3, лицо 1}, {Задание 4, лицо 4}. Поскольку каждая работа указана ровно один раз, и порядок не имеет значения, вы можете перечислить это так же, как список людей вместо этого, где номер работы подразумевается позицией в списке. Для приведенного выше примера это будет { 1, 3, 1, 4 }.

Исходя из этой нотации, если вы хотите выразить все расписания, вам понадобятся списки планирования, подобные этому, со следующими условиями:
1. каждая позиция списка соответствует одному из m заданий, поэтому список содержит m элементов.
2. Каждый из m элементов соответствует номеру одного из n человек, которые будут обрабатывать задание на данной должности, поэтому это может быть любое число от 1 до n

Это означает, что вам нужно настроить контейнер для списков из m чисел, затем сгенерировать все комбинации таких списков, повторяя каждый элемент от 1 до n, и добавить эту комбинацию в ваш контейнер.

Когда у вас есть этот контейнер, вы должны найти лучший, то есть тот, который приводит к наименьшему времени обработки. Для этого вам нужна функция, которая вычисляет время обработки для данного графика. Это не должно быть трудно написать эту функцию.

Для приведенного примера вы получите 5*5*5*5=625 графиков. В более крупных примерах общее число расписаний может быть слишком большим для хранения, поэтому вместо того, чтобы хранить их в контейнере, вы должны просто генерировать по одному расписанию за раз, оценивать время обработки и хранить это расписание только в том случае, если оно является одним из лучших.

Кроме того, для более крупных примеров оценка каждого расписания будет слишком трудоемкой: вы должны подумать о способах сокращения числа расписаний для тестирования. Но я не буду углубляться в это здесь - сейчас для вас важно только понять, как найти "решение", даже если оно не самое лучшее.


Rick York

По сути, именно так работает программа, над которой я работаю. Проблема не имеет только одного правильного ответа, поэтому я должен попробовать все возможности, а затем определить, какая из них была лучшей. Сейчас я использую графический процессор для этого.

Stefan_Lang

Я когда-то работал в ГА решения Уч задачи календарного планирования. В приведенном примере было несколько сотен рабочих мест и 4 машины - невозможно решить с помощью грубой силы, и уж точно не в 90-е годы! Но ГА мог найти почти оптимальное решение в течение 20 минут, когда специалисту-человеку (который ранее составлял этот график) требовалась большая часть недели, чтобы прийти к решению аналогичного качества.

Maciej Los

5ed!

Stefan_Lang

Большое спасибо.

Рейтинг:
1

Patrice T

Цитата:
Я попытался решить эту проблему, но не получил ни малейшего представления.

Это признак того, что вы недостаточно квалифицированы для экзамена.
Потому что, как программист, это ваша работа, чтобы проанализировать требование, и это 1 на самом деле не сложно.
Ключи есть:
- Рабочий может выполнять 0, 1 или более заданий.
- Работа выполняется ровно 1 работником.
- Сведите к минимуму время выполнения всех заданий.
Затем возьмите лист бумаги и карандаш и начните решать вручную.
            Work time by worker
J0 J1 J2 J3 W0 W1 W2 W3 W4 Max time
W0 W0 W0 W0 20  0  0  0  0 20
W0 W0 W0 W1 15  6  0  0  0 15
W0 W0 W0 W2 15  0  8  0  0 15
....
W0 W0 W1 W1 10  8  0  0  0 10
....

Это в основном алгоритм грубой силы (попробуйте все возможности)
Цитата:
Есть какой-нибудь алгоритм, который лучше грубой силы?

Для такого небольшого набора данных не уверен, что любое другое решение будет быстрее.
Для этого требования не уверен, что существует какой-либо другой алгоритм.


KarstenK

звучит как линейная алгебра с 5 векторами (рабочими) и побочным условием, что все 5 работают. Но я в этом не силен ;-)

Patrice T

4 рабочих места и 5 рабочих, я сомневаюсь, что все будут работать.
Я использую IP, но не вижу, как выразить свою цель.