Excel CPLEX SheetWrite错误:此平台不支持工作表数据

Excel CPLEX SheetWrite错误:此平台不支持工作表数据,excel,cplex,Excel,Cplex,我有这个CPLEX模型,决策变量是区间。我能够从excel文件中读取数据,并且在将浮点/整数结果写入excel时没有问题。但是,当我尝试将间隔决策变量写入同一excel时,会显示错误消息“此平台不支持工作表数据” 我想保存的变量如下所示 由于我需要使用结果(使用vba代码)制作甘特图,因此我不希望以其他格式保存结果,我需要保存此表中的所有信息。有人能帮我解决这个问题吗?或者,如果您对根据结果制作甘特图的其他方法有任何建议,也会有所帮助。谢谢 有关“此平台不支持工作表数据”,请参见 对于导出间隔

我有这个CPLEX模型,决策变量是区间。我能够从excel文件中读取数据,并且在将浮点/整数结果写入excel时没有问题。但是,当我尝试将间隔决策变量写入同一excel时,会显示错误消息“此平台不支持工作表数据”

我想保存的变量如下所示

由于我需要使用结果(使用vba代码)制作甘特图,因此我不希望以其他格式保存结果,我需要保存此表中的所有信息。有人能帮我解决这个问题吗?或者,如果您对根据结果制作甘特图的其他方法有任何建议,也会有所帮助。谢谢

有关“此平台不支持工作表数据”,请参见

对于导出间隔,可以首先将间隔转换为元组集,然后导出元组集

例如,动物园调度示例:

/*

Model written by Philippe Laborie

https://www.linkedin.com/pulse/zoo-buses-kids-optimization-resource-allocation-philippe-laborie/

*/
using CP;

tuple Bus { string Name; int Seats; int Cost; int Avail; int Outward; int Return; }

{Bus} Buses = {
  < "A40", 40,  500,  480, 30, 25 >,
  < "B40", 40,  500,  480, 30, 25 >,
  < "C40", 40,  500,  480, 30, 25 >,
  < "D40", 40,  500,  480, 30, 25 >,
  < "E40", 40,  500,  510, 30, 25 >,
  < "F30", 30,  400,  480, 25, 20 >,
  < "G30", 30,  400,  480, 25, 20 >,
  < "H30", 30,  400,  480, 25, 20 >,
  < "I30", 30,  400,  480, 25, 20 >,
  < "J30", 30,  400,  510, 25, 20 >
};

int Opening    = 600; // 10:00
int NbKids     = 300;
int NbTeachers = 3;
int NbMaxTrips = 2;

dvar interval outwardTrip[b in Buses][i in 1..NbMaxTrips] optional in b.Avail..Opening size b.Outward;
dvar interval roundTrip  [b in Buses][i in 1..NbMaxTrips] optional size b.Outward+b.Return;

minimize sum(b in Buses, i in 1..NbMaxTrips) (presenceOf(outwardTrip[b][i]) * b.Cost);
subject to {
  sum(b in Buses, i in 1..NbMaxTrips) (presenceOf(outwardTrip[b][i]) * b.Seats) >= NbKids;
  sum(b in Buses, i in 1..NbMaxTrips) pulse(roundTrip[b][i],1) <= NbTeachers; 
  forall(b in Buses) {
    forall(i in 1..NbMaxTrips) {
      presenceOf(outwardTrip[b][i]) == presenceOf(roundTrip[b][i]);startAtStart(outwardTrip[b][i], roundTrip[b][i]);
      if (i>1) {
        presenceOf(roundTrip[b][i]) => presenceOf(roundTrip[b][i-1]);
        endBeforeStart(roundTrip[b][i-1], roundTrip[b][i]);
      }
    }
  }
}

tuple result
{
  string name;
  int seats;
  int s;
  int e;
}

{result} results=
{<b.Name,b.Seats,startOf(outwardTrip[b][i]),endOf(outwardTrip[b][i])> | b in Buses, i in 1..NbMaxTrips : presenceOf(outwardTrip[b][i])==1};
  
execute
{
  writeln(results);
}  
  
/*
Philippe Laborie编写的模型
https://www.linkedin.com/pulse/zoo-buses-kids-optimization-resource-allocation-philippe-laborie/
*/
使用CP;
元组总线{string Name;int Seats;int Cost;int Avail;int out;int Return;}
{Bus}总线={
<“A40”、40、500、480、30、25>,
<“B40”、40、500、480、30、25>,
<“C40”、40、500、480、30、25>,
<“D40”、40、500、480、30、25>,
<“E40”、40、500、510、30、25>,
<“F30”、30、400、480、25、20>,
<“G30”、30、400、480、25、20>,
<“H30”、30、400、480、25、20>,
<“I30”、30、400、480、25、20>,
<“J30”、30、400、510、25、20>
};
整数开度=600;//10:00
int=300;
int=3;
int NbMaxTrips=2;
dvar间隔向外行程[b在总线中][i在1..NbMaxTrips]在b中可选。有效..开口尺寸b.向外;
dvar间隔往返[b在公交车上][i在1..NbMaxTrips]可选尺寸b.向外+b.返回;
最小化总和(公共汽车中的b,1..NbMaxTrips中的i)(存在(外部行程[b][i])*b.成本);
服从{
总和(公共汽车中的b,1..NbMaxTrips中的i)(存在(外部行程[b][i])*b.座位)>=NbKids;
总和(总线中的b,1..NbMaxTrips中的i)脉冲(往返[b][i],1)1){
存在(往返[b][i])=>存在(往返[b][i-1]);
endBeforeStart(往返[b][i-1],往返[b][i]);
}
}
}
}
元组结果
{
字符串名;
国际席位;
int-s;
INTE;
}
{result}结果=
{b在公共汽车中,i在1..NbMaxTrips:presenceOf(outwardTrip[b][i])==1};
执行
{
书面(结果);
}  

这就解决了问题。非常感谢。
/*

Model written by Philippe Laborie

https://www.linkedin.com/pulse/zoo-buses-kids-optimization-resource-allocation-philippe-laborie/

*/
using CP;

tuple Bus { string Name; int Seats; int Cost; int Avail; int Outward; int Return; }

{Bus} Buses = {
  < "A40", 40,  500,  480, 30, 25 >,
  < "B40", 40,  500,  480, 30, 25 >,
  < "C40", 40,  500,  480, 30, 25 >,
  < "D40", 40,  500,  480, 30, 25 >,
  < "E40", 40,  500,  510, 30, 25 >,
  < "F30", 30,  400,  480, 25, 20 >,
  < "G30", 30,  400,  480, 25, 20 >,
  < "H30", 30,  400,  480, 25, 20 >,
  < "I30", 30,  400,  480, 25, 20 >,
  < "J30", 30,  400,  510, 25, 20 >
};

int Opening    = 600; // 10:00
int NbKids     = 300;
int NbTeachers = 3;
int NbMaxTrips = 2;

dvar interval outwardTrip[b in Buses][i in 1..NbMaxTrips] optional in b.Avail..Opening size b.Outward;
dvar interval roundTrip  [b in Buses][i in 1..NbMaxTrips] optional size b.Outward+b.Return;

minimize sum(b in Buses, i in 1..NbMaxTrips) (presenceOf(outwardTrip[b][i]) * b.Cost);
subject to {
  sum(b in Buses, i in 1..NbMaxTrips) (presenceOf(outwardTrip[b][i]) * b.Seats) >= NbKids;
  sum(b in Buses, i in 1..NbMaxTrips) pulse(roundTrip[b][i],1) <= NbTeachers; 
  forall(b in Buses) {
    forall(i in 1..NbMaxTrips) {
      presenceOf(outwardTrip[b][i]) == presenceOf(roundTrip[b][i]);startAtStart(outwardTrip[b][i], roundTrip[b][i]);
      if (i>1) {
        presenceOf(roundTrip[b][i]) => presenceOf(roundTrip[b][i-1]);
        endBeforeStart(roundTrip[b][i-1], roundTrip[b][i]);
      }
    }
  }
}

tuple result
{
  string name;
  int seats;
  int s;
  int e;
}

{result} results=
{<b.Name,b.Seats,startOf(outwardTrip[b][i]),endOf(outwardTrip[b][i])> | b in Buses, i in 1..NbMaxTrips : presenceOf(outwardTrip[b][i])==1};
  
execute
{
  writeln(results);
}