У меня тут небольшая интересная проблема. Сначала я приведу некоторую справочную информацию: сама проблема связана с игрой, в которой есть работники, которые могут работать над 4 различными проектами. Каждый проект возвращает определенную сумму вознаграждения, а также требует определенного времени для завершения. Я хотел попытаться оптимизировать вознаграждение / секунду, чтобы попытаться найти оптимальное распределение работников. Вы также можете усовершенствовать своих работников, чтобы дать им больше возможностей, хотя я не думаю, что это имеет слишком большое значение для моей проблемы.
Так что сейчас я расскажу подробнее о 1029 *. Возврат каждого проекта вычисляется с помощью довольно простой функции:
- Project 1: return = 0.1 * workers * worker_capacity
- Project 2: return = 0.25 * workers * worker_capacity
- Project 3: return = 0.5 * workers * worker_capacity
- Project 4: return = 0.75 * workers * worker_capacity
Как уже говорилось, очень простые (линейные) функции. Единственное, что меняется, это первый фактор нашего расчета. Я буду называть это return_factor отныне. Итак, по сути:
return_factor = [0.1, 0.25, 0.5, 0.75]
Теперь время вычисляется с помощью более сложных функций: (результат - количество секунд)
time = Math.round(
(
Math.pow(
workers * worker_capacity * (return_factor * 100) * workers * worker_capacity *return_factor,
0.45
) + 1800
) * 0.9045869428
)
Код выше написан на javascript , Я сам по себе python парень, но я думаю, что эта функция понятна большинству людей с базовыми c знаниями в области программирования и математики.
Так что я точно знаю, каковы отдача и время для каждого проекта рассчитывается. Функция возврата / секунды для каждого проекта легко найти, разделив функцию возврата на функцию времени для соответствующего проекта. Теперь мне просто нужно знать, как оптимизировать эту возврат / секунду. Я думаю, что есть 2 возможных подхода:
- Имеют 4 разные функции возврата / секунды. Таким образом, для каждого проекта я делю функцию возврата на функцию времени, чтобы найти возврат / секунду для конкретного проекта. Затем я пытаюсь найти оптимальное распределение для моих работников, выполняя большое количество итераций и заполняя различные значения для каждой функции, пока не будет найден оптимальный общий возврат / секунду. Имейте в виду, что общее значение возврата / секунды будет составлять 4 функции.
- Имеет 1 функцию возврата / секунды с 4 параметрами. Один параметр для каждого проекта, который обозначает количество работников, которые направляются на работу над конкретным проектом. (Эта агрегатная функция на самом деле является той же агрегатной функцией, которую я только что упомянул в первом подходе)
Теперь я просто не могу понять, как решить эту проблему. Я нашел некоторую информацию о itertools.product в python, но моя проблема в том, что возможные значения для каждого параметра могут быть изменены.
Например: скажем, у меня 200 рабочих. Сначала каждый параметр / проект имеет одинаковое количество возможных значений: [0: 200] Однако, когда я назначаю, скажем, 20 рабочих для первого проекта, остальные 3 проекта имеют возможные значения: [0: 180]
Я знаю, что это было довольно прочитано. Буду очень признателен, если кто-нибудь здесь сможет помочь мне решить эту проблему. Желательно с Python, так как я пытаюсь узнать что-то новое в Python :) Спасибо всем!