Hi everyone,
I'm trying to solve a Heterogenous VRP with Time windows, however the code developed can´t find any solution and i don't uderstand why. Could you help me please ! I'm already trying for too long to solve this problem. Here is my code, any doubt telmm me pls.
Thanks!
using CP;
//Veiculos
int v=...;
range veiculos = 1..v;
int M=1000;
int DM=30000;
//Clientes
int NumeroClientes=...;
range clientes=1..NumeroClientes;
range clientesEarmazem=0..(NumeroClientes+1);//inclui o ponto de início no armazém e pontop de chegada ao armazém
//Capacidade
int Capacidade [veiculos]=...;
//Procura
int Procura [clientes]=...;
//Janelas Temporais
int LBTW[clientesEarmazem]=...;
int UBTW[clientesEarmazem]=...;
float S[clientesEarmazem];//Tempo de Serviço
float dist [clientesEarmazem][clientesEarmazem]=...;
float tempo [clientesEarmazem][clientesEarmazem]=...;
float custo[veiculos]=...;
execute TempoServico {
for (var i in clientesEarmazem){
if (i==0|| i==NumeroClientes+1) {
S[i]==0;
} else{
S[i]=2.5+1.5*(Procura[i]/6);
}
}
}
//Variáveis de decisão
dvar boolean x[veiculos][clientesEarmazem][clientesEarmazem];//Valor é 1 se o arco for percorrido
dvar int W[veiculos][clientesEarmazem]; //variável de tempo
dexpr float maxTempoPerdidoEntreClientes = max( i, j in clientesEarmazem)(LBTW[i]+ tempo [i][j] - UBTW[i]);
//Função Objectivo
minimize sum (k in veiculos, i,j in clientesEarmazem) (dist[i][j]*x[k][i][j]*custo[k]);
subject to {
//nenhum nó se visita a si próprio qualquer que seja o veiculo
ct01: forall (i in clientesEarmazem, k in veiculos)
x[k][i][i]==0;
//Cada Cliente é visitado exatamente 1x
ct02: forall (i in clientes)
sum (k in veiculos, j in clientesEarmazem) x[k][i][j] == 1;
//Quantidade transportada tem de ser menor que a capacidade do veículo
ct03: forall ( k in veiculos)
sum (i in clientes, j in clientesEarmazem) (Procura[i] * x[k][i][j]) <= Capacidade[k];
//A um nó não pode ser atribuído mais que 1 veículo
ct04: forall(k in veiculos)
sum (j in clientes) x[k][0][j]==1;
// Um veiculo so pode regressar de 1 nó
ct05: forall (k in veiculos)
sum (i in clientesEarmazem) x[k][i][NumeroClientes+1] <=1;
//Um veículo que se dirige a um cliente terá de partir desse mesmo cliente
ct06: forall (p in clientes, k in veiculos)
sum (i in clientesEarmazem) x[k][i][p]- sum (j in clientesEarmazem) x[k][p][j]==0;
//Janelas Temporais
forall(i in clientesEarmazem, k in veiculos)
LBTW[i] <= W[k][i] <= UBTW[i];
//Cumprimento das janelas temporais
ct08: forall (i,j in clientesEarmazem, k in veiculos)
W[k][i] + S[i] + tempo [i][j] - W[k][j] <= (1-x[k][i][j])*M;
//W[k][i] + S[i] + tempo [i][j] - (1-x[k][i][j])*maxTempoPerdidoEntreClientes <= W[k][j];
//limitação do número de veículos à frota disponível
ct10: forall(k in veiculos, j in clientesEarmazem)
sum (k in veiculos, j in clientesEarmazem) x[k][0][j]<= v;
//limitação da duração da rota
ct11: forall (k in veiculos)
W[k][NumeroClientes+1]-W[k][0]<=DM;
/*ct11: forall (k in veiculos)
sum(i in clientesEarmazem, j in clientesEarmazem)(tempo[i][j]+S[j])*x[k][i][j]<=DM; */
};
------------------------------
Manuel Eusébio
------------------------------
#DecisionOptimization