首页 > 解决方案 > Cplex:模型制定和编程方法

问题描述

我正在解决 Cplex 中的医院工作人员调度问题。我是 cplex 的新手,如果可以的话,我真的很感激

得到任何帮助!

问题描述:有一组医生,每天为“天”工作,

“晚上”和“晚上”时段。也有典型的调度约束

就像“晚上工作后没有白天工作”。我目前的关键问题

是:每个医生可以在我的计划范围内要求3天的工作时间(7

天)。如果请求没有得到满足(例如,医生要求有“天”

第一天的工作时间,但当天被分配为“晚上”时间),

将触发罚款费用。

目标是最小化总成本。

{string} I=...; // set of all doctors

{string} A=...; //set of working period (Day, evening, night)


int D=...; //planning horizon

range Day=1..D;

int Co[I]=...; //hiring cost for each doctor 

int p[I]=...; //penalty cost for each doctor

-Decision variable

dva int x[I][Day][A] in 0..1; //equals 1, if doctor i is working on Day d


dvar int z[I][Day][A] in 0..1; // equals 1, if the request of doctor i on Day d is not met.

-Expression of Decision Variables

dexpr int totalcost=sum(i in I, d in Day, a in A)*x[I][Day][A]
                   +sum(i in I, d in Day, a in A) p[I]*z[I][Day][A];

-Objective function

minimize totalcost;

**问题:对于医生的要求,我认为我应该使用建议的方法 1

Daniel 并添加医生索引,因为每个医生可以发出 3 个请求。所以

这意味着例如第 1 到第 3 个请求指的是同一位医生?

     tuple doctorrequest {

     string doctor:

     int date;

     string period;

} 

doctorrequest Req[I]=...; //example of doctor request

- 数据

I={"A","B","C"}; //set of doctors

A={"Day","Evening","Night"}; //set of working period

D=7; //planning horizon

p=[50,45,45];//penalty cost for each doctor

    Reqa=[<"A",1,"Day">,<"A",5,"Night">,<"A",7,"Evening>,

<"B",2,"Evening">,<"B",3,"Night">,<"B",5,"Night">,<"C",4,"Evening">,

<"C",5,"Evening">,<"C",6,"Night">];//requst from doctors 

**问题:惩罚成本的约束-->我想写一个约束,

当医生的要求不满足时,医生的罚款费用为

添加到目标函数中。只有初步的想法。

if (x[i,d,a] in Req){

x [i,d,a]==0;}

else {

z[i,d,a]==1;

}

感谢任何帮助!

标签: cplex

解决方案


我可以看到两个对请求建模的选项:

  1. 使用元组。在这种情况下,您还应该将医生作为字段添加到元组中。这样您就可以找到针对哪个医生的请求。
  2. 如果每个医生只能有一个请求,那么您可以只拥有由医生索引的参数data,并period为每个医生提供首选班次。

如果您使用元组方法,那么您可能需要查看文档和教程以了解如何初始化元组。您的初始化程序错误(这可能是 CPLEX 给出错误的原因)。元组数组的初始化应该是这样的:

Reqa=[<1,"Day">,<2,"">,<3,"Evening"",<4,"Night">]

最后,在您的模型中,我看不到一个决定医生何时实际工作的决策变量。如果没有这样的变量,您将无法判断医生的要求是否得到满足。


推荐阅读