📄 mydpso.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 + -