Mathematica, максимизировать извлечение элементов из списка - PullRequest
0 голосов
/ 22 января 2012

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

Например:

S = {4,2,3,5}

Maximize[{Extract[S,x], x<= 3, x>=1},{x}]

Я бы хотел, чтобы вместо этой ошибки возвращалось 4:

Extract::psl: "Position specification x in Extract[{4,2,3,5},x] is not an integer or a list of integers."

Кто-нибудь знает, как решить эту проблему?

Большое спасибо.


Большое спасибо !!Последний из показанных подходов - это то, что я искал, но применительно к моей реальной проблеме это не работает.

У меня есть следующая проблема:

Я должен максимизировать удовлетворение работника по отношению копределенная смена в определенный день месяца.У меня есть матрица удовлетворенности (сотрудники, смены), и она выглядит примерно так:

S= {{4,3,5,2},{3,4,5,1}}

Каждый элемент представляет удовлетворение работника по отношению к определенной смене, поэтому работник 1 имеет удовлетворение 4 по смене 1.

Моя модель должна выбирать правильную смену для всех дней месяца, чтобы максимизировать удовлетворение сотрудника, соблюдая определенные ограничения.

Моя самая большая проблема - это связать матрицу удовлетворенности с выбранной сменой.
Я не могу использовать в методе NMaximize функцию, которая принимает выбранные смены и сотрудника и возвращает удовлетворение и, таким образом, суммирование за все дни месяца.Мне нужно максимизировать что-то вроде этого:

Summation(from j=1 to j=31) getSatisfaction[1,chosenShift for that day)

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

Спасибо большое !!

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Если вам не нужно находить значение x, тогда я предлагаю вам просто извлечь приемлемый диапазон из списка, а затем найти Max этого:

s = {4,2,3,5};

s[[1 ;; 3]] // Max
4

Если у вас особенно волосатые ограничения, вам может понадобиться что-то вроде Pick:

list = {5, 7, 1, 9, 3, 6, 2, 8, 4};

Pick[list, Range@Length@list, x_ /; x <= 7 && x >= 3 && Mod[7, x] == 1]
{1, 6} 

Затем вы можете использовать Max в возвращенном списке.


Для полноты, если вам нужно значение x или другие подробности процесса, вот подход:

list = {6, 5, 7, 3, 4, 2, 1, 8, 9};

pos = Cases[Range@Length@list, x_ /; x <= 7 && x >= 3 && Mod[7, x] == 1]

values = Part[list, pos]

maxpos = Part[pos, Ordering[values, -1]]
{3, 6}

{7, 2}

{3}
2 голосов
/ 23 января 2012

Отвечая на ваш обновленный вопрос:

Если у вас есть:

shifts = {{4, 3, 5, 2}, {3, 4, 5, 1}, {4, 3, 5, 2}}

Тогда

(Tally /@ Transpose@shifts)[[All, 1, 1]]

дает вам:

{4, 3, 5, 2}

Какиесписок с предпочтительной сменой для каждого сотрудника.

...