资源简介
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
- 上一篇:cplex使用介绍
- 下一篇:安快车牌识别软件调试说明书
相关资源
- cplex使用介绍
- 蜂群算法求解VRPTW
- IBM ILOG CPLEX编程速成
- cplex教程中文翻译
- 最后一公里EC配送程序源代码
- CPLEX在优化调度中的应用
- vrptw问题代码
- 车辆路径问题 CVRP
- CPLEX中文教程.zip - ZIP 压缩文件
- CPLEX 8.0 Student Edition版 应用范例中文
- CPLEX 调度
- cplex与其他软件接口
- IBM ILOG CPLEX Optimization Studio Free Editio
- CPLEX 学术版安装指南
- CPLEX Optimization Studio 12.8.0.rar
- 编译原理NFA-DFA转化原创代码以及算法
- Cplex Ilog OPL 使用手册,manual
- 旅行商问题TSP两种模型-CPLEX.rar
- 解VRPTW问题的模拟退火程序
- solomon.zip
- ILOG Cplex12.8.rar
评论
共有 条评论