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

📄 mydpso.h

📁 蚁群算法解决车辆最优路径问题
💻 H
字号:
// MyDPSO.h: interface for the MyDPSO class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYDPSO_H__D0F0A14C_B311_47BA_878D_F09D808B69A6__INCLUDED_)
#define AFX_MYDPSO_H__D0F0A14C_B311_47BA_878D_F09D808B69A6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "DPSO.h"
#include <iostream.h>
#include <math.h>

class MyDPSO : public DPSO
{
public:
	MyDPSO(int d, int n,int* city_root):DPSO(d, n,city_root){}; 
	double GetFit(DPARTICLE &p) 
	{
		double distance_chart[9][9] = {{0,40,60,75,90,200,100,160,80},
										{40,0,65,40,100,50,75,110,100},
										{60,65,0,75,100,100,75,75,75},
										{75,40,75,0,100,50,90,90,150},
										{90,100,100,100,0,100,75,75,100},
										{200,50,100,50,100,0,70,90,75},
										{100,75,75,90,75,70,0,70,100},
										{160,110,75,90,75,90,70,0,100},
										{80,100,75,150,100,75,100,100,0}};//0~8,9个点,0位发货点

		double time_message[3][8] ={{1,4,1,4,3,2,5,1.5},//早到时间窗
									{4,6,2,7,5.5,5,8,4},//迟到时间窗
									{1,2,1,3,2,2.5,3,0.8}};//装卸时间

		double f6 = 0;
		double f6_part1 = 0;//目标函数的第一部分
		double f6_part2to3 = 0;//目标函数的第二,三部分(早到,迟到部分)

		double P_early = 50;//早到的惩罚权重
		double P_late = 50;//晚到的惩罚权重

		double T_wait = 0;//在等候上总耽搁的时间
		double T_all = 0;//总时间
        double D_all = 0;//总距离
        
		D_all = D_all + distance_chart[0][p.X[0]];//凡是涉及distance_chart原来需要-1的操作都不要了,因为那个表格是0~8
		//没有堵车,由于存在车速,所以T_all与D_all不相同,当时分开存储为了方便计算f6,现在看来也增加了扩展性
        

		T_all = D_all/50 + T_wait;//不断更新T_all因为计算T_wait时需要,车速50
        
		f6_part2to3 = f6_part2to3 + P_early*((time_message[0][p.X[0]-1] - T_all)>=0?(time_message[0][p.X[0]-1] - T_all):0) + P_late*((T_all - time_message[1][p.X[0]-1])>=0?(T_all - time_message[1][p.X[0]-1]):0);
		//计算从发货点到了第一个城市后的目标函数第二,三部分值

		for(int s=1; s<p.Dim; s++)//dim是sa的数据成员
		{
            D_all = D_all + distance_chart[p.X[s]][p.X[s-1]];//由于distance_chart是0~8,所以原来order[s]-1,order[s-1]-1就不用-1了 	

			T_wait = T_wait + ((time_message[0][p.X[s-1]-1] - T_all)>=0?(time_message[0][p.X[s-1]-1] - T_all):0)+time_message[2][p.X[s-1]-1];
			//等候的总时间,X[i-1]-1,第一个-1是因为数组的0位起始现象,第二个-1是因为查到城市编号后要对应找其坐标或相应数据时的数组0位起始现象
            //此外由于加入了卸货时间,所以要加入,涉及到time_message都要两次-1操作,因为那个表格是从1~8

			T_all = D_all/50 + T_wait;

			f6_part2to3 = f6_part2to3 + P_early*((time_message[0][p.X[s]-1] - T_all)>=0?(time_message[0][p.X[s]-1] - T_all):0) + P_late*((T_all - time_message[1][p.X[s]-1])>=0?(T_all - time_message[1][p.X[s]-1]):0);//要多用头脑中虚拟运行程序走一遍程序,主要发现累加问题,错1问题,重复赋值问题等;
		}

        D_all = D_all + distance_chart[p.X[p.Dim-1]][0]; 
			//sqrt((CO[0][p.X[dim-1]-1]-Origin[0][0])*(CO[0][p.X[13]-1]-Origin[0][0])+(CO[1][p.X[13]-1]-Origin[1][0])*(CO[1][p.X[13]-1]-Origin[1][0]));
		T_wait = T_all + ((time_message[0][p.X[p.Dim-1]-1] - T_all)>=0?(time_message[0][p.X[p.Dim-1]-1] - T_all):0)+time_message[2][p.X[p.Dim-1]-1];
		T_all = D_all/50 + T_wait;
		//注:f6_part2to3出现的位置(在更新的T_all后面)决定了后式不用再出现(除非回发货点也有软硬时间窗要求)f6_part2to3 =f6_part2to3 + P_early* max(T0[0][p.X[13]-1] - T_all,0) + P_late*max(T_all - p.X[13]-1,0);
		f6_part1 = D_all;
		f6 = f6_part1 + f6_part2to3;//两部分相加,其实f6_part1即D_all,但为了程序的可读性,所以如此

		return f6;//f6最后存储的是某条走完dim个城市回发货点的目标函数值(环状)
	}
};


#endif // !defined(AFX_MYDPSO_H__D0F0A14C_B311_47BA_878D_F09D808B69A6__INCLUDED_)

⌨️ 快捷键说明

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