Я предполагаю, что вы знаете все числа, которые вы даете в примере при запуске алгоритма, и не получаете t2 после окончания t1 и т. Д.
Я также предполагаю, что два стропальщика могут стрелять поодин раз, хотя это не должно иметь большого значения.
При первом выборе вы можете присвоить значение каждой ячейке, являясь amountOfBirdsInCell-time.
Это дает вам две ячейки со значениями 1,Будучи S1t1, S1t2, остальное ниже.
В вашем счете учитывается только время последней ячейки, поэтому выбор самой ранней из них удалит время для нее в следующем раунде, что сделает его самым ценным временем,Это первый выбор.
Теперь удалите птиц, убитых в этом первом выборе, из всех ячеек.
Повторите процесс определения значения для остальных ячеек.В вашем примере, ячейка S3t2 даст наивысший результат, равный 0.
Повторяя этот процесс, вы получите самые ценные ячейки в самое раннее время.
Один важный бит, который ваш пример не делаетпокрытие: если ваш первый самый ценный выбор - в t2, следующий самый ценный - может быть в t1 или t2, поэтому вы должны принять это во внимание.Однако, поскольку t2 уже подтверждено, вы не должны принимать во внимание их время для их значения.
Я никогда не писал на python, я просто здесь из-за тега алгоритма, так что вот некоторые java /c-подобный псевдокод:
highestCellTime = 0;
while(birdsRemain)
{
bestCell;
for(every cell that has not been picked yet)
{
currentCellValue = amountOfBirds;
if(currentCellTime > highestCellTime)
{
currentCellValue = currentCellValue - currentCellTime;
}
if(currentCellValue < bestCellValue)
{
bestCell = thisCell;
}
else if(currentCellValue == bestCellValue && currentCellTime < bestCellTime)
{
bestCell = thisCell;
}
}
addCellToPicks(bestCell);
removeBirdsFromOtherCells(bestCellBirds);
}
Если я ничего не забыл, у вас теперь есть оптимальная комбинация ячеек в вашей коллекции выбора.
Надеюсь, этот код имеет смысл для программиста на Python.Если кто-то может перевести это, пожалуйста, сделайте!И, пожалуйста, удалите этот фрагмент текста и упоминание ранее java / c-псевдокода.
РЕДАКТИРОВАТЬ OP : Первая версия и не заканчивается лучшими ячейками.Я предполагаю, что это должно быть ошибка в моем коде, но тем не менее я публикую здесь.
import math
cellsNotPicked = range(0,12)
cellToBird = {
0: [1, 2],
1: [],
2: [1],
3: [1,2,3],
4: [1],
5: [3,4],
6: [4],
7: [1,2],
8: [],
9: [],
10: [3,4],
11: [1,2,3,4]
}
picks = []
def getCellValue(cell):
return len(cellToBird[cell])
def getCellTime(cell):
return int(math.floor(cell / 3)) + 1
birdsRemain = 4
while(birdsRemain > 0):
bestCell = 0;
for thisCell in cellsNotPicked:
currentCellValue = getCellValue(thisCell);
currentCellTime = getCellTime(thisCell)
highestCellTime = getCellTime(bestCell)
if(currentCellTime > highestCellTime):
currentCellValue = currentCellValue - currentCellTime;
if(currentCellValue < getCellValue(bestCell)):
bestCell = thisCell
elif (currentCellValue == getCellValue(bestCell)) and (currentCellTime < getCellTime(bestCell)):
bestCell = thisCell
picks.append(bestCell)
cellsNotPicked.remove(bestCell)
birdsToRemove = cellToBird[bestCell]
for key in cellToBird:
for bird in birdsToRemove:
try:
cellToBird[key].remove(bird)
birdsRemain -= 1
except:
pass
print picks