Решатель Excel с несколькими входными переменными
Вопрос
У меня есть таблица Excel, в которой есть список спортивных игроков, их должности, зарплата, назначенная этим игрокам, и прогнозируемое количество очков.
В настоящее время я использую solver для создания наилучшей группы спортивных игроков, какой только возможно, с определенными ограничениями по должности и в рамках заранее установленного лимита заработной платы.
В моем конкретном примере различными позициями игроков являются:PG, SG, SF, PF, C, G и F.Обратите внимание, что G может быть либо PG, либо SG, а F может быть либо SF, либо PF.
В настоящее время этот решатель работает, но в некоторых случаях у игрока может быть несколько позиций.Так, например, Игрок A может быть использован в качестве SF ИЛИ SG.
Есть ли какой-либо способ учесть это в функции решателя, чтобы рассматриваемый игрок мог использоваться в любом слоте?
Чтобы помочь в объяснении, я приведу несколько примеров используемых данных.Вот небольшой пример списка игроков:
Position Player Salary Game Points Pos 1 Pos 2
PF/C Kevin Love $10,400 Pho@Min 09:30PM ET 53.17 PF C
PG/SG Stephen Curry $10,000 GS@Bkn 07:30PM ET 47.50 PG SG
SG/SF James Harden $9,500 LAL@Hou 08:00PM ET 41.13 SG SF
PF/C LaMarcus Aldridge $9,500 Orl@Por 10:00PM ET 45.22 PF C
PF/C Anthony Davis $9,200 Was@NO 08:00PM ET 42.97 PF C
PF/C Blake Griffin $9,000 Bos@LAC 10:30PM ET 42.66 PF C
PG John Wall $8,900 Was@NO 08:00PM ET 42.09 PG
PF/C Dwight Howard $8,700 LAL@Hou 08:00PM ET 41.19 PF C
SG/SF Paul George $8,600 Ind@Atl 07:30PM ET 40.06 SG SF
PF Paul Millsap $8,400 Ind@Atl 07:30PM ET 37.96 PF
PF/C Al Horford $8,300 Ind@Atl 07:30PM ET 37.33 PF C
Чтобы решить проблему с G и F, у меня есть список, в котором подсчитываются "выбранные" игроки, и в этом списке есть минимальное / максимальное количество каждого.Итак, в этом примере мне нужны 1 PG, 1 SG и 1 G.Итак, у меня есть столбец PG с минимальным значением 1 и максимальным значением 2, столбец SG с минимальным значением 1 и максимальным значением 2 и столбец G, который суммирует PG / SG вместе, что имеет минимальное значение 3 и максимальное значение 3.Тогда частью критериев решателя является то, что все значения min / max должны совпадать.
Я разделил первый столбец на POS1 и POS2, чтобы разделить две возможные позиции, но я не могу понять, как включить обе в функцию решателя.Для такого игрока, как Кевин Лав, я хочу, чтобы решатель учитывал, что он может быть помещен либо в PF, либо в F, либо в C.
Вот эта таблица:
PG SG SF PF C G F Ttl
Min 1 1 1 1 1 3 3 8
Max 3 3 3 3 2 4 4 8
Cur 1 3 1 2 1 4 3 8
Так, например, критерием решателя является:
Sum of Salary <= Salary Cap (50000)
PG Cur >= PG Min
Repeat for all Min
PG Cur <= PG Max
Repeat for all Max
Maximize Points
И, наконец, вот пример решения:
PG Stephen Curry $10,000 47.5
SG James Harden $9,500 41.13
SF Paul George $8,600 40.06
PF Dwight Howard $8,700 41.19
C Blake Griffin $9,000 42.66
G John Wall $8,900 42.09
F Al Horford $8,300 37.33
Total $63,000 292.5
Каждый игрок занимает свое место, потому что одна из двух его позиций (POS1 или POS2) соответствует критериям.Очевидно, что общая сумма не подходит, так что это не было бы жизнеспособным решением, но это всего лишь пример.
Надеюсь, я предоставил достаточно подробностей, но если нет, пожалуйста, дайте мне знать, и я буду рад объяснить подробнее.Заранее благодарю.
Решение
Ваш вопрос все еще немного расплывчат, потому что ваша максимальная зарплата составляет 50 000 долларов, но вы показываете 63 000 долларов выбранных игроков.
Допущения:
1.Вам нужны 5 игроков, поскольку это количество игроков на этаже и единственный способ получить команду, состоящую из вашего списка игроков стоимостью менее 50 000 долларов.Вероятно, это фэнтезийные обручи, и вы хотите 7 или 8, но решение все равно должно работать для 8 игроков либо с более широким списком опций, либо с более низкими зарплатами.
2.Я также предположу, что здесь практически нет VBA, поскольку вы ничего не предоставили, или, по крайней мере, ничего из этого не нужно корректировать.
Мое решение (которое все еще находится в стадии тестирования) состоит в том, чтобы преобразовать / cast (или эквивалент VBA) для Pos1 и Pos2 в текст с номером позиции (т. Е. 1 = PG, 2 = SG и т.д.).
Далее, =concatenate(Pos1, Pos2)
так что PG - это 11, PG / SG - это 12 и т.д.("G" также является 11 в этом сценарии, что может привести к сбою в моей логике).
Изменение вашей таблицы позиций с помощью значений Min / Max / Cur выглядит примерно так:
Pos. | PG | G | PG/SG | SG | SG/SF | SF/PF | F | PF | PF/C | C
--------------------------------------------------------------------
Pos1 | 1 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5
Pos2 | 1 | 2 | 2 | 2 | 3 | 4 | 4 | 4 | 5 | 5
PosNbr | 11 | 12 | 12 | 22 | 23 | 34 | 34 | 44 | 45 | 55
--------------------------------------------------------------------
Min | 1 | 3 | 3 | 1 | | 3 | 4 | 1 | | 1
Max | 3 | 4 | 4 | 3 | | 4 | 4 | 3 | | 2
Curr | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 3 | 0
(ценности - это мои собственные).