首页 > 解决方案 > 自动驾驶车辆共享预订问题CPLEX代码修正

问题描述

我正在尝试破解这篇关于保留共享自动驾驶汽车的论文的 CPLEX 代码。首先,我没有为此使用元组,但后来我意识到我需要这样做。所以我尝试将元组组合到车辆路径问题中,但是 CPLEX 没有给我一个解决方案。附图是论文的参数、目标函数和约束,后面是我的代码。

范围 目标函数+约束


int n = 5;
range N = 1..n;
int F =3;
range car=1..F;

tuple Arc{
 int fromNode; //1 - 5
 int toNode;  // 1 - 5
 float dist;  //1-8 
 int fromTime; //1-4
 int toTime; // 1 - 5
 int TTime // 1 -3
}

range I=1..5;
range J=1..5;
range L=1..8;
range M=1..4;
range O=1..5;
range P=1..3;


{Arc} Arcs = {<1,4,4,1,2,1>,<2,1,1,1,3,2>,<2,3,1.5,3,4,1>, <2,4,1,2,4,2>,<3,2,7,2,5,3>,<3,4,3,1,3,2>,<3,5,1,1,2,1>,<4,1,2,3,4,1>,<5,2,1,2,3,1>,<5,3,2,4,5,1>,<5,4,5,2,4,2>};
int m[I][J];  
dvar boolean x[I][J];
dvar int u[2..n];

minimize sum (i in I, j in J,a in Arcs) a.dist*x[i][j];

subject to{

    forall(i in I,j in N)
        sum (a in Arcs : a.toNode == i) x[i][j] == sum (a in Arcs : a.fromNode == i) x[i][j]; 


    forall (i in N, j in J)
        sum (a in Arcs : a.toNode == i) x[i][j] == 1;

    forall(a in Arcs : a.toNode>1 && a.fromNode>1, i in N, j in J)
        u[a.toNode] +1 <= u[a.fromNode] + 1000*(1-x[i][j]);


    forall (a, b in Arcs, i in N, j in N)
        if (a.toTime - b.fromTime<0) x[i][j]==0;
    forall (a in Arcs, i in N, j in N)
        sum (a in Arcs) x[i][j] <=F;
    forall (a in Arcs, i in N, j in N)
        x[i][j]<=m[i][j];
    forall (i,j in N)
        sum(j in N) x[i][j] == sum(j in N) x[j][i];
    forall (i,j in N)
        if (i==1 && j==5) m[i][j]==F;
        else m[i][j]==1;
    forall (i,j in N:j!=1)
        if (i==1) x[i][j]==F;
    forall (i,j in N:j!=5)
        if (i==5) x[j][i]==F;
}

标签: cplex

解决方案


您的模型中有几个问题:

  1. 整数米[I][J];意味着所有 m 都将是 0 这看起来很奇怪
  2. F 是 3,x 是布尔值,所以下面看起来也很奇怪

    forall (i,j in N:j!=1) if (i==1) x[i][j]==F;

    forall (i,j in N:j!=5)if (i==5) x[j][i]==F;


推荐阅读