CPLEX 求解器解决方案
CPLEX Solver Solution
我目前正在编写 CPLEX 求解器。
这个问题基本上是一个带有扭曲的加权二分匹配。
假设我们有 2 个避难所和 2 个无家可归者。每个无家可归者都有与特定庇护所相关的风险。下面是这个问题的矩阵:
S1 S2
P1 1 5
P2 10 5
因此 P1(person1) 如果去 S1(shelter1) 则风险为 1,依此类推。对于上述情况,最优解是将P1分配给S1,将P2分配给S2,将风险降到最低。
转折点来了。我们有一个[公平方程(Jain's Fairness)][1]。这个公平方程是一个二次函数,基本上计算所有分配完成后的公平性。这是上述解决方案的公平指数。
公平性 = (1+5^2)/(2*(1^2)+(5^2) = 0.9 或 90% 公平性。
我想编写一个最大化公平性的求解器。 Gurobi 无法解决我的问题,因为它是一个二次函数。我转到 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
您可以尝试在 CPLEX 中使用 CP。
例如:
using CP; //
dvar int x in 10..100;
dvar int y in 1..10;
minimize x/(y*y+x);
subject to
{
x>=y+2;
}
我目前正在编写 CPLEX 求解器。
这个问题基本上是一个带有扭曲的加权二分匹配。
假设我们有 2 个避难所和 2 个无家可归者。每个无家可归者都有与特定庇护所相关的风险。下面是这个问题的矩阵:
S1 S2
P1 1 5
P2 10 5
因此 P1(person1) 如果去 S1(shelter1) 则风险为 1,依此类推。对于上述情况,最优解是将P1分配给S1,将P2分配给S2,将风险降到最低。
转折点来了。我们有一个[公平方程(Jain's Fairness)][1]。这个公平方程是一个二次函数,基本上计算所有分配完成后的公平性。这是上述解决方案的公平指数。
公平性 = (1+5^2)/(2*(1^2)+(5^2) = 0.9 或 90% 公平性。
我想编写一个最大化公平性的求解器。 Gurobi 无法解决我的问题,因为它是一个二次函数。我转到 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
您可以尝试在 CPLEX 中使用 CP。
例如:
using CP; //
dvar int x in 10..100;
dvar int y in 1..10;
minimize x/(y*y+x);
subject to
{
x>=y+2;
}