В настоящее время я застрял в написании CPLEX Solver.
Проблема в основном состоит из взвешенного двудольного совпадения с завихрением.
Представьте, что у нас есть 2 приюта и 2 бездомных. У каждого бездомного есть риск, связанный с определенным укрытием. ниже приведена матрица этой проблемы:
S1 S2
P1 1 5
P2 10 5
так что у P1 (person1) есть риск 1, если он идет к S1 (shelter1) и так далее. Для приведенного выше случая оптимальным решением является назначение P1 для S1 и P2 для S2 для минимизации риска.
Теперь вот поворот. У нас есть [уравнение справедливости (Jain's Fairness)] [1]. Это уравнение справедливости является квадратичной функцией, которая в основном вычисляет справедливость после того, как все присвоение выполнено. Это индекс справедливости для вышеуказанного решения.
Справедливость = (1 + 5 ^ 2) / (2 * (1 ^ 2) + (5 ^ 2) = 0,9 ИЛИ 90% справедливости.
Я хочу написать решатель, который максимизирует справедливость. Гуроби не смог решить мою проблему, потому что это квадратичная функция. Я перешел на CPLEX, но все еще не могу решить проблему. Вот мой код:
int NbPeople = ...;
range People = 1..NbPeople;
int Shelters = ...;
range Shelter=1..Shelters;
int SheltersCapacity[Shelter] = ...;
int PersonReq[People]=...;
int GoodnessOfFit[People][Shelter] = ...;
dvar boolean A[p in People][s in Shelter];
dvar int gof;
//dexpr int Assignment=sum(p in People, s in Shelter) A[p][s] * GoodnessOfFit[p][s] ;
maximize gof;
subject to {
forall(s in Shelter)
Capacity:
sum(p in People)
A[p][s] * PersonReq[p] <= SheltersCapacity[s];
forall (p in People)
sum(s in Shelter) A[p][s] <= 1;
sum (p in People,s in Shelter) A[p][s] == 3;
forall (p in People, s in Shelter)
Fairness:
(A[p][s] * GoodnessOfFit[p][s] ^ 2)
/
3 * A[p][s] * GoodnessOfFit[p][s] ^ 2 <= gof;
}```
[1]: https://en.wikipedia.org/wiki/Fairness_measure