資源簡介
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? 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? ArrayList?route?=?routes.get(k);
double?capasity?=?0;
for?(int?i?=?0;?i? capasity?+=?data.demands[route.get(i)];
}
if?(capasity?>?data.cap)?{
System.out.println(“error:?cap!!!“);
System.exit(0);
}
}
//時間窗、車容量可行性判斷
for?(int?k?=?0;?k? ArrayList?route?=?routes.get(k);
ArrayList?servertime?=?servetimes.get(k);
double?capasity?=?0;
for?(int?i?=?0;?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.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使用介紹
- 下一篇:安快車牌識別軟件調試說明書
評論
共有 條評論