当前位置: 首页 > 知识库问答 >
问题:

IBM CPLEX Optimization Studio OPL不尊重约束?

金昂熙
2023-03-14

我正在做一个项目,其中我有一个节点之间的距离矩阵,我导入到cplex。我这样做:

tuple arc{
 float x;
 float y;
 float d;
 float Ttime;       //Time to travell the arc
 }

 tuple vehicle{
 key int id;
 int STdepot;   //Starting Depot (1 or 2)
 int MaxCars;       //Maximum number of cars in a vehicle
 float AvSpeed;     //Average Speed of a vehicle
 }

tuple cavities{
key int id;
float x;
float y;
float rate;         //Consumption Rate
float iniStock;     //Initial Stock to be consumed at cavitie x
float deadline;     //Deadline to arrive at cavitie x
int ProdCons;       //Production Consumed at cavitie x

}

tuple CAVtype{
key int id;
int CarsCons;       //Consuming cars of 12 or 20
}

tuple nodes{
key int id;
float x;        //Coordinates in X
float y;        //Coordinates in Y
string type;
}       
 setof(arc)         OD = ...;   //DistanceMatrix
 setof(vehicle)     K=...;      //Vehicles
 setof(cavities)    C=...;      //Cavities
 setof(CAVtype)     T=...;      // Cavities Type
 setof(nodes)       N=...;      //Nodes

  float d[N][N];
  float t[N][N];    

execute preProcess{

  cplex.tilim=300;
  for(var i in N){
    for(var j in N){
        d[i][j] = 9999;
        t[i][j] = 9999;
    }
  }

  for(var arc in OD){
  var origin = N.get(arc.x);      
  var destination = N.get(arc.y);

      d[origin][destination] = arc.d;
      t[origin][destination] = arc.Ttime;
  }  
 }

它导入所有内容,但当我添加限制时,距离矩阵不受尊重,变量显示没有连接的节点之间的连接。另外,最后的限制改变了q的值,为什么会发生这种情况?我怎样才能解决这个问题?

提前谢谢。

目标函数和限制条件如下:

    dexpr float MachineStoppage = sum(k in K,i in N,j in N) d[i][j] * x[i][j][k] + 
 sum(g in C,k in K) penalize *phi[g] + sum(i in N,g in C) u[i][g];              //(1)

minimize MachineStoppage;

//*******************************|Restrictions|***********************************************************
subject to{

forall (i in C, k in K)                                         //(2)
  FlowConservation:
 sum(j in N: i.id!=j.id) x[<i.id>][j][k] == z[<i.id>][k];

forall (i in C, k in K)                                         //(3)
  FlowConservation2:
 sum(j in N: i.id!=j.id) x[j][<i.id>][k] == z[<i.id>][k];


 forall(i in N, k in K: i.type == "d" && k.STdepot!= i.id)                                          //(5)
   DepartingFromAnyDepot:
  sum(j in N: i.id!=j.id) x[i][j][k] == 0;


 forall(i in N)                      
   sum(k in K) z[i][k]==1; 

 forall(i in N,j in N,k in K: i!=j && j.id!=0)                          //(8)
   ArrivalTimeTracking1:
  w[k][i] + t[i][j] <= w[k][j] + M*(1-x[i][j][k]);


 forall(i in N,j in N,k in K: i!=j && j.id!=0)                          //(9)
   ArrivalTimeTracking2:
  w[k][i] + t[i][j] >= w[k][j]- M*(1-x[i][j][k]);

 forall(k in K, g in C, i in N)                                         //(10)
   ReplenishmentDelay:
 //w[k][<g.id>] <= g.deadline + phi[g];
  w[k][<g.id>] <= g.deadline + phi[g];

 forall(i in N, g in C, k in K)                                        //(11)
   QuantitiesToBeDeliveredToTheCavities:                            
  q[k][g] == ((g.rate*w[k][<g.id>]) + u[i][g] + (g.ProdCons-g.iniStock));

 forall(i in N,g in C,k in K)                                          //(12)
   LimitofQuantitiesToBeDelivered:
   q[k][g] >= z[i][k] * g.ProdCons;
  //q[k][g] >= z[<i.id>][k] * g.ProdCons;

 forall(h in T, k in K)                                                //(13)
   NumberOfCarsOfEachTypeinEachVehicle:
  sum(i in N,g in C) q[k][g] <= h.CarsCons*y[k][h];

/*
 forall(k in K, g in C)                                                //(14)
   MaximumOfCarsinaVehicle:
  sum(h in T) y[k][h] <=b;
*/

共有1个答案

段干飞翮
2023-03-14

你确定你没有得到一个轻松的解决方案吗?在文件中

IDE和OPL

你可以看看“放松不可行模型”一节。

 类似资料:
  • 我有以下JPA实体 这是我检查唯一约束的测试,插入具有相同电子邮件的另一个用户。

  • 问题内容: 在纯Java SE 6环境中: Eclipse控制台中未显示任何内容。 l.info(“”) 及以上的作品就好了,但低于任何 罚款 只是似乎没有工作。有什么问题吗?TIA。 问题答案: 即使Logger级别设置为ALL,ConsoleHandler(记录器上的默认Handler)仍然具有INFO的默认级别。这来自 JAVA_HOME / jre / lib中 的默认logging.pr

  • 问题内容: 我对Guice以及它的单例是否服从线程限制(我可以尝试设置)感到担忧: 如您所见,每次我们创建的新实例时,都会使用a来引导其下的整个依赖关系树。 如果从多个线程内部调用会怎样? 例如:线程1 通过其no-arg构造函数创建了一个新线程,而线程2执行了相同的操作。 Guice将为每个线程的实例提供相同的确切实例,还是Guice将为每个线程提供2个不同的实例?尽管应该返回相同的单例实例,但

  • 环境: Eclipse Juno Junit 4.11 maven 3.0.4 问题: 我相信在Eclipse的junit运行器中运行单元测试时遇到了类加载问题。我的具体问题源于这段代码: 上面的代码最终将使用一个类的名称调用,该类位于maven依赖项中(依赖项只是一个java bean的集合)。当我运行mvn测试时,这段代码成功运行,但是,如果我使用eclipse运行junit测试,我会收到一个

  • 问题内容: 我有一个使用Hibernate为HSQL db生成表的应用程序(因为我的应用程序仍在开发中)。在我的域模型中,我已经设定 当我使用DBVisualizer打开数据库时,可以看到所有设置都正确,除了它无法正常工作外,我的列接受的长度超过10个字符的值。当我尝试在DBVisualier中手动运行查询时,它会失败,但是应该进入休眠状态。 同样非常奇怪的是,当我使用文件(而不是在内存db中)以

  • 问题内容: 我正在尝试学习Hibernate的工作方式,并且几乎陷入了无法接受的学习曲线。我看不到如何使Hibernate尊重我的对象的auto_increment策略。而是使用现有ID(从1开始)覆盖数据库中的条目。 我有一个简单的对象,由定义如下的MySQL表支持: 我已经确认使用SQL()手动插入多个Foo对象是正确的。 我的Java类具有使用如下注释来指定的ID: 然后,我执行一些测试代码