问题定义:
VRPTW,即带时间窗约束的车辆路径问题,是在经典的VRP问题上加入了一个时间窗约束。
数学模型:
求解:
代码结构:
其中Data类表示定义参数,读取数据和初始化参数
package com.chb;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Data {
public static int pointnum=102;
public static int carnum;
public static int cap;
public static double E;
public static double L;
public static int point[][]=new int[pointnum][2];
public static int s[]=new int[pointnum];
public static double a[]=new double[pointnum];
public static double b[]=new double[pointnum];
public static int demand[]=new int[pointnum];
public static int car[]=new int[pointnum];
public static double dist[][]=new double[pointnum][pointnum];
public static double arcs[][]=new double[pointnum][pointnum];
//截断小数3.26434-->3.2
public static 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;
}
//读取数据并且初始化参数
public static void read_data(String path,Data data) throws Exception {
String line=null;
String substr[]=null;
Scanner cin=new Scanner(new BufferedReader(new FileReader(path)));
for (int i = 0; i < 4; i++) {
line=cin.nextLine();
}
line=cin.nextLine();
line.trim();
substr=line.split("\\s+");
carnum=Integer.parseInt(substr[1]);
cap=Integer.parseInt(substr[2]);
for (int i = 0; i < 4; i++) {
line=cin.nextLine();
}
for (int i = 0; i < pointnum-1; i++) {
line=cin.nextLine();
line.trim();
substr=line.split("\\s+");
point[i][0]=Integer.parseInt(substr[2]);
point[i][1]=Integer.parseInt(substr[3]);
demand[i]=Integer.parseInt(substr[4]);
a[i]=Integer.parseInt(substr[5]);
b[i]=Integer.parseInt(substr[6]);
s[i]=Integer.parseInt(substr[7]);
}
cin.close();
//终点数据初始化
point[pointnum-1]=point[0];
demand[pointnum-1]=demand[0];
a[pointnum-1]=a[0];
b[pointnum-1]=b[0];
s[pointnum-1]=s[0];
E=a[0];
L=b[0];
double min1=1e15;
double min2=1e15;
//距离矩阵初始化
for (int i = 0; i < pointnum; i++) {
for (int j = 0; j < pointnum; j++) {
if(i==j) {
dist[i][j]=0;
continue;
}else {
dist[i][j]=Math.sqrt(Math.pow(point[i][0]-point[j][0], 2)+Math.pow(point[i][1]-point[j][1], 2));
dist[i][j]=double_truncate(dist[i][j]);
}
}
}
dist[pointnum-1][0]&#