2016-04-27 2 views
0

У меня есть список из 153 игроков в гольф со связанными зарплатами и средними баллами.Оптимизация списка в Excel с переменными

Я хочу найти комбинацию из шести игроков в гольф, которая оптимизирует счет авг и сохраняет зарплату менее 50 000 долларов.

Я пытался использовать Solver, но я застрял! Может ли кто-нибудь помочь? :)

+0

Это оптимизирует сумму среднего балла * –

+0

Фильтр для окладов <$ 50,000, сортировать по среднему балу по убыванию (так что сверху сверху), а затем первые 6 - это то, что вы ищете. – tigeravatar

+0

@tigeravatar Я думаю, что Op хочет, чтобы общая сумма зарплат составляла менее 50 000 человек. Но сегодня я ушел из своего понимания, чтобы твоя правда была правильной. –

ответ

1

Это простая проблема оптимизации, которая может быть решена с помощью Excel solver (просто используйте «Simplex Lp solver» - несколько неправильно, поскольку мы будем использовать его здесь для решения целочисленного программирования или проблемы с MIP).

Вам нужна одна колонка с 153 двоичными (BIN) переменными (предел Excels - это, на мой взгляд, 200). Убедитесь, что вы добавили ограничение, чтобы установить значения в Binary. Позволяет вызвать этот столбец INCLUDE; Solver заполнит его 0 или 1 значением. Суммируйте эти значения и добавьте ограничение с помощью SUMINCLUDE = 6. Затем добавьте столбец с INCLUDE * SCORE. Суммируйте этот столбец, и это ваша цель (оптимизация среднего - это то же самое, что и оптимизация суммы). Затем добавьте столбец INCLUDE * SALARY и суммируйте их. Добавьте ограничение с SUMSALARY < = 50k. Пресс решить и сделать.

Я не согласен с утверждениями о том, что Excel будет разбиваться по тому или иному вопросу, который не подходит в пределах решателя Excels. (Я действительно пробовал это).

Я предпочитаю метод симплекс над эволюционным решателем, так как симплекс-решатель более подходит для этой задачи: он быстрее (симплекс принимает < 1 секунда) и обеспечивает оптимальные решения (эволюционный решатель часто дает субоптимальные решения).

Если вы хотите решить эту проблему с помощью Matlab, функция, которую нужно посмотреть, это intlinprog (Optimization Toolbox).

Чтобы быть полным: это математическая модель, которую мы решаем здесь:

enter image description here

Результаты со случайными данными:

enter image description here

....

enter image description here

+0

Я установил уравнение так, как вы сказали, и оно возвращает ошибку, которая говорит: «Решатель не может найти точку, для которой все ограничения выполнены». Он оптимизирован для очков и шести игроков в гольф, но не делает этого в рамках ограничений зарплаты. (примечание: у меня есть ограничение SUM от зарплаты, установленного на <= 50000) @erwin kalvelagen –

+0

Тогда вы сделали что-то не так. –

+0

Возможно также, что ваши данные являются «неправильными», и нет никаких возможных решений вашей проблемы. Убедитесь, что 6 самых дешевых игроков находятся в пределах бюджета, –

2

Иллюстрируя решение, которое довольно близко к тому, что предложил @ErwinKalvelagen.

  1. Колонка А имена 153 игроков в гольф
  2. Колонка B является зарплаты игрока-(генерируется =RANDBETWEEN(50, 125)*100, заполненный вниз, а затем копировать/вставить значения)
  3. Колонка C является игроками в гольф средние баллы (генерируемые по =RANDBETWEEN(70, 85), заполнены, затем скопируйте/вставьте значения)
  4. Столбец D является 0 или 1, чтобы указать, включен ли игрок в гольф.
  5. Cell F2 является общей зарплатой, задаваемого =SUMPRODUCT(B2:B154,D2:D154)
  6. Cell G2 этого количеством игроков в гольф, задаваемый =SUM(D2:D154)
  7. Cell H2 является средним баллом команды, задаваемого =SUMPRODUCT(C2:C154,D2:D154)/G2

страница выглядит так, прежде чем устанавливать Solver ...

enter image description here

Установка Solver выглядит следующим образом ...

enter image description here

Согласно помощи, он говорит, чтобы использовать Эволюционную двигатель для негладких задач. В Options мне нужно было увеличить максимальное время без улучшения с 30 до 300 (возможно, было достаточно 60).

enter image description here

потребовалось несколько минут для того, чтобы закончить. Он достиг решения 70 довольно быстро, но потратил больше времени на поиск лучшего ответа.

enter image description here

И вот шесть игроков в гольф он придумал.

enter image description here

Из игроков в гольф с в среднем 70 лет, он мог бы найти более низкую зарплату.

enter image description here

В Cell I2 добавил формулу =F2+F2*(H2-70), которая, по существу, зарплата штрафуется увеличивается в средний балл выше 70 ...

enter image description here

... и использовать ту же установку Solver, кроме как свернуть Клеточные ячейки I2 вместо H2 ...

enter image description here

и эти игроки в гольф он выбрал ...

enter image description here

Опять же - похоже, есть еще лучшее решение. Он мог бы выбрать Name97 вместо Name96.

+0

Встроенная версия Solver сообщает: «Эта проблема слишком велика для обработки Solver». Чтобы обойти это, вы можете купить полную версию Solver и использовать ее. Однако в этой задаче цель и ограничения - все линейные функции переменных решения 0-1. Это означает, что альтернативой является бесплатная надстройка OpenSolver (см. Opensolver.org), которая не имеет никаких искусственных ограничений по размеру проблемы (но может решить только линейные проблемы). В моем случае он решил исходную проблему выше в течение нескольких секунд со средним счетом 85. –

+0

Почему вы установили решатель на «мин» $ h $ 2 вместо «max» $ h $ 2? –

+0

H2 - средний балл. В гольфе более низкий балл лучше - если нет других критериев, которые я пропустил. – OldUgly

Смежные вопросы