⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vpr.cpp

📁 解VRPTW问题的模拟退火程序
💻 CPP
字号:
// VPR.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "vpr1.h"
#include "iomanip"
using namespace std;

int main(int argc, char* argv[])
{

	double temperature;                                       //模拟退火的初始温度
	double tau;                                                 //最低温度
    double speed;                                             //汽车速度
	UINT capacity;                                            //汽车容量
	UINT count;                                               //客户数
	vector<CClient> client;                                   //客户需求信息
	double   *        distance_data;                          //客户距离信
 

	double time_low,time_uper,need,server_time;

	cout<<"请输入客户数:";
	cin>>count;
	cout<<endl;


	cout<<"请输入中心库时间窗的开始时间:";		
	cin>>time_low;
	cout<<"请输入中心库时间窗的结束时间:";		
	cin>>time_uper;
    CClient clien(0,0,time_low,time_uper,time_low,0,1);
    client.push_back(clien);

		cout<<"现在开始输入客户信息.输入顺序为:"<<endl<<"(1)需求量;(2)服务时间;(3)时间窗开始时间;(4)时间窗结束时间"<<endl;
	for (int i=1;i<=count;i++)
	{

		cin>>need>>server_time>>time_low>>time_uper;
		if(need<=0)
		{
			cout<<"客户的需求必须大于0,请重新输入!"<<endl;
			i--;
			continue;
		}
		
		if(server_time<=0)
		{
			cout<<"客户的服务时间必须大于0,请重新输入!"<<endl;
			i--;
			continue;
		}
		if(time_uper<time_low)
		{
			cout<<"看仔细哦~~结束时间怎么能小于开始时间呢?"<<endl;
			i--;
			continue;
		}
		CClient cli(need,server_time,time_low,time_uper,0,i-1,(i+1)%(count+1));
		client.push_back(cli);
	}

	cout<<"恭喜,成功了一半.现在要输入距离信息啦!输入规则如下:"<<endl;
	cout<<"依次输入第i个客户到第j个客户的距离,注意i<j,且要从i=1顺次输入,不得跳着输入."<<endl;
	//为距离信息分配空间
	int tco=(count+1)*count/2;
	distance_data=new double[tco];

	for (i=0;i<tco;i++)
	{
		UINT I,J;
		int k=2*count+1;
		I=(k-sqrt(k*k-8*i))/2;
		J=i-(k-I)*I/2+I+1;

		cin>>distance_data[i];
	}

	cout<<"最后阶段了,有点耐心啊"<<endl;
	cout<<"输入倒计时:4!请输入汽车容量"<<endl;
	cin>>capacity;

	cout<<"输入倒计时:3!请输入汽车速度"<<endl;
	cin>>speed;

	cout<<"输入倒计时:2!请输入最高温度:";
	cin>>temperature;
	cout<<endl;

	cout<<"输入倒计时:1!请输入最低温度";
	cin>>tau;
	cout<<endl;



	cout<<"哈哈!哈哈!大功告成了,等着Copy结果吧~~"<<endl;

	CVPR vpr(temperature,tau,

    speed,       //汽车速度
	capacity,      //汽车容量
	count,        //客户数
	client,  //客户需求信息
    distance_data //客户距离信
	);
	cout<<"您输入的客户信息为:"<<endl;

    	cout<<"客户   "<<"需求  "<<"服务时间  "<<"    时间窗   "
		<<"  新的开始时间 "<<" 前一个客户   "<<"后一个客户"<<endl;

	for (i=0;i<=count;i++)
	{
		cout<<i<<setw(8)<<vpr.m_Client[i].GetNeed()<<setw(8)<<vpr.m_Client[i].GetServerTime()<<setw(10)<<"["
			<<vpr.m_Client[i].GetTime_low()<<setw(4)<<vpr.m_Client[i].GetTime_uper()<<"]"<<setw(12)
			<<vpr.m_Client[i].GetTime_new()<<setw(14)
			<<vpr.m_Client[i].GetPrevious()<<setw(12)<<vpr.m_Client[i].GetNext()<<endl;
	}
	cout<<"现在输出距离信息"<<endl;
	for (i=0;i<=count;i++)
	{   cout<<setw(3);
		for (int j=0;j<=count;j++)
		{
			cout<<vpr.CalD(i,j)<<setw(8);
		}
		cout<<endl;
	}

 if(!vpr.SimulatedAnnealing(0.5,20,31))cout<<"此问题没有解,请检查!!!"<<endl;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -