CPLEX-求解VRPTW模型

问题定义:
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==
  • 3
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值