首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPLEX解算器解决方案

CPLEX解算器解决方案
EN

Stack Overflow用户
提问于 2019-07-12 05:01:27
回答 1查看 48关注 0票数 0

我目前被困在编写CPLEX Solver中。

这个问题基本上是一个带有扭曲的加权二部匹配。

假设我们有两个收容所和两个流浪汉。每个无家可归的人都有与某个收容所相关的风险。下面是这个问题的矩阵:

代码语言:javascript
复制
    S1   S2

P1  1    5

P2  10   5

因此,如果P1(person1)进入S1(shelter1),则风险为1,以此类推。对于上述情况,最佳解决方案是将P1分配给S1,将P2分配给S2,以将风险降至最低。

现在有一个转折。我们有一个公平等式(Jain's Fairness)。这个公平性方程是一个二次函数,它基本上是在所有分配完成后计算公平性。这是上述解决方案的公平性指数。

公平性= (1+5^2)/(2*(1^2)+(5^2) = 0.9或90%公平性。

我想写一个最大化公平性的求解器。Gurobi不能解决我的问题,因为它是一个二次函数。我转向了CPLEX,但是我仍然不能解决这个问题。下面是我的代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-12 05:27:15

您可以尝试在CPLEX中使用CP。

例如:

代码语言:javascript
复制
using CP; // 

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

minimize x/(y*y+x);

subject to
{
x>=y+2;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56997254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档