CPLEX Solver Solution - PullRequest
       47

CPLEX Solver Solution

0 голосов
/ 12 июля 2019

В настоящее время я застрял в написании 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

1 Ответ

0 голосов
/ 12 июля 2019

Вы можете попробовать использовать CP в CPLEX.

Например:

using CP; // 

dvar int x in 10..100;
dvar int y in 1..10;

minimize x/(y*y+x);

subject to
{
x>=y+2;
}
...