【问题标题】:CPLEX Solver SolutionCPLEX 求解器解决方案
【发布时间】:2019-11-21 15:33:23
【问题描述】:

我目前正忙于编写 CPLEX Solver。

问题基本上是带有扭曲的加权二分匹配。

假设我们有 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 OR 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

【问题讨论】:

  • 另一种方法是最小化带宽(在维基百科文章中提到:max-min fairness)。该措施很容易实施。

标签: cplex solver gurobi


【解决方案1】:

您可以尝试在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多