Возможные комбинации ранжированных компонентов

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

введите здесь описание изображения

j<-c("Y", "X", "Z", "W")
l<-c("X", "Z", "W", "Y")
p<-c("Y", "Z", "X", "W")
t<-c("X", "Y", "Z", "W")

Я хочу найти все возможные вектора/ы, которые соответствуют упомянутым ограничениям.

Хотел добавить изображения, чтобы показать актуальные вопросы:

введите здесь описание изображения

введите здесь описание изображения


person JeanVuda    schedule 06.01.2016    source источник
comment
Мне кажется домашним заданием...   -  person akrun    schedule 06.01.2016
comment
Вроде как логический вопрос из учебника LSAT. Я просто хотел знать, как, если мне нужно решить это с помощью программы, сделать это программным способом.   -  person JeanVuda    schedule 06.01.2016


Ответы (2)


(предупреждение: ответ методом грубой силы)
Учитывая, что пространство для исследования довольно мало (в основном n!/(n-k)! элементов, если k сотрудников выбирают из n городов, поэтому здесь 4! = 24 элемента), вы можете написать что-то вроде:

require(combinat)
condition1 <- function(combination,...) {}  # returns TRUE if condition1 is met
# ...
condition3 <- function(combination,...) {}  # returns TRUE if condition3 is met
space <- combinat::permn(c("W","X","Y","Z"))      # a list of all permutations
lapply(space, 
       function(x) if (condition1(x) && condition2(x) && condition3(x)) {return(x)})

Конечно, это не очень элегантно, но позволяет вам вручную писать код в потенциально «экзотических» условиях и позволить R выполнять рутинную работу в lapply.

При большом количестве условий я бы сгруппировал их в список функций conditions и заменил последнюю строку на function(x) if all(lapply(conditions, function(c) do.call(c,x))) ....

person Alexandre Halm    schedule 06.01.2016

(Для меня это выглядит как домашнее задание, поэтому я не хочу вдаваться в подробности) Вы можете использовать lpSolve для таких задач. https://cran.r-project.org/web/packages/lpSolve/lpSolve.pdf

Основная идея заключается в том, что вы определяете линейное уравнение. Для каждой комбинации человек/станция вы вводите переменную, например. jx человек j находится на станции x.

Затем вы можете определить ограничения, например.

#each person one station
jx+jy+jz+jw=1
#each station one person
jx+ly+... =1

На основе вашей цели вы можете определить целевую функцию. Уравнения такого типа затем можно ввести в lpsolve.

Недавно я описал использование в другом примере R - комбинации фрейма данных с ограничениями

person CAFEBABE    schedule 06.01.2016