Нахождение оптимального решения, которое минимизирует ограничение?

Давайте назовем эту проблему проблемой Slinger-Bird (на самом деле Slinger аналогичен серверу, а птица - запросу, но у меня был нервный срыв, думая об этом, поэтому я изменил их, надеясь чтобы получить другую перспективу!).

  • Есть S метателей камней (стропальщиков) и B птиц.
  • Стропальщики не находятся в пределах досягаемости друг друга.
  • Однажды метнув пращу, можно убить всех птиц в пределах видимости стропальщик и потребляет один выстрел и одну единицу времени

Я пытаюсь найти оптимальное решение, которое минимизирует время и количество выстрелов, необходимых для убийства птиц, с учетом конкретной схемы прибытия птиц. Позвольте мне дать пример с абсолютными числами: 3 стропальщика и 4 птицы.

        Time        1            2            3           4             5
Slinger
S1                B1, B2     B1, B2, B3       B4
S2                               B1         B1, B2      B3,B4     
S3                  B1         B3, B4                 B1,B2,B3,B4

и мои данные выглядят s следующим образом:

>> print t
[
  {
    1: {S1: [B1, B2], S2: [], S3: [B1]}, 
    2: {S1: [B1, B2, B3], S2: [B1], S3: [B3, B4]},
    3: {S1: [B4], S2: [B1,B2], S3: []},
    4: {S1: [], S2: [B3, B4], S3: [B1, B2, B3, B4]}
  }
]

Есть несколько решений, которые я мог бы придумать (Sx при t = k подразумевает, что стропальщик Sx делает выстрел в момент времени k):

  1. S1 при t = 1, S1 при t = 2, S1 при t = 3 <- Стоимость : 3 выстрела + 3 единицы времени = 6
  2. S1 при t = 2, S1 при t = 3 <- Стоимость : 2 выстрела + 3 единицы времени = 5
  3. S1 при t = 1, S3 при t = 2 <- Стоимость : 2 выстрела + 2 единицы времени = 4
  4. S3 при t = 4 <- Стоимость : 1 выстрел + 4 единицы времени = 5

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

Каков быстрый и хороший способ решить эту проблему в Python? Мне сложно придумать хорошую структуру данных, чтобы сделать это, не говоря уже об алгоритме, который это сделает. Я думаю об использовании динамического программирования, потому что это, кажется, связано с исследованием пространства состояний, но я немного не понимаю, как действовать дальше. Есть предложения?

7
задан Legend 28 October 2011 в 09:59
поделиться