• 大小: 15KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: 其他
  • 标签: CPLEX  VRPTW  原创代码  

资源简介

CPLEX求解VRPTW,数据来源于Solomon标准数据,原创代码,可以直接运行,注释写的很详细,花费了一些心思。想了解更多详情,可关注微信公众号:数据魔术师

资源截图

代码片段和文件信息

package vrptw;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;
import ilog.concert.IloException;
import ilog.concert.IloNumExpr;
import ilog.concert.IloNumVar;
import ilog.concert.IloNumVarType;
import ilog.cplex.IloCplex;
/**
 * @author: huangnan
 * @School: HuaZhong University of science and technology
 * @操作说明:读入不同的文件前要手动修改vetexnum参数,参数值为所有点个数包括配送中心0和n+1,
 * 代码算例截取于Solomon测试算例
 *
 */
//定义参数
class Data{
int vetexnum; //所有点集合n(包括配送中心和客户点,首尾(0和n)为配送中心)
double E;        //配送中心时间窗开始时间
double L;         //配送中心时间窗结束时间
int vecnum;     //车辆数
double cap;      //车辆载荷
int[][] vertexs; //所有点的坐标xy
int[] demands; //需求量
int[] vehicles; //车辆编号
double[] a; //时间窗开始时间【a[i]b[i]】
double[] b; //时间窗结束时间【a[i]b[i]】
double[] s; //客户点的服务时间
int[][] arcs; //arcs[i][j]表示i到j点的弧
double[][] dist; //距离矩阵,满足三角关系暂用距离表示花费 C[i][j]=dist[i][j]
//截断小数3.26434-->3.2
public double double_truncate(double v){
int iv = (int) v;
if(iv+1 - v <= 0.000000000001)
return iv+1;
double dv = (v - iv) * 10;
int idv = (int) dv;
double rv = iv + idv / 10.0;
return rv;
}
}
//类功能:解的可行性判断(可直接跳过此类)
class Solution{
double epsilon = 0.0001;
Data data = new Data();
ArrayList> routes = new ArrayList<>();
ArrayList> servetimes = new ArrayList<>();
public Solution(Data data ArrayList> routes ArrayList> servetimes) {
super();
this.data = data;
this.routes = routes;
this.servetimes = servetimes;
}
//函数功能:比较两个数的大小
public int double_compare(double v1double v2) {
if (v1 < v2 - epsilon) {
return -1;
}
if (v1 > v2 + epsilon) {
return 1;
}
return 0;
}
//函数功能:解的可行性判断
public void fesible() throws IloException {
//车辆数量可行性判断
if (routes.size() > data.vecnum) {
System.out.println(“error: vecnum!!!“);
System.exit(0);
}
//车辆载荷可行性判断
for (int k = 0; k < routes.size(); k++) {
ArrayList route = routes.get(k);
double capasity = 0;
for (int i = 0; i < route.size(); i++) {
capasity += data.demands[route.get(i)];
}
if (capasity > data.cap) {
System.out.println(“error: cap!!!“);
System.exit(0);
}
}
//时间窗、车容量可行性判断
for (int k = 0; k < routes.size(); k++) {
ArrayList route = routes.get(k);
ArrayList servertime = servetimes.get(k);
double capasity = 0;
for (int i = 0; i < route.size()-1; i++) {
int origin = route.get(i);
int destination = route.get(i+1);
double si = servertime.get(i);
double sj = servertime.get(i+1);
if (si < data.a[origin] && si >  data.b[origin]) {
System.out.println(“error: servertime!“);
System.exit(0);
}
if (double_compare(si + data.dist[origin][destination]data.b[destination]) > 0) {
System.out.println(origin + “: [“ + data.a[origin

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        598  2017-06-04 20:04  VRPTW\.settings\org.eclipse.jdt.core.prefs

     文件        752  2017-09-20 13:27  VRPTW\bin\vrptw\Data.class

     文件       3608  2017-09-20 13:27  VRPTW\bin\vrptw\Solution.class

     文件      10216  2017-09-20 13:27  VRPTW\bin\vrptw\Vrptw.class

     文件       7523  2017-09-06 15:17  VRPTW\data\c101.txt

     文件       7523  2017-09-06 14:43  VRPTW\data\c102.txt

     文件      15393  2017-09-20 13:27  VRPTW\src\vrptw\Vrptw.java

     目录          0  2017-09-20 13:43  VRPTW\bin\vrptw

     目录          0  2017-09-20 13:43  VRPTW\src\vrptw

     目录          0  2017-09-20 13:43  VRPTW\.settings

     目录          0  2017-09-20 13:43  VRPTW\bin

     目录          0  2017-09-20 13:43  VRPTW\data

     目录          0  2017-09-20 13:43  VRPTW\src

     目录          0  2017-09-20 13:43  VRPTW

----------- ---------  ---------- -----  ----

                45613                    14


评论

共有 条评论