Да, вы можете решить эту проблему с помощью Simplex.Это стандартная «Проблема назначения» с несколькими вариациями в плане предпочтений и веса навыка.
Вы можете обратиться к Проблема 1 в своем вопросе, введя один или несколько "манекенов.переменные " для принятия 'slack'
Вместо записи ограничения навыка в виде:
Sum for all students (X_sp) >= NumMin_pk
для каждого проекта p, для каждого навыка k,
вы пишете
sum for all students (X_sp) > 0 + NumMin_pk * Dummy1_pk
для каждого p, для каждого навыка k
А в целевой функции вы наказываете Dummy_pk (давая егоотрицательная стоимость для задачи максимизации.) Таким образом, Simplex назначит ненулевой Dummy_pk, только если у него нет другой альтернативы.
Далее, скажем, для одного навыка ( программирование )Проект имеет минимальный вес навыка 3, но если у 5 учеников есть программирование, это даже лучше.Вы можете достичь этого, введя вторую переменную Dummy (Dummy2_pk).
Sum for all students (X_sp) > 0 + 3* Dummy_pk + 2 * Dummy_pk2
для каждого p, для каждого навыка k
В целевой функции придайте Dummy_pk высокую отрицательную стоимость именьшая, но отрицательная стоимость для Dummy2_pk. Сначала модель попытается получить 0 Dummy1_pk, и, если возможно, если Dummy2_pk будет равняться нулю.Результатом будет 5 студентов с навыками программирования, которые будут назначены на этот проект.
Для решения проблемы 2 (отрицательные веса навыков): Разделите вектор навыков на два вектора, разделив 1 и-1's.
Так [1,0,0,1, -1,0,1] становится [1,0,0,1,0,0,1] и [0,0,0,0, -1,0,0].В зависимости от того, что вы хотите сделать со слабостью навыка, вы можете написать ДВА ограничения для каждого проекта p, навыка k и избежать проблемы слабости, отменившей навык другого ученика.