0

Я думаю, что это простой вопрос для специалистов по математике. Как я могу максимизировать извлеченное значение из списка, учитывая индекс, который должен соблюдать некоторые ограничения?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?
Я борюсь за эту проблему в течение нескольких дней, но я не могу решить эту проблему. Мне нужен ввод, чтобы связать выбранный сдвиг с матрицей удовлетворения.

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

+0

Пожалуйста, просмотрите мой ответ и скажите мне, разрешает ли он вашу проблему, или если вы ищете что-то еще. –

+0

@user: Этот сайт создан, чтобы дать ответы на отдельные вопросы, [последующие] (http://meta.stackexchange.com/q/19457/156389) вопросы не соответствуют модели. Это не форум. Кроме того, можете ли вы использовать блоки кода для своего кода - чтобы получить справку, нажмите вопросительный знак, когда вы редактируете свой вопрос. Наконец, это немного грубо, чтобы опубликовать тот же вопрос в [нескольких местах] (http://www.physicsforums.com/showthread.php?t=569736). – Simon

+0

@ user1114020 Это запутанный вопрос. Вы почти ничего не говорите о природе ограничений или даже о том, что представляет собой матрица. Есть четыре смены? Каждая строка указывает на другого сотрудника? Сколько там сотрудников? Сколько нужно за смену? Являются ли они взаимозаменяемыми (по крайней мере, для сопоставимых задач)? Если вы предоставите реалистичное описание проблемы, вы, скорее всего, получите разумный ответ. Кроме того, если я не ошибаюсь, требуемые методы не будут простыми (может потребоваться программирование с удовлетворением потребностей в целых числах или ограничениях). –

ответ

3

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

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

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

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

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

Pick[list, [email protected]@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[[email protected]@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} 
+0

Большое спасибо, очень полезно. Пожалуйста, прочтите мой обновленный вопрос – Parzio

2

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

Если вы имеют:

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

Тогда

(Tally /@ [email protected])[[All, 1, 1]] 

дает вам:

{4, 3, 5, 2} 

Что я список с предпочитаемым сдвига для каждого сотрудника.