git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@1496 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
8083d04eb7
commit
274b633647
23 changed files with 7562 additions and 0 deletions
32
contribution/branches/PSO-DVRP/CMakeLists.txt
Normal file
32
contribution/branches/PSO-DVRP/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
INCLUDE_DIRECTORIES(${PARADISEO_EO_SRC_DIR}/src
|
||||
${PARADISEO_MO_SRC_DIR}/src
|
||||
${PARADISEO_MOEO_SRC_DIR}/src
|
||||
${PARADISEO_PEO_SRC_DIR}/src
|
||||
${PEOPSODVRP_SOURCE_DIR}/src)
|
||||
|
||||
|
||||
######################################################################################
|
||||
|
||||
|
||||
######################################################################################
|
||||
### Specify where CMake can find the libraries
|
||||
######################################################################################
|
||||
|
||||
# Link with the EO library directory, only if you need it
|
||||
LINK_DIRECTORIES(${PARADISEO_EO_BIN_DIR}/lib)
|
||||
|
||||
# Link with the MOEO library directory, only if you need it
|
||||
LINK_DIRECTORIES(${PARADISEO_MOEO_BIN_DIR}/lib)
|
||||
|
||||
# Link with the PEO library directory, only if you need it
|
||||
LINK_DIRECTORIES(${PARADISEO_PEO_BIN_DIR}/lib)
|
||||
|
||||
LINK_DIRECTORIES(${PEOPSODVRP_BINARY_DIR}/src)
|
||||
|
||||
|
||||
# Make sure the linker can find the Hello library once it is built.
|
||||
|
||||
add_library (event eoEventScheduler.cpp parser.cpp eoPsoDVRPutils.cpp eoPsoDVRP.cpp eoGlobal.cpp)
|
||||
|
||||
|
||||
227
contribution/branches/PSO-DVRP/Makefile
Normal file
227
contribution/branches/PSO-DVRP/Makefile
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
# CMAKE generated file: DO NOT EDIT!
|
||||
# Generated by "Unix Makefiles" Generator, CMake Version 2.6
|
||||
|
||||
# Default target executed when no arguments are given to make.
|
||||
default_target: all
|
||||
.PHONY : default_target
|
||||
|
||||
#=============================================================================
|
||||
# Special targets provided by cmake.
|
||||
|
||||
# Disable implicit rules so canoncical targets will work.
|
||||
.SUFFIXES:
|
||||
|
||||
# Remove some rules from gmake that .SUFFIXES does not remove.
|
||||
SUFFIXES =
|
||||
|
||||
.SUFFIXES: .hpux_make_needs_suffix_list
|
||||
|
||||
# Suppress display of executed commands.
|
||||
$(VERBOSE).SILENT:
|
||||
|
||||
# A target that is always out of date.
|
||||
cmake_force:
|
||||
.PHONY : cmake_force
|
||||
|
||||
#=============================================================================
|
||||
# Set environment variables for the build.
|
||||
|
||||
# The shell in which to execute make rules.
|
||||
SHELL = /bin/sh
|
||||
|
||||
# The CMake executable.
|
||||
CMAKE_COMMAND = /usr/bin/cmake
|
||||
|
||||
# The command to remove a file.
|
||||
RM = /usr/bin/cmake -E remove -f
|
||||
|
||||
# The program to use to edit the cache.
|
||||
CMAKE_EDIT_COMMAND = /usr/bin/ccmake
|
||||
|
||||
# The top-level source directory on which CMake was run.
|
||||
CMAKE_SOURCE_DIR = /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp
|
||||
|
||||
# The top-level build directory on which CMake was run.
|
||||
CMAKE_BINARY_DIR = /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp
|
||||
|
||||
#=============================================================================
|
||||
# Targets provided globally by CMake.
|
||||
|
||||
# Special rule for the target edit_cache
|
||||
edit_cache:
|
||||
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/src && /usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
|
||||
.PHONY : edit_cache
|
||||
|
||||
# Special rule for the target edit_cache
|
||||
edit_cache/fast: edit_cache
|
||||
.PHONY : edit_cache/fast
|
||||
|
||||
# Special rule for the target rebuild_cache
|
||||
rebuild_cache:
|
||||
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/src && /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
|
||||
.PHONY : rebuild_cache
|
||||
|
||||
# Special rule for the target rebuild_cache
|
||||
rebuild_cache/fast: rebuild_cache
|
||||
.PHONY : rebuild_cache/fast
|
||||
|
||||
# The main all target
|
||||
all: cmake_check_build_system
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(CMAKE_COMMAND) -E cmake_progress_start /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/CMakeFiles /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/src/CMakeFiles/progress.make
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f CMakeFiles/Makefile2 src/all
|
||||
$(CMAKE_COMMAND) -E cmake_progress_start /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/CMakeFiles 0
|
||||
.PHONY : all
|
||||
|
||||
# The main clean target
|
||||
clean:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f CMakeFiles/Makefile2 src/clean
|
||||
.PHONY : clean
|
||||
|
||||
# The main clean target
|
||||
clean/fast: clean
|
||||
.PHONY : clean/fast
|
||||
|
||||
# Prepare targets for installation.
|
||||
preinstall: all
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall
|
||||
.PHONY : preinstall
|
||||
|
||||
# Prepare targets for installation.
|
||||
preinstall/fast:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall
|
||||
.PHONY : preinstall/fast
|
||||
|
||||
# clear depends
|
||||
depend:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
|
||||
.PHONY : depend
|
||||
|
||||
# Convenience name for target.
|
||||
src/CMakeFiles/event.dir/rule:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/event.dir/rule
|
||||
.PHONY : src/CMakeFiles/event.dir/rule
|
||||
|
||||
# Convenience name for target.
|
||||
event: src/CMakeFiles/event.dir/rule
|
||||
.PHONY : event
|
||||
|
||||
# fast build rule for target.
|
||||
event/fast:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/build
|
||||
.PHONY : event/fast
|
||||
|
||||
# target to build an object file
|
||||
eoEventScheduler.o:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoEventScheduler.o
|
||||
.PHONY : eoEventScheduler.o
|
||||
|
||||
# target to preprocess a source file
|
||||
eoEventScheduler.i:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoEventScheduler.i
|
||||
.PHONY : eoEventScheduler.i
|
||||
|
||||
# target to generate assembly for a file
|
||||
eoEventScheduler.s:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoEventScheduler.s
|
||||
.PHONY : eoEventScheduler.s
|
||||
|
||||
# target to build an object file
|
||||
eoGlobal.o:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoGlobal.o
|
||||
.PHONY : eoGlobal.o
|
||||
|
||||
# target to preprocess a source file
|
||||
eoGlobal.i:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoGlobal.i
|
||||
.PHONY : eoGlobal.i
|
||||
|
||||
# target to generate assembly for a file
|
||||
eoGlobal.s:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoGlobal.s
|
||||
.PHONY : eoGlobal.s
|
||||
|
||||
# target to build an object file
|
||||
eoPsoDVRP.o:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRP.o
|
||||
.PHONY : eoPsoDVRP.o
|
||||
|
||||
# target to preprocess a source file
|
||||
eoPsoDVRP.i:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRP.i
|
||||
.PHONY : eoPsoDVRP.i
|
||||
|
||||
# target to generate assembly for a file
|
||||
eoPsoDVRP.s:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRP.s
|
||||
.PHONY : eoPsoDVRP.s
|
||||
|
||||
# target to build an object file
|
||||
eoPsoDVRPutils.o:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRPutils.o
|
||||
.PHONY : eoPsoDVRPutils.o
|
||||
|
||||
# target to preprocess a source file
|
||||
eoPsoDVRPutils.i:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRPutils.i
|
||||
.PHONY : eoPsoDVRPutils.i
|
||||
|
||||
# target to generate assembly for a file
|
||||
eoPsoDVRPutils.s:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/eoPsoDVRPutils.s
|
||||
.PHONY : eoPsoDVRPutils.s
|
||||
|
||||
# target to build an object file
|
||||
parser.o:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/parser.o
|
||||
.PHONY : parser.o
|
||||
|
||||
# target to preprocess a source file
|
||||
parser.i:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/parser.i
|
||||
.PHONY : parser.i
|
||||
|
||||
# target to generate assembly for a file
|
||||
parser.s:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(MAKE) -f src/CMakeFiles/event.dir/build.make src/CMakeFiles/event.dir/parser.s
|
||||
.PHONY : parser.s
|
||||
|
||||
# Help Target
|
||||
help:
|
||||
@echo "The following are some of the valid targets for this Makefile:"
|
||||
@echo "... all (the default if no target is provided)"
|
||||
@echo "... clean"
|
||||
@echo "... depend"
|
||||
@echo "... edit_cache"
|
||||
@echo "... event"
|
||||
@echo "... rebuild_cache"
|
||||
@echo "... eoEventScheduler.o"
|
||||
@echo "... eoEventScheduler.i"
|
||||
@echo "... eoEventScheduler.s"
|
||||
@echo "... eoGlobal.o"
|
||||
@echo "... eoGlobal.i"
|
||||
@echo "... eoGlobal.s"
|
||||
@echo "... eoPsoDVRP.o"
|
||||
@echo "... eoPsoDVRP.i"
|
||||
@echo "... eoPsoDVRP.s"
|
||||
@echo "... eoPsoDVRPutils.o"
|
||||
@echo "... eoPsoDVRPutils.i"
|
||||
@echo "... eoPsoDVRPutils.s"
|
||||
@echo "... parser.o"
|
||||
@echo "... parser.i"
|
||||
@echo "... parser.s"
|
||||
.PHONY : help
|
||||
|
||||
|
||||
|
||||
#=============================================================================
|
||||
# Special targets to cleanup operation of make.
|
||||
|
||||
# Special rule to run CMake to check the build system integrity.
|
||||
# No rule that depends on this can have commands that come from listfiles
|
||||
# because they might be regenerated.
|
||||
cmake_check_build_system:
|
||||
cd /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
|
||||
.PHONY : cmake_check_build_system
|
||||
|
||||
34
contribution/branches/PSO-DVRP/cmake_install.cmake
Normal file
34
contribution/branches/PSO-DVRP/cmake_install.cmake
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# Install script for directory: /home/mustapha/framework/paradiseo-1.1/parallelPsoDvrp/src
|
||||
|
||||
# Set the install prefix
|
||||
IF(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||
SET(CMAKE_INSTALL_PREFIX "/usr/local")
|
||||
ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX)
|
||||
STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
# Set the install configuration name.
|
||||
IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
|
||||
IF(BUILD_TYPE)
|
||||
STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
|
||||
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
|
||||
ELSE(BUILD_TYPE)
|
||||
SET(CMAKE_INSTALL_CONFIG_NAME "Debug")
|
||||
ENDIF(BUILD_TYPE)
|
||||
MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
|
||||
ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
|
||||
|
||||
# Set the component getting installed.
|
||||
IF(NOT CMAKE_INSTALL_COMPONENT)
|
||||
IF(COMPONENT)
|
||||
MESSAGE(STATUS "Install component: \"${COMPONENT}\"")
|
||||
SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
|
||||
ELSE(COMPONENT)
|
||||
SET(CMAKE_INSTALL_COMPONENT)
|
||||
ENDIF(COMPONENT)
|
||||
ENDIF(NOT CMAKE_INSTALL_COMPONENT)
|
||||
|
||||
# Install shared libraries without execute permission?
|
||||
IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
|
||||
SET(CMAKE_INSTALL_SO_NO_EXE "1")
|
||||
ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
|
||||
|
||||
101
contribution/branches/PSO-DVRP/eoDVRPSecondsElapsedContinue.h
Normal file
101
contribution/branches/PSO-DVRP/eoDVRPSecondsElapsedContinue.h
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EODVRPSECONDSELAPSEDCONTINUE_H_
|
||||
#define EODVRPSECONDSELAPSEDCONTINUE_H_
|
||||
|
||||
#include <eo>
|
||||
#include <eoContinue.h>
|
||||
|
||||
template< class EOT>
|
||||
|
||||
|
||||
|
||||
class eoDVRPSecondsElapsedContinue : public eoContinue<EOT>
|
||||
{
|
||||
time_t start;
|
||||
|
||||
int seconds;
|
||||
|
||||
public:
|
||||
|
||||
eoDVRPSecondsElapsedContinue(int nSeconds) : start(time(0)), seconds(nSeconds) {}
|
||||
|
||||
void resetStart(){ start = time(0);}
|
||||
|
||||
|
||||
virtual bool operator() ( const eoPop<EOT>& _pop ) {
|
||||
|
||||
time_t now = time(0);
|
||||
|
||||
time_t diff = now - start;
|
||||
|
||||
if (diff >= seconds)
|
||||
|
||||
return false; //stop
|
||||
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
virtual std::string className(void) const { return "eoSecondsElapsedContinue"; }
|
||||
|
||||
void readFrom (std :: istream & __is) {
|
||||
|
||||
__is >> start >> seconds;
|
||||
}
|
||||
|
||||
void printOn (std :: ostream & __os) const {
|
||||
|
||||
__os << start << ' ' << seconds << std :: endl;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EODVRPSECONDSELAPSEDCONTINUE_H_*/
|
||||
133
contribution/branches/PSO-DVRP/eoDVRPStarTopology.h
Normal file
133
contribution/branches/PSO-DVRP/eoDVRPStarTopology.h
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EODVRPSTARTOPOLOGY_H_
|
||||
#define EODVRPSTARTOPOLOGY_H_
|
||||
|
||||
#include <eo>
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoDVRPStarTopology:public eoTopology <POT>
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
eoDVRPStarTopology(): eoTopology<POT>(), globalBest(){}
|
||||
|
||||
|
||||
|
||||
void setup(const eoPop<POT> & _pop)
|
||||
{
|
||||
|
||||
|
||||
globalBest = bestNeighbour(_pop);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void updateNeighborhood(POT & _po,unsigned _indice)
|
||||
{
|
||||
|
||||
if( _po.fitness() < _po.best())
|
||||
{
|
||||
|
||||
_po.best(_po.pLength);
|
||||
|
||||
_po.bestRoutes = _po.pRoutes;
|
||||
|
||||
_po.bestLength = _po.pLength ;
|
||||
|
||||
|
||||
for(size_t i =0, size = _po.planifiedCustomers.size(); i < size ; ++i)
|
||||
|
||||
_po.planifiedCustomers[i].bestRouting = _po.planifiedCustomers[i].pRouting;
|
||||
|
||||
|
||||
|
||||
_po.firstTimeServiceBestPosition = _po.firstTimeServiceCurrentPosition;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if ( _po.best() < globalBest.best())
|
||||
|
||||
globalBest = _po ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
POT bestNeighbour (const eoPop<POT>& _pop)
|
||||
|
||||
{
|
||||
unsigned index_best =0 ;
|
||||
|
||||
if(_pop.size() == 0)
|
||||
|
||||
cerr<<"You want to get the bestNeighbour from empty swarm...!!!!!!"<<endl;
|
||||
|
||||
for (size_t i=1, size = _pop.size(); i < size ; ++i)
|
||||
|
||||
if (_pop[i].best() < _pop[index_best].best()) //tester et v<>rifier
|
||||
|
||||
index_best = i;
|
||||
|
||||
|
||||
return _pop[index_best];
|
||||
|
||||
}
|
||||
|
||||
|
||||
virtual POT & best (unsigned i = 0){return globalBest; } ;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
POT globalBest;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EODVRPSTARTOPOLOGY_H_*/
|
||||
453
contribution/branches/PSO-DVRP/eoEventScheduler.cpp
Normal file
453
contribution/branches/PSO-DVRP/eoEventScheduler.cpp
Normal file
|
|
@ -0,0 +1,453 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
redouanedz
|
||||
àà * (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#include "eoEventScheduler.h"
|
||||
#include "eoGlobal.h"
|
||||
|
||||
|
||||
eoEventScheduler::eoEventScheduler(unsigned _nbrts,double _tsim, double _tadvance,
|
||||
|
||||
double _tcutoff, const string _filename ):
|
||||
|
||||
nbrts(_nbrts),tsim(_tsim), tadvance(_tadvance), tcutoff(_tcutoff), tstep(0.0), tday(0.0), tslice(0.0), filename(_filename){
|
||||
|
||||
FindTimeDay();
|
||||
|
||||
SetFleetCapacity();
|
||||
|
||||
SetTimeSlice();
|
||||
|
||||
TIME_STEP =0.0;
|
||||
|
||||
TIME_ADVANCE = _tadvance * tday;
|
||||
|
||||
}
|
||||
|
||||
eoEventScheduler::~eoEventScheduler(){}
|
||||
|
||||
double eoEventScheduler::TimeOfSimulation(){return tsim;}
|
||||
|
||||
|
||||
double eoEventScheduler::TimeSlice(){return tslice;}
|
||||
|
||||
double eoEventScheduler::TimeStep(){ return tstep;}
|
||||
|
||||
double eoEventScheduler::TimeCutoff() {return tcutoff;}
|
||||
|
||||
double eoEventScheduler::TimeAdvance(){return tadvance;}
|
||||
|
||||
void eoEventScheduler::UpdateTimeStep()
|
||||
|
||||
{tstep+= tslice;
|
||||
|
||||
TIME_STEP = tstep;}
|
||||
|
||||
void eoEventScheduler::setTimeStep(double _tstep){tstep = TIME_STEP = _tstep;}
|
||||
|
||||
void eoEventScheduler::setTimeAdvance(double _tadvance){ tadvance = TIME_ADVANCE =_tadvance ;}
|
||||
|
||||
double eoEventScheduler::TimeDay(){ return tday;}
|
||||
|
||||
std::string eoEventScheduler::TimeToString (double _time){
|
||||
|
||||
std::ostringstream oss;
|
||||
|
||||
oss << _time;
|
||||
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
|
||||
void eoEventScheduler::SetTimeSlice() { TIME_SLICE = tslice = tday/nbrts;}
|
||||
|
||||
|
||||
void eoEventScheduler::SetTimeDay(const double _tday){tday = TIME_DAY= _tday;}
|
||||
|
||||
unsigned eoEventScheduler::CapacityTour() {return VEHICULE_CAPACITY;}
|
||||
|
||||
void eoEventScheduler::FindTimeDay(){
|
||||
|
||||
|
||||
ifstream file (filename.c_str());
|
||||
|
||||
string line;
|
||||
|
||||
unsigned int customer;
|
||||
|
||||
double time;
|
||||
|
||||
istringstream iss;
|
||||
|
||||
do
|
||||
|
||||
getline(file,line);
|
||||
|
||||
|
||||
while(line.find("DEPOT_TIME_WINDOW_SECTION")== string::npos);
|
||||
|
||||
|
||||
getline(file,line);
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer>>customer>>time;
|
||||
|
||||
iss.clear();
|
||||
|
||||
SetTimeDay(time);
|
||||
|
||||
file.close();
|
||||
|
||||
}
|
||||
|
||||
void eoEventScheduler::SetFleetCapacity(){
|
||||
|
||||
istringstream iss;
|
||||
|
||||
string line;
|
||||
|
||||
ifstream filein (filename.c_str());
|
||||
|
||||
IsReadable(filein);
|
||||
|
||||
|
||||
|
||||
do
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while(line.find("NUM_VEHICLES")== string::npos);
|
||||
|
||||
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>line>>FLEET_VEHICLES;
|
||||
|
||||
iss.clear();
|
||||
|
||||
|
||||
|
||||
do
|
||||
getline(filein,line);
|
||||
|
||||
while(line.find("CAPACITIES")== string::npos);
|
||||
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>line>> VEHICULE_CAPACITY;
|
||||
|
||||
iss.clear();
|
||||
|
||||
|
||||
filein.close();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void eoEventScheduler::GenerateBenchmark(){
|
||||
|
||||
istringstream iss; //Input stream
|
||||
|
||||
string fileoutname;
|
||||
|
||||
unsigned int customer,TimeOrder,i; // Set of Costumers to serve, and available time of custumer order
|
||||
|
||||
const string fileiname = filename;
|
||||
|
||||
vector<unsigned int> customers;
|
||||
|
||||
string line,
|
||||
|
||||
str = fileiname;
|
||||
|
||||
str = str.erase(str.size() - 4); // Ajust the name of generated file according to the time slice.
|
||||
|
||||
|
||||
while(TimeStep()<= TimeDay())
|
||||
{
|
||||
|
||||
ifstream filein (fileiname.c_str());
|
||||
|
||||
IsReadable(filein); //Read benchmark file
|
||||
|
||||
|
||||
fileoutname = str+ "out." + TimeToString(tstep)+".txt"; // The generated file name is terminated by ".out.txt"
|
||||
|
||||
|
||||
ofstream fileout(fileoutname.c_str());
|
||||
|
||||
cout<<">>>>>>>> TimeStep "<<TimeStep()<<endl;
|
||||
|
||||
|
||||
do{
|
||||
getline(filein,line);
|
||||
|
||||
fileout<< line<<endl;
|
||||
|
||||
}while (line.find("DEMAND_SECTION")== string::npos);
|
||||
|
||||
|
||||
|
||||
|
||||
do
|
||||
getline(filein,line);
|
||||
|
||||
while(line.find("TIME_AVAIL_SECTION")== string::npos);
|
||||
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
do{
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer>>TimeOrder;
|
||||
|
||||
iss.clear();
|
||||
|
||||
|
||||
|
||||
if(TimeStep() == 0)
|
||||
|
||||
{if (TimeOrder > TimeCutoff() * TimeDay())
|
||||
|
||||
customers.push_back(customer);
|
||||
|
||||
}
|
||||
else
|
||||
|
||||
|
||||
if(TimeStep() > TimeCutoff() * TimeDay())
|
||||
|
||||
{
|
||||
if ((TimeOrder > (TimeStep() - TimeSlice())) && (TimeOrder <= TimeCutoff() * TimeDay()))
|
||||
|
||||
customers.push_back(customer);
|
||||
|
||||
}
|
||||
else
|
||||
|
||||
if ((TimeOrder > (TimeStep()- TimeSlice()) && TimeOrder <= TimeStep()))
|
||||
|
||||
customers.push_back(customer);
|
||||
|
||||
|
||||
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
}while(line.find("EOF")== string::npos);
|
||||
|
||||
for ( size_t k = 0; k < customers.size(); ++k)
|
||||
|
||||
cout <<customers[k] << '\t';
|
||||
|
||||
|
||||
|
||||
|
||||
filein.seekg (std::ios_base::beg); //Return to the beginning of the benchmark file for gather informations about custumers
|
||||
|
||||
do
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while (line.find("DEMAND_SECTION")== string::npos);
|
||||
|
||||
i=0;
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while( i< customers.size() && line.find("LOCATION_COORD_SECTION")== string::npos)
|
||||
{
|
||||
|
||||
iss.str(line); //Copy string in the stream
|
||||
|
||||
iss>>customer; // Move in the stream
|
||||
|
||||
iss.clear();
|
||||
|
||||
if(customer==customers[i])
|
||||
{
|
||||
fileout <<line<<endl;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
getline(filein,line);
|
||||
}
|
||||
|
||||
while(line.find("LOCATION_COORD_SECTION")== string::npos)
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
fileout<<line<<endl;
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
i=0;
|
||||
|
||||
while( i< customers.size() && line.find("DEPOT_LOCATION_SECTION")== string::npos)
|
||||
{
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer;
|
||||
|
||||
iss.clear();
|
||||
|
||||
if(customer==customers[i])
|
||||
{
|
||||
|
||||
fileout <<line<<endl;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
getline(filein,line);
|
||||
}
|
||||
|
||||
|
||||
while(line.find("DURATION_SECTION")== string::npos)
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
i=0;
|
||||
|
||||
fileout<<line<<endl;
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while( i< customers.size() && line.find("DEPOT_TIME_WINDOW_SECTION")== string::npos)
|
||||
|
||||
{
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer;
|
||||
|
||||
iss.clear();
|
||||
|
||||
if(customer==customers[i])
|
||||
|
||||
{
|
||||
|
||||
fileout <<line<<endl;
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
while(line.find("DEPOT_TIME_WINDOW_SECTION")== string::npos)
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
|
||||
fileout<<line<<endl;
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
|
||||
fileout<<line<<endl;
|
||||
|
||||
|
||||
while(line.find("TIME_AVAIL_SECTION")== string::npos)
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
|
||||
i=0;
|
||||
|
||||
fileout<<line<<endl;
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while( i< customers.size() && line.find("EOF")== string::npos)
|
||||
{
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer;
|
||||
|
||||
iss.clear();
|
||||
|
||||
if(customer==customers[i])
|
||||
|
||||
{
|
||||
|
||||
fileout <<line<<endl;
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
}
|
||||
|
||||
fileout<<"EOF"<<endl; //Terminate new benchmark file
|
||||
|
||||
customers.clear();
|
||||
|
||||
cout<<endl<<"The Benchmarks was generated in the step of time :"<< TimeStep()<<endl;
|
||||
|
||||
filein.close();
|
||||
|
||||
fileout.close();
|
||||
|
||||
|
||||
if (TimeStep() > TimeCutoff()*TimeDay())
|
||||
|
||||
break;
|
||||
else
|
||||
|
||||
UpdateTimeStep();
|
||||
|
||||
}
|
||||
|
||||
setTimeStep(0);
|
||||
|
||||
cout <<endl<<"-------------All Benchmarks were successfully generated-------------"<<endl;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
114
contribution/branches/PSO-DVRP/eoEventScheduler.h
Normal file
114
contribution/branches/PSO-DVRP/eoEventScheduler.h
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EOEVENTSCHEDULER_H_
|
||||
#define EOEVENTSCHEDULER_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "parser.h"
|
||||
|
||||
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
class eoEventScheduler{
|
||||
|
||||
public:
|
||||
|
||||
eoEventScheduler(unsigned _nbrts, double _tsim, double _tadvance, //Constructor
|
||||
|
||||
double _tcutoff, const string _filename );
|
||||
|
||||
~eoEventScheduler();
|
||||
|
||||
double TimeOfSimulation(); //Return the global time of simulation
|
||||
|
||||
double TimeSlice();
|
||||
|
||||
void SetTimeSlice();
|
||||
|
||||
double TimeStep();
|
||||
|
||||
double TimeCutoff();
|
||||
|
||||
double TimeAdvance();
|
||||
|
||||
void UpdateTimeStep();
|
||||
|
||||
void setTimeStep(double _tstep);
|
||||
|
||||
void setTimeAdvance(double _tadvance);
|
||||
|
||||
double TimeDay();
|
||||
|
||||
void FindTimeDay(); // Find the duration of working day.
|
||||
|
||||
void SetTimeDay(double _tday);
|
||||
|
||||
std::string TimeToString(double _time); // Convert integer value to string
|
||||
|
||||
void GenerateBenchmark(); // Benchmark Generator at each time step
|
||||
|
||||
void SetFleetCapacity();
|
||||
|
||||
unsigned CapacityTour();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
unsigned int nbrts; //nbr of time slices
|
||||
|
||||
double tday; // time of working day
|
||||
|
||||
double tsim; //time of simulation
|
||||
|
||||
double tadvance; // advanced commitement time
|
||||
|
||||
double tcutoff; // time of cutoff
|
||||
|
||||
double tslice; //time slice
|
||||
|
||||
double tstep; // time step
|
||||
|
||||
const string filename;//Benchmark name
|
||||
|
||||
};
|
||||
//}
|
||||
#endif /*EOEVENTSCHEDULER_H_*/
|
||||
43
contribution/branches/PSO-DVRP/eoGlobal.cpp
Normal file
43
contribution/branches/PSO-DVRP/eoGlobal.cpp
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
#include "eoGlobal.h"
|
||||
|
||||
unsigned VEHICULE_CAPACITY, FLEET_VEHICLES, NBRSLICES ;
|
||||
|
||||
double TIME_STEP , TIME_ADVANCE, TIME_SLICE , TIME_DAY, TIME_CUTOFF ;
|
||||
|
||||
|
||||
|
||||
|
||||
49
contribution/branches/PSO-DVRP/eoGlobal.h
Normal file
49
contribution/branches/PSO-DVRP/eoGlobal.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef EOGLOBAL_H_
|
||||
#define EOGLOBAL_H_
|
||||
|
||||
|
||||
extern unsigned VEHICULE_CAPACITY, FLEET_VEHICLES, NBRSLICES;
|
||||
|
||||
extern double TIME_STEP , TIME_SLICE, TIME_ADVANCE, TIME_DAY, TIME_CUTOFF ;
|
||||
|
||||
|
||||
#endif /*EOGLOBAL_H_*/
|
||||
218
contribution/branches/PSO-DVRP/eoParticleDvrp_mesg.h
Normal file
218
contribution/branches/PSO-DVRP/eoParticleDvrp_mesg.h
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
#ifndef EOPARTICLEDVRP_MESG_H_
|
||||
#define EOPARTICLEDVRP_MESG_H_
|
||||
|
||||
#include <core/eoVector_mesg.h>
|
||||
#include <eoPsoDVRP.h>
|
||||
|
||||
|
||||
|
||||
void pack (const eoParticleDVRP & _v)
|
||||
{
|
||||
cout<<endl<<"packing particle " <<" Node "<< getNodeRank() << " " << _v.fitness() << " " << _v.best() << endl;
|
||||
if (_v.invalid())
|
||||
{
|
||||
pack((unsigned)0);
|
||||
}
|
||||
else
|
||||
{
|
||||
pack((unsigned)1);
|
||||
pack (_v.fitness ());
|
||||
cout << _v.fitness() << endl;
|
||||
pack (_v.best());
|
||||
cout << _v.best() << endl;
|
||||
}
|
||||
|
||||
unsigned len = _v.size();
|
||||
pack (len);
|
||||
cout<<"len "<<len<<endl;
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
{ pack (_v [i]);
|
||||
cout<<"_v[i] "<<_v[i]<<endl;
|
||||
}
|
||||
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
pack (_v.bestPositions[i]);
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
pack (_v.velocities[i]);
|
||||
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
|
||||
{pack(_v.planifiedCustomers[i].id);
|
||||
pack(_v.planifiedCustomers[i].pRouting.route);
|
||||
pack(_v.planifiedCustomers[i].pRouting.routePosition);
|
||||
pack(_v.planifiedCustomers[i].pRouting.is_served);
|
||||
pack(_v.planifiedCustomers[i].pRouting.serviceTime);
|
||||
|
||||
pack(_v.planifiedCustomers[i].bestRouting.route);
|
||||
pack(_v.planifiedCustomers[i].bestRouting.routePosition);
|
||||
pack(_v.planifiedCustomers[i].bestRouting.is_served);
|
||||
pack(_v.planifiedCustomers[i].bestRouting.serviceTime);
|
||||
|
||||
pack(_v.planifiedCustomers[i].velocity);
|
||||
}
|
||||
|
||||
unsigned pSizeTours,pSingleTour;
|
||||
pSizeTours= _v.pRoutes.size();
|
||||
pack(pSizeTours);
|
||||
for(unsigned i = 0; i < pSizeTours; i++)
|
||||
{
|
||||
pSingleTour = _v.pRoutes[i].size();
|
||||
pack(pSingleTour);
|
||||
for(unsigned j = 0; j < pSingleTour; j++)
|
||||
pack(_v.pRoutes[i][j]);
|
||||
|
||||
}
|
||||
|
||||
unsigned bestSizeTours, bestSingleTour;
|
||||
bestSizeTours = _v.bestRoutes.size();
|
||||
pack(bestSizeTours);
|
||||
for(unsigned i = 0; i < bestSizeTours; i++)
|
||||
{
|
||||
bestSingleTour = _v.bestRoutes[i].size();
|
||||
pack(bestSingleTour);
|
||||
for(unsigned j = 0; j < bestSingleTour; j++)
|
||||
pack(_v.bestRoutes[i][j]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
pack(_v.pLength);
|
||||
pack(_v.bestLength);
|
||||
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
pack(_v.firstTimeServiceCurrentPosition[i]);
|
||||
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
pack(_v.firstTimeServiceBestPosition[i]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void unpack (eoParticleDVRP & _v)
|
||||
{
|
||||
|
||||
|
||||
unsigned valid;
|
||||
unpack(valid);
|
||||
|
||||
if (! valid)
|
||||
{
|
||||
_v.invalidate();
|
||||
_v.invalidateBest();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
double fit;
|
||||
unpack (fit);
|
||||
cout<<"fit "<<fit<<endl;
|
||||
_v.fitness (fit);
|
||||
unpack(fit);
|
||||
cout<<"fit "<<fit<<endl;
|
||||
_v.best(fit);
|
||||
|
||||
}
|
||||
unsigned len;
|
||||
unpack (len);
|
||||
|
||||
_v.resize (len);
|
||||
|
||||
cout<<"len "<<len<<endl;
|
||||
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
{unpack (_v [i]);
|
||||
|
||||
cout<<"_v[i] "<<_v[i]<<endl;
|
||||
}
|
||||
|
||||
_v.bestPositions.resize(len);
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
unpack (_v.bestPositions[i]);
|
||||
|
||||
_v.velocities.resize (len);
|
||||
for (unsigned i = 0 ; i < len; i ++)
|
||||
unpack (_v.velocities[i]);
|
||||
|
||||
_v.planifiedCustomers.resize(len);
|
||||
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
|
||||
{
|
||||
unpack(_v.planifiedCustomers[i].id);
|
||||
cout<<"_v[i] "<<_v.planifiedCustomers[i].id<<endl;
|
||||
unpack(_v.planifiedCustomers[i].pRouting.route);
|
||||
unpack(_v.planifiedCustomers[i].pRouting.routePosition);
|
||||
unpack(_v.planifiedCustomers[i].pRouting.is_served);
|
||||
unpack(_v.planifiedCustomers[i].pRouting.serviceTime);
|
||||
|
||||
unpack(_v.planifiedCustomers[i].bestRouting.route);
|
||||
unpack(_v.planifiedCustomers[i].bestRouting.routePosition);
|
||||
unpack(_v.planifiedCustomers[i].bestRouting.is_served);
|
||||
unpack(_v.planifiedCustomers[i].bestRouting.serviceTime);
|
||||
|
||||
unpack(_v.planifiedCustomers[i].velocity);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned pSizeTours, pSingleTour;
|
||||
|
||||
unpack(pSizeTours);
|
||||
_v.pRoutes.resize(pSizeTours);
|
||||
|
||||
for(unsigned i = 0; i < pSizeTours; i++)
|
||||
{
|
||||
unpack(pSingleTour);
|
||||
_v.pRoutes[i].resize(pSingleTour);
|
||||
|
||||
for(unsigned j = 0; j < pSingleTour; j++)
|
||||
{ unpack(_v.pRoutes[i][j]);
|
||||
|
||||
cout<<_v.pRoutes[i][j]<< " ";
|
||||
}
|
||||
|
||||
cout<<endl;
|
||||
|
||||
}
|
||||
|
||||
unsigned bestSizeTours,bestSingleTour;
|
||||
unpack(bestSizeTours);
|
||||
_v.bestRoutes.resize(bestSizeTours);
|
||||
|
||||
for(unsigned i = 0; i < bestSizeTours; i++)
|
||||
{
|
||||
unpack(bestSingleTour);
|
||||
_v.bestRoutes[i].resize(bestSingleTour);
|
||||
|
||||
for(unsigned j = 0; j < bestSingleTour; j++)
|
||||
unpack(_v.bestRoutes[i][j]);
|
||||
}
|
||||
|
||||
unpack(_v.pLength);
|
||||
unpack(_v.bestLength);
|
||||
|
||||
_v.firstTimeServiceCurrentPosition.resize(len);
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
unpack(_v.firstTimeServiceCurrentPosition[i]);
|
||||
|
||||
_v.firstTimeServiceBestPosition.resize(len);
|
||||
|
||||
for(unsigned i=0; i < len ; i++)
|
||||
unpack(_v.firstTimeServiceBestPosition[i]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EOPARTICLEDVRP_MESG_H_*/
|
||||
777
contribution/branches/PSO-DVRP/eoPeoEasyPsoDVRP.h
Normal file
777
contribution/branches/PSO-DVRP/eoPeoEasyPsoDVRP.h
Normal file
|
|
@ -0,0 +1,777 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EOEASYPSODVRP_H_
|
||||
#define EOEASYPSODVRP_H_
|
||||
|
||||
|
||||
|
||||
#include <eo>
|
||||
|
||||
#include "eoPsoDVRPflight.h"
|
||||
|
||||
#include "eoPsoDVRPvelocity.h"
|
||||
|
||||
#include "eoPsoDVRPEvalFunc.h"
|
||||
|
||||
#include "eoPsoDVRPEncodeSwarm.h"
|
||||
|
||||
#include "eoDVRPSecondsElapsedContinue.h"
|
||||
|
||||
#include "eoPsoDVRPInit.h"
|
||||
|
||||
#include <eoPopEvalFunc.h>
|
||||
|
||||
#include "eoGlobal.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template<class POT>
|
||||
|
||||
|
||||
class eoPeoEasyPsoDVRP:public eoPSO < POT >
|
||||
{
|
||||
|
||||
public :
|
||||
|
||||
|
||||
/* eoPeoEasyPsoDVRP(eoPsoDVRPEncodeSwarm<POT> & _encoding,
|
||||
|
||||
// eoEvalFunc< POT > &_eval,
|
||||
eoPsoDVRPEvalFunc<POT> &_evalDvrp,
|
||||
eoPsoDVRPvelocity < POT > &_velocity,
|
||||
eoFlight < POT > &_move,
|
||||
eoContinue <POT> &_continuator,
|
||||
eoParticleBestInit <POT> &_initBest
|
||||
):
|
||||
encoding(_encoding),
|
||||
eval (_eval),
|
||||
loopEval(_eval),
|
||||
popEval(loopEval),
|
||||
velocity (_velocity),
|
||||
move (_move),
|
||||
continuator(_continuator),
|
||||
initBest(_initBest)
|
||||
{}
|
||||
*/
|
||||
eoPeoEasyPsoDVRP(eoPsoDVRPEncodeSwarm<POT> & _encoding,
|
||||
eoEvalFunc < POT > &_eval,
|
||||
eoPopEvalFunc < POT > &_popEval,
|
||||
eoPsoDVRPvelocity < POT > &_velocity,
|
||||
eoFlight < POT > &_move,
|
||||
eoContinue <POT> &_continuator,
|
||||
eoGenContinue <POT> &_genContinuator,
|
||||
eoParticleBestInit <POT> &_initBest
|
||||
):
|
||||
encoding(_encoding),
|
||||
eval (_eval),
|
||||
loopEval(_eval),
|
||||
popEval(loopEval),
|
||||
velocity (_velocity),
|
||||
move (_move),
|
||||
continuator(_continuator),
|
||||
genContinuator(_genContinuator),
|
||||
initBest(_initBest)
|
||||
{}
|
||||
|
||||
|
||||
void operator()(eoPop < POT> &_pop)
|
||||
{
|
||||
|
||||
|
||||
double _TIME_STEP = TIME_STEP;
|
||||
|
||||
|
||||
try
|
||||
|
||||
{
|
||||
eoPop<POT> empty_pop;
|
||||
do{
|
||||
|
||||
|
||||
|
||||
encoding.initParticleToItsBest(_pop);
|
||||
|
||||
if(_TIME_STEP < TIME_CUTOFF * TIME_DAY){
|
||||
|
||||
if(_TIME_STEP==0)
|
||||
loadNewCustomers (TIME_DAY,TIME_CUTOFF * TIME_DAY);
|
||||
|
||||
|
||||
else
|
||||
loadNewCustomers(_TIME_STEP, TIME_SLICE);
|
||||
|
||||
|
||||
PrintLastCustomers();
|
||||
|
||||
encoding(_pop,_TIME_STEP,0);
|
||||
popEval(empty_pop, _pop);
|
||||
initBest.apply(_pop);
|
||||
velocity.getTopology().setup(_pop);
|
||||
|
||||
}
|
||||
|
||||
genContinuator.totalGenerations(genContinuator.totalGenerations());
|
||||
|
||||
do
|
||||
{
|
||||
velocity.apply(_pop);
|
||||
move.apply(_pop);
|
||||
popEval(empty_pop,_pop);
|
||||
velocity.updateNeighborhood(_pop);
|
||||
|
||||
}
|
||||
while (genContinuator(_pop));
|
||||
|
||||
|
||||
encoding.commitOrders(_pop,_TIME_STEP,TIME_SLICE);
|
||||
velocity.getTopology().setup(_pop);
|
||||
|
||||
_TIME_STEP += TIME_SLICE ;
|
||||
|
||||
cout<<_TIME_STEP<< " "<<endl;
|
||||
|
||||
}while (continuator(_pop));
|
||||
|
||||
closeTours(_pop);
|
||||
velocity.getTopology().setup(_pop);
|
||||
|
||||
|
||||
//_TIME_STEP += TIME_SLICE ;
|
||||
//cout<<endl<<getNodeRank() << " "<<_TIME_STEP<< " "<<endl;
|
||||
|
||||
//}while(_TIME_STEP < TIME_DAY);
|
||||
}
|
||||
catch (std::exception & e)
|
||||
{
|
||||
std::string s = e.what ();
|
||||
s.append (" in eoEasyPSO");
|
||||
throw std::runtime_error (s);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
eoPsoDVRPEncodeSwarm <POT> & encoding;
|
||||
eoEvalFunc < POT > &eval;
|
||||
eoPopLoopEval<POT> loopEval;
|
||||
eoPopEvalFunc<POT>& popEval;
|
||||
eoPsoDVRPvelocity < POT > &velocity;
|
||||
eoFlight < POT > &move;
|
||||
eoContinue< POT > &continuator;
|
||||
eoGenContinue < POT > & genContinuator;
|
||||
eoParticleBestInit <POT> &initBest;
|
||||
|
||||
class eoDummyEval : public eoEvalFunc<POT>
|
||||
{
|
||||
public:
|
||||
void operator()(POT & _po)
|
||||
{}
|
||||
}dummyEval;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
void print(eoPop <eoParticleDVRP> &pop,std::ostream &_os)
|
||||
{
|
||||
|
||||
for (size_t i =0, size = pop.size(); i< size ; ++i)
|
||||
{
|
||||
_os <<endl<<'\t'<<"---------------------- The Particle ["<<i<<"]----------------------"<< endl;
|
||||
|
||||
pop[i].printCurrentPosition(_os);
|
||||
|
||||
pop[i].printRoutesOn(_os);
|
||||
|
||||
pop[i].printBestPosition(_os);
|
||||
|
||||
pop[i].printBestRoutesOn(_os);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
void printRoutes(eoPop <eoParticleDVRP> &pop,std::ostream &_os)
|
||||
{
|
||||
|
||||
for (size_t i =0, size = pop.size(); i< size ; ++i)
|
||||
{
|
||||
|
||||
_os<<endl<<'\t'<<"---------------------- The Particle ["<<i<<"]----------------------"<< endl;
|
||||
|
||||
_os<<endl<<"The current fitness of the particule : "<< pop[i].best()<<endl;
|
||||
|
||||
pop[i].printRoutesOn(_os);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void printBestRoutes(eoPop <eoParticleDVRP> &pop, std::ostream &_os)
|
||||
{
|
||||
|
||||
for (size_t i =0, size = pop.size(); i< size ; ++i)
|
||||
{
|
||||
|
||||
_os <<endl<<'\t'<<"---------------------- The Particle ["<<i<<"]----------------------"<< endl;
|
||||
|
||||
_os<<endl<<"The best fitness of the particule : "<< pop[i].best()<<endl;
|
||||
|
||||
pop[i].printBestRoutesOn(_os);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void printBestParticle(eoDVRPStarTopology<eoParticleDVRP> &topology, unsigned _seed, std::ostream &_os)
|
||||
{
|
||||
|
||||
_os <<endl<<'\t'<<"---------------------- THE BEST PARTICLE OF SWARM ----------------------"<< endl;
|
||||
|
||||
_os<<endl<<"Seed "<<_seed<<endl;
|
||||
|
||||
topology.best().printCurrentPosition(_os);
|
||||
|
||||
topology.best().printRoutesOn(_os);
|
||||
|
||||
topology.best().printBestPosition(_os);
|
||||
|
||||
topology.best().printBestRoutesOn(_os);
|
||||
|
||||
topology.best().printfirstBestTimeService(_os);
|
||||
|
||||
_os<<endl<<"********************************************************************************************"<<endl;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void printVelocities(eoPop <eoParticleDVRP> &pop, std::ostream &_os)
|
||||
{
|
||||
for (size_t i =0, size = pop.size(); i<size ; ++i)
|
||||
|
||||
{
|
||||
_os<<endl<<'\t'<<"----------------------The Velocity of Particule ["<< i <<"]----------------------"<< endl;
|
||||
|
||||
pop[i].printVelocities(_os);
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
void closeTours(eoParticleDVRP & _po)
|
||||
{
|
||||
for(size_t i = 0 , size = _po.pRoutes.size(); i < size; ++i)
|
||||
|
||||
_po.pRoutes[i].push_back(0);
|
||||
|
||||
|
||||
for(size_t i = 0 , size = _po.bestRoutes.size(); i < size; ++i)
|
||||
|
||||
_po.bestRoutes[i].push_back(0);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void closeTours(eoPop <eoParticleDVRP> & _pop)
|
||||
{
|
||||
|
||||
for(size_t i = 0 , size = _pop.size(); i < size; ++i)
|
||||
|
||||
closeTours(_pop[i]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void resetSwarmToBestParticule(eoPop<eoParticleDVRP>& _pop, eoParticleDVRP _po )
|
||||
{
|
||||
|
||||
for(size_t i = 0 , size = _pop.size() ; i < size ; i++)
|
||||
|
||||
_pop[i] = _po ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void HillClimbingSearch( eoParticleDVRP & _po, unsigned sizeNeighboor = 1 )
|
||||
{
|
||||
|
||||
Routes neighborhoodSolution ;
|
||||
|
||||
double depotTimeWindow = clients[0].durationService;
|
||||
|
||||
double dueTime ;
|
||||
|
||||
bool validNeighborSolution ;
|
||||
|
||||
neighborhoodSolution = _po.pRoutes ;
|
||||
|
||||
validNeighborSolution = false;
|
||||
|
||||
for( size_t tr = 0; tr < neighborhoodSolution.size(); tr++)
|
||||
|
||||
{
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(tr))
|
||||
|
||||
|
||||
{
|
||||
|
||||
unsigned lastServedCustomer = _po.IndexLastServedCustomerCurrentPosition(tr) ;
|
||||
|
||||
unsigned positionLastCustomer = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition -1;
|
||||
|
||||
swapCustomers(neighborhoodSolution[tr],positionLastCustomer);
|
||||
|
||||
dueTime = getTimeOfService(neighborhoodSolution[tr], _po.planifiedCustomers[lastServedCustomer].id,_po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime)
|
||||
|
||||
+ distance(dist, neighborhoodSolution[tr].back(),0);
|
||||
|
||||
|
||||
}else
|
||||
|
||||
{
|
||||
swapCustomers(neighborhoodSolution[tr], 0 );
|
||||
|
||||
dueTime = getTimeOfService(neighborhoodSolution[tr], 0 , _po.firstTimeServiceCurrentPosition[tr]) + distance(dist, neighborhoodSolution[tr].back(),0);
|
||||
}
|
||||
|
||||
|
||||
if (dueTime <= depotTimeWindow)
|
||||
|
||||
{ validNeighborSolution = true ;
|
||||
|
||||
break ;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if(validNeighborSolution)
|
||||
{
|
||||
|
||||
double neighboorFitness = computTourLength(neighborhoodSolution);
|
||||
|
||||
// std::cout<< " _po.fitness() " << _po.fitness() << " neighboorFitness "<< neighboorFitness << endl ;
|
||||
|
||||
if( neighboorFitness < _po.fitness() )
|
||||
|
||||
{
|
||||
_po.pRoutes = neighborhoodSolution;
|
||||
|
||||
_po.reDesign() ;
|
||||
|
||||
_po.fitness(neighboorFitness);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void HillClimbingSearch(eoPop<eoParticleDVRP>& _pop, unsigned sizeNeighboor = 1 )
|
||||
{
|
||||
|
||||
|
||||
for(size_t i = 0, size = _pop.size(); i < size ; i ++ )
|
||||
|
||||
|
||||
HillClimbingSearch(_pop[i], sizeNeighboor) ;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool TwoOptimalAlgorithm (eoParticleDVRP & _po)
|
||||
|
||||
{
|
||||
|
||||
unsigned lastServedCustomerPosition;
|
||||
|
||||
bool twoOptFeasible, changehappen = false ;
|
||||
|
||||
double dueTime, depotTimeWindow = clients[0].durationService;
|
||||
|
||||
|
||||
|
||||
for (size_t tr = 0, size = _po.pRoutes.size() ; tr < size ; tr++)
|
||||
|
||||
{
|
||||
|
||||
Route routeOpt = _po.pRoutes[tr];
|
||||
|
||||
twoOptFeasible =false;
|
||||
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(tr))
|
||||
{
|
||||
|
||||
unsigned lastServedCustomer = _po.IndexLastServedCustomerCurrentPosition(tr) ;
|
||||
|
||||
lastServedCustomerPosition = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition -1;
|
||||
|
||||
if (twoOptOnRoute(routeOpt,lastServedCustomerPosition))
|
||||
|
||||
{
|
||||
|
||||
dueTime = getTimeOfService(routeOpt, _po.planifiedCustomers[lastServedCustomer].id,_po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime)
|
||||
|
||||
+ distance(dist, routeOpt.back(),0);
|
||||
|
||||
twoOptFeasible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
lastServedCustomerPosition = 0;
|
||||
|
||||
if (twoOptOnRoute(routeOpt,lastServedCustomerPosition))
|
||||
{
|
||||
|
||||
dueTime = getTimeOfService(routeOpt, 0 , _po.firstTimeServiceCurrentPosition[tr]) + distance(dist, routeOpt.back(),0);
|
||||
|
||||
twoOptFeasible = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (twoOptFeasible && dueTime <= depotTimeWindow)
|
||||
|
||||
{_po.pRoutes[tr] = routeOpt;
|
||||
|
||||
changehappen = true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (changehappen)
|
||||
|
||||
{
|
||||
_po.reDesign() ;
|
||||
|
||||
_po.invalidate();
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TwoOptimalAlgorithm (eoPop<eoParticleDVRP> & _pop)
|
||||
{
|
||||
|
||||
|
||||
for(size_t i = 0, size = _pop.size(); i < size ; i++)
|
||||
|
||||
TwoOptimalAlgorithm(_pop[i]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool ThreeOptimalAlgorithm (eoParticleDVRP & _po)
|
||||
|
||||
{
|
||||
|
||||
unsigned lastServedCustomerPosition;
|
||||
|
||||
bool threeOptFeasible, changehappen = false ;
|
||||
|
||||
double dueTime, depotTimeWindow = clients[0].durationService;
|
||||
|
||||
|
||||
|
||||
for (size_t tr = 0, size = _po.pRoutes.size() ; tr < size ; tr++)
|
||||
|
||||
{
|
||||
|
||||
Route routeOpt = _po.pRoutes[tr];
|
||||
|
||||
threeOptFeasible =false;
|
||||
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(tr))
|
||||
{
|
||||
|
||||
unsigned lastServedCustomer = _po.IndexLastServedCustomerCurrentPosition(tr) ;
|
||||
|
||||
lastServedCustomerPosition = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition -1;
|
||||
|
||||
if (threeOptOnRoute(routeOpt,lastServedCustomerPosition))
|
||||
|
||||
{
|
||||
|
||||
dueTime = getTimeOfService(routeOpt, _po.planifiedCustomers[lastServedCustomer].id,_po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime)
|
||||
|
||||
+ distance(dist, routeOpt.back(),0);
|
||||
|
||||
threeOptFeasible = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
lastServedCustomerPosition = 0;
|
||||
|
||||
if (threeOptOnRoute(routeOpt,lastServedCustomerPosition))
|
||||
{
|
||||
|
||||
dueTime = getTimeOfService(routeOpt, 0 , _po.firstTimeServiceCurrentPosition[tr]) + distance(dist, routeOpt.back(),0);
|
||||
|
||||
threeOptFeasible = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (threeOptFeasible && dueTime <= depotTimeWindow)
|
||||
|
||||
{_po.pRoutes[tr] = routeOpt;
|
||||
|
||||
changehappen = true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (changehappen)
|
||||
|
||||
{
|
||||
_po.reDesign() ;
|
||||
|
||||
_po.invalidate();
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void ThreeOptimalAlgorithm (eoPop<eoParticleDVRP> & _pop)
|
||||
{
|
||||
|
||||
|
||||
for(size_t i = 0, size = _pop.size(); i < size ; i++)
|
||||
|
||||
ThreeOptimalAlgorithm(_pop[i]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void VariableNeighborhoodSearch(eoParticleDVRP & _po, unsigned neighborSize)
|
||||
{
|
||||
Routes neighborhoodSolution ;
|
||||
|
||||
double dueTime, depotTimeWindow = clients[0].durationService;
|
||||
|
||||
bool validNeighborSolution ;
|
||||
|
||||
neighborhoodSolution = _po.pRoutes ;
|
||||
|
||||
validNeighborSolution = false;
|
||||
|
||||
unsigned neighborhoodIndex = 1;
|
||||
|
||||
for( size_t tr = 0; tr < neighborhoodSolution.size(); tr++)
|
||||
|
||||
{
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(tr))
|
||||
|
||||
{
|
||||
unsigned lastServedCustomer = _po.IndexLastServedCustomerCurrentPosition(tr) ;
|
||||
|
||||
unsigned positionLastCustomer = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition -1;
|
||||
|
||||
for(size_t k = 0 ; k <= neighborhoodIndex ; k++)
|
||||
|
||||
swapCustomers(neighborhoodSolution[tr],positionLastCustomer);
|
||||
|
||||
|
||||
dueTime = getTimeOfService(neighborhoodSolution[tr], _po.planifiedCustomers[lastServedCustomer].id,_po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime)
|
||||
|
||||
+ distance(dist, neighborhoodSolution[tr].back(),0);
|
||||
|
||||
|
||||
}else
|
||||
|
||||
{
|
||||
for(size_t k = 0 ; k <= neighborhoodIndex ; k++)
|
||||
|
||||
swapCustomers(neighborhoodSolution[tr], 0);
|
||||
|
||||
dueTime = getTimeOfService(neighborhoodSolution[tr], 0 , _po.firstTimeServiceCurrentPosition[tr]) + distance(dist, neighborhoodSolution[tr].back(),0);
|
||||
}
|
||||
|
||||
|
||||
if (dueTime <= depotTimeWindow)
|
||||
|
||||
{
|
||||
|
||||
double neighboorFitness = computTourLength(neighborhoodSolution);
|
||||
|
||||
if( neighboorFitness < _po.fitness() )
|
||||
|
||||
{
|
||||
_po.pRoutes = neighborhoodSolution;
|
||||
|
||||
_po.reDesign() ;
|
||||
|
||||
_po.fitness(neighboorFitness);
|
||||
|
||||
if(TwoOptimalAlgorithm(_po))
|
||||
|
||||
{
|
||||
_po.computCurrentTourLength();
|
||||
|
||||
_po.fitness(_po.toursLength());
|
||||
|
||||
neighborhoodIndex = 1;
|
||||
|
||||
|
||||
continue ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
neighborhoodIndex = (neighborhoodIndex + 1) % neighborSize ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void VariableNeighborhoodSearch(eoPop<eoParticleDVRP>& _pop, unsigned neighborSize)
|
||||
{
|
||||
|
||||
|
||||
for(size_t i = 0, size = _pop.size(); i < size ; i++)
|
||||
|
||||
|
||||
VariableNeighborhoodSearch(_pop[i], neighborSize);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
double avragePopFitness(eoPop<eoParticleDVRP>& _pop)
|
||||
{
|
||||
double average = 0.0;
|
||||
|
||||
for(size_t i = 0, size = _pop.size(); i < size ; i ++)
|
||||
{
|
||||
|
||||
average += _pop[i].best();
|
||||
|
||||
|
||||
}
|
||||
|
||||
return (average/_pop.size());
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool AllCustomersAttributed(eoDVRPStarTopology<eoParticleDVRP> &topology)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
while (i < topology.best().size())
|
||||
|
||||
{
|
||||
if(!topology.best().planifiedCustomers[i].bestRouting.is_served)
|
||||
|
||||
return false;
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif /*EOEASYPSODVRP_H_*/
|
||||
1697
contribution/branches/PSO-DVRP/eoPsoDVRP.cpp
Normal file
1697
contribution/branches/PSO-DVRP/eoPsoDVRP.cpp
Normal file
File diff suppressed because it is too large
Load diff
211
contribution/branches/PSO-DVRP/eoPsoDVRP.h
Normal file
211
contribution/branches/PSO-DVRP/eoPsoDVRP.h
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _eoPsoDVRP_h
|
||||
#define _eoPsoDVRP_h
|
||||
|
||||
|
||||
#include "eoPsoDVRPutils.h"
|
||||
|
||||
|
||||
|
||||
using eo::rng;
|
||||
|
||||
|
||||
|
||||
typedef struct record1 {
|
||||
|
||||
int route;
|
||||
|
||||
int routePosition;
|
||||
|
||||
bool is_served;
|
||||
|
||||
double serviceTime;
|
||||
|
||||
} routingInfo;
|
||||
|
||||
|
||||
|
||||
typedef struct record2 {
|
||||
|
||||
unsigned id;
|
||||
|
||||
routingInfo pRouting;
|
||||
|
||||
routingInfo bestRouting;
|
||||
|
||||
int velocity;
|
||||
|
||||
}particleRouting;
|
||||
|
||||
|
||||
|
||||
|
||||
//using namespace eoParticuleDVRPUtils; eoMinimizingFitness
|
||||
|
||||
class eoParticleDVRP: public eoVectorParticle <double,int,int> {
|
||||
|
||||
public:
|
||||
|
||||
eoParticleDVRP();
|
||||
|
||||
virtual ~eoParticleDVRP ();
|
||||
|
||||
eoParticleDVRP(const eoParticleDVRP& _orig);
|
||||
|
||||
void copy(const eoParticleDVRP & _po);
|
||||
|
||||
eoParticleDVRP& operator= (const eoParticleDVRP& _orig);
|
||||
|
||||
virtual std::string className () const ;
|
||||
|
||||
double toursLength ();
|
||||
|
||||
void toursLength (const double _pLength);
|
||||
|
||||
double bestToursLength();
|
||||
|
||||
void bestToursLength (const double _bestLength);
|
||||
|
||||
bool clean ();
|
||||
|
||||
bool cleanCurrentRoutes ();
|
||||
|
||||
bool cleanBestRoutes ();
|
||||
|
||||
void printRoutesOn(std::ostream& _os) const;
|
||||
|
||||
void printBestRoutesOn(std::ostream& _os) const;
|
||||
|
||||
void printOn(std::ostream& _os) const;
|
||||
|
||||
void printBestOn(std::ostream& _os) const;
|
||||
|
||||
void printVelocities(std::ostream& _os);
|
||||
|
||||
void printfirstTimeService(std::ostream& _os);
|
||||
|
||||
void printfirstBestTimeService(std::ostream& _os);
|
||||
|
||||
void printCurrentPosition(std::ostream& _os)const;
|
||||
|
||||
void printBestPosition(std::ostream& _os)const;
|
||||
|
||||
void computToursLength();
|
||||
|
||||
void computCurrentTourLength();
|
||||
|
||||
void computBestTourLength();
|
||||
|
||||
void setVelocities();
|
||||
|
||||
void setCurrentPositions ();
|
||||
|
||||
void setBestPositions();
|
||||
|
||||
void encodingCurrentPositionCheapestInsertion(double _tstep, double _tslice);
|
||||
|
||||
void encodingCurrentPositionNearestInsertion(double _tstep, double _tslice);
|
||||
|
||||
void encodingCurrentPositionGeneralizedInsertion(double _tstep, double _tslice);
|
||||
|
||||
void encodingCurrentPositionRandomInsertion(double _tstep, double _tslice);
|
||||
|
||||
void encodingBestPosition(double _tstep, double _tslice);
|
||||
|
||||
routingInfo & currentRoutingCustomer(unsigned id_customer);
|
||||
|
||||
routingInfo & bestRoutingCustomer(unsigned id_customer);
|
||||
|
||||
void commitOrdersCurrentPosition (double _nextTstep, double _timeSlice);
|
||||
|
||||
void commitOrdersBestPosition (double _nextTstep, double _timeSlice);
|
||||
|
||||
bool isServedCustomerInCurrentPosition (unsigned id_customer);
|
||||
|
||||
bool isServedCustomerInBestPosition (unsigned id_customer);
|
||||
|
||||
void normalizeVelocities();
|
||||
|
||||
void eraseRoute(unsigned _tour);
|
||||
|
||||
void checkCurrentPosition();
|
||||
|
||||
void checkBestPosition();
|
||||
|
||||
bool serviceIsProgressCurrentPosition(unsigned _tour);
|
||||
|
||||
bool serviceIsProgressBestPosition(unsigned _tour);
|
||||
|
||||
unsigned IndexLastServedCustomerCurrentPosition(unsigned _tour);
|
||||
|
||||
unsigned IndexLastServedCustomerBestPosition(unsigned _tour);
|
||||
|
||||
double timeEndServiceCurrentPosition(unsigned id_customer);
|
||||
|
||||
double timeEndServiceBestPosition(unsigned id_customer);
|
||||
|
||||
void cleanParticle();
|
||||
|
||||
void copyBestToCurrent();
|
||||
|
||||
void lastPositionOnRoutes(std::vector<unsigned> & _positions);
|
||||
|
||||
void reDesign ();
|
||||
|
||||
void checkAll(std::ostream& _os);
|
||||
|
||||
|
||||
|
||||
//private:
|
||||
|
||||
std::vector<particleRouting> planifiedCustomers;
|
||||
|
||||
double pLength , bestLength;
|
||||
|
||||
Routes pRoutes, bestRoutes;
|
||||
|
||||
std::vector<double> firstTimeServiceCurrentPosition;
|
||||
|
||||
std::vector<double> firstTimeServiceBestPosition;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
214
contribution/branches/PSO-DVRP/eoPsoDVRPEncodeSwarm.h
Normal file
214
contribution/branches/PSO-DVRP/eoPsoDVRPEncodeSwarm.h
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and exper10ienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
#ifndef EOPSODVRPENCODESWARM_H_
|
||||
#define EOPSODVRPENCODESWARM_H_
|
||||
|
||||
#include"eoPsoDVRPutils.h"
|
||||
|
||||
|
||||
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoPsoDVRPEncodeSwarm
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
eoPsoDVRPEncodeSwarm(){}
|
||||
|
||||
|
||||
void operator()(eoPop<POT> & _pop, double _tstep, double _tslice)
|
||||
|
||||
{
|
||||
|
||||
/*
|
||||
vector<unsigned> temp = newCustomers;
|
||||
|
||||
|
||||
|
||||
if (_insertionMethode == "Hybrid")
|
||||
{
|
||||
|
||||
int i =0 ;
|
||||
|
||||
int size = (int)(_pop.size()) / 3;
|
||||
|
||||
|
||||
while(i < size)
|
||||
{
|
||||
|
||||
if (_rebuild =="Rebuild")
|
||||
|
||||
_pop[i].cleanParticle();
|
||||
|
||||
_pop[i].encodingCurrentPositionRandomInsertion(_tstep, _tslice);
|
||||
|
||||
if(_rebuild == "Rebuild")
|
||||
|
||||
newCustomers = temp;
|
||||
|
||||
i++ ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
size = (int)(_pop.size()) * (3/4);
|
||||
|
||||
|
||||
|
||||
while (i < size)
|
||||
|
||||
{
|
||||
|
||||
if (_rebuild =="Rebuild")
|
||||
|
||||
_pop[i].cleanParticle();
|
||||
|
||||
_pop[i].encodingCurrentPositionNearestInsertion(_tstep, _tslice);
|
||||
|
||||
if(_rebuild == "Rebuild")
|
||||
|
||||
newCustomers = temp;
|
||||
|
||||
i++ ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
size = (int)(_pop.size());
|
||||
|
||||
|
||||
while( i < size)
|
||||
{
|
||||
if (_rebuild =="Rebuild")
|
||||
|
||||
_pop[i].cleanParticle();
|
||||
|
||||
_pop[i].encodingCurrentPositionCheapestInsertion(_tstep, _tslice);
|
||||
|
||||
/*if(_rebuild == "Rebuild")
|
||||
|
||||
newCustomers = temp;
|
||||
|
||||
|
||||
i++;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
*/
|
||||
for (size_t i =0, size = _pop.size() ; i<size ; ++i)
|
||||
|
||||
_pop[i].encodingCurrentPositionRandomInsertion(_tstep, _tslice);
|
||||
|
||||
/* {
|
||||
if (_rebuild =="Rebuild")
|
||||
|
||||
_pop[i].cleanParticle();
|
||||
|
||||
if(_insertionMethode == "Rand")
|
||||
|
||||
_pop[i].encodingCurrentPositionRandomInsertion(_tstep, _tslice);
|
||||
|
||||
if(_insertionMethode == "Nearest")//
|
||||
|
||||
*/
|
||||
// _pop[i].encodingCurrentPositionNearestInsertion(_tstep, _tslice);
|
||||
/*
|
||||
if(_insertionMethode == "Cheapest")*/
|
||||
|
||||
// _pop[i].encodingCurrentPositionCheapestInsertion(_tstep, _tslice);
|
||||
|
||||
/* if(_rebuild == "Rebuild")
|
||||
|
||||
newCustomers = temp;
|
||||
}
|
||||
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void commitOrders(eoPop<POT> & _pop, double _tstep, double _tslice)
|
||||
|
||||
{
|
||||
|
||||
for (size_t i =0, size = _pop.size(); i<size ; ++i)
|
||||
|
||||
{
|
||||
|
||||
_pop[i].commitOrdersCurrentPosition(_tstep, _tslice);
|
||||
|
||||
|
||||
_pop[i].commitOrdersBestPosition(_tstep, _tslice);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void initParticleToItsBest(eoPop<POT> & _pop){
|
||||
|
||||
for (size_t i =0, size = _pop.size() ; i<size ; ++i)
|
||||
{
|
||||
_pop[i].copyBestToCurrent();
|
||||
|
||||
for (size_t k = 0 , size = _pop[i].size(); k < size ; k++ )
|
||||
_pop[i].planifiedCustomers[k].pRouting = _pop[i].planifiedCustomers[k].bestRouting;
|
||||
|
||||
_pop[i].pRoutes = _pop[i].bestRoutes;
|
||||
_pop[i].pLength = _pop[i].bestLength;
|
||||
_pop[i].firstTimeServiceCurrentPosition = _pop[i].firstTimeServiceBestPosition;
|
||||
_pop[i].fitness(_pop[i].bestLength);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /*EOPSODVRPENCODESWARM_H_*/
|
||||
101
contribution/branches/PSO-DVRP/eoPsoDVRPEvalFunc.h
Normal file
101
contribution/branches/PSO-DVRP/eoPsoDVRPEvalFunc.h
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
#ifndef EOPSODVRPEVALFUNC_H_
|
||||
#define EOPSODVRPEVALFUNC_H_
|
||||
|
||||
// General includes
|
||||
#include <stdexcept>
|
||||
#include <fstream>
|
||||
#include "eoEvalFunc.h"
|
||||
|
||||
#include "eoPsoDVRP.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <class POT>
|
||||
class eoPsoDVRPEvalFunc : public eoEvalFunc<POT> {
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* \brief Constructor: nothing to do here.
|
||||
*/
|
||||
|
||||
eoPsoDVRPEvalFunc () {}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Computes the (penalized) fitness
|
||||
* \param _eo The individual to be evaluated.
|
||||
*/
|
||||
|
||||
void operator () (POT& _po) {
|
||||
|
||||
if ( _po.invalid ())
|
||||
|
||||
{
|
||||
_po.toursLength( computTourLength(_po.pRoutes));
|
||||
|
||||
_po.fitness( _po.toursLength());
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (_po.invalidBest ())
|
||||
|
||||
{
|
||||
_po.bestToursLength( computTourLength(_po.bestRoutes));
|
||||
|
||||
_po.best( _po.bestToursLength());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void operator() (eoPop <POT> &_pop){
|
||||
|
||||
for (size_t i=0, size = _pop.size(); i < size; ++i)
|
||||
|
||||
operator()(_pop[i]);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /*EOPSODVRPEVALFUNC_H_*/
|
||||
270
contribution/branches/PSO-DVRP/eoPsoDVRPInit.h
Normal file
270
contribution/branches/PSO-DVRP/eoPsoDVRPInit.h
Normal file
|
|
@ -0,0 +1,270 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef EOPSODVRPINIT_H_
|
||||
#define EOPSODVRPINIT_H_
|
||||
|
||||
#include <eo>
|
||||
#include "eoPsoDVRPEvalFunc.h"
|
||||
#include "eoDVRPStarTopology.h"
|
||||
#include "eoPsoDVRPutils.h"
|
||||
|
||||
|
||||
template <class POT>
|
||||
|
||||
class eoNothingInit: public eoInit<POT>
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
eoNothingInit(){}
|
||||
|
||||
virtual void operator()(POT& _po) {
|
||||
|
||||
_po.resize(0);
|
||||
|
||||
_po.invalidate ();
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
class eoInitialSettings
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
eoInitialSettings( string _benchmarkFile, const double TIME_CUT_OFF, const unsigned NBR_SLICES): benchmarkFile(_benchmarkFile)
|
||||
|
||||
{TIME_CUTOFF = TIME_CUT_OFF;
|
||||
|
||||
NBRSLICES = NBR_SLICES;
|
||||
|
||||
operator()();
|
||||
|
||||
}
|
||||
|
||||
void operator() () {
|
||||
|
||||
|
||||
loadMatrixCustomers(benchmarkFile);
|
||||
|
||||
computeDistances();
|
||||
|
||||
SetFleetCapacity(benchmarkFile);
|
||||
|
||||
FindTimeDay(benchmarkFile);
|
||||
|
||||
TIME_STEP = TIME_ADVANCE = 0.0;
|
||||
|
||||
TIME_SLICE = TIME_DAY/NBRSLICES;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SetFleetCapacity(string filename){
|
||||
istringstream iss;
|
||||
string line;
|
||||
ifstream filein (filename.c_str());
|
||||
IsReadable(filein);
|
||||
do
|
||||
|
||||
getline(filein,line);
|
||||
|
||||
while(line.find("NUM_VEHICLES")== string::npos);
|
||||
iss.str(line);
|
||||
iss>>line>>FLEET_VEHICLES;
|
||||
iss.clear();
|
||||
do
|
||||
getline(filein,line);
|
||||
|
||||
while(line.find("CAPACITIES")== string::npos);
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>line>> VEHICULE_CAPACITY;
|
||||
|
||||
iss.clear();
|
||||
|
||||
filein.close();
|
||||
|
||||
}
|
||||
|
||||
void FindTimeDay(string filename){
|
||||
|
||||
ifstream file (filename.c_str());
|
||||
|
||||
string line;
|
||||
|
||||
unsigned int customer;
|
||||
|
||||
double time;
|
||||
|
||||
istringstream iss;
|
||||
|
||||
do
|
||||
|
||||
getline(file,line);
|
||||
|
||||
|
||||
while(line.find("DEPOT_TIME_WINDOW_SECTION")== string::npos);
|
||||
|
||||
|
||||
getline(file,line);
|
||||
|
||||
iss.str(line);
|
||||
|
||||
iss>>customer>>customer>>TIME_DAY;
|
||||
|
||||
iss.clear();
|
||||
|
||||
file.close();
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
string benchmarkFile;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoParticleInit : public eoInit<POT>
|
||||
{
|
||||
|
||||
public :
|
||||
|
||||
|
||||
eoParticleInit(){}
|
||||
|
||||
void operator()(POT & _po) {
|
||||
|
||||
|
||||
//_po. eoVectorParticle<eoMinimizingFitness,int,int>::operator = _po.bestPositions;
|
||||
|
||||
for (size_t i = 0 , size = _po.size(); i < size ; i++ )
|
||||
|
||||
_po.planifiedCustomers[i].pRouting = _po.planifiedCustomers[i].bestRouting;
|
||||
|
||||
_po.pRoutes = _po.bestRoutes;
|
||||
|
||||
_po.pLength = _po.bestLength;
|
||||
|
||||
_po.firstTimeServiceCurrentPosition = _po.firstTimeServiceBestPosition;
|
||||
|
||||
_po.fitness(_po.bestLength);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void operator () (eoPop<POT> &_pop) {
|
||||
|
||||
for (size_t i = 0, size = _pop.size(); i < size ; i++)
|
||||
{
|
||||
|
||||
operator()(_pop[i]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
*/
|
||||
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoDVRBestPositionInit: public eoParticleBestInit <POT> // First initializer of swarm
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
eoDVRBestPositionInit () {}
|
||||
|
||||
void operator () (POT & _po)
|
||||
{
|
||||
|
||||
_po.bestPositions = _po ;
|
||||
|
||||
_po.bestLength = _po.pLength ;
|
||||
|
||||
_po.bestRoutes =_po.pRoutes;
|
||||
|
||||
//il faut une <20>valuation avant sinon le invalidate best sera faux
|
||||
|
||||
_po.best(_po.fitness());
|
||||
|
||||
if ( !std::equal( _po.bestPositions.begin(), _po.bestPositions.end(), _po.begin() ) )
|
||||
|
||||
std::cerr << "The copy was not performed correctly when initializeBestPosition"<<endl;
|
||||
|
||||
|
||||
for (size_t i=0 , size = _po.planifiedCustomers.size(); i < size ; ++i)
|
||||
|
||||
{ _po.planifiedCustomers[i].bestRouting.route = _po.planifiedCustomers[i].pRouting.route ;
|
||||
|
||||
_po.planifiedCustomers[i].bestRouting.routePosition = _po.planifiedCustomers[i].pRouting.routePosition ;
|
||||
|
||||
_po.planifiedCustomers[i].bestRouting.is_served= _po.planifiedCustomers[i].pRouting.is_served;
|
||||
|
||||
_po.planifiedCustomers[i].bestRouting.serviceTime= _po.planifiedCustomers[i].pRouting.serviceTime;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
_po.firstTimeServiceBestPosition = _po.firstTimeServiceCurrentPosition ;
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EOPSODVRPINIT_H_*/
|
||||
516
contribution/branches/PSO-DVRP/eoPsoDVRPflight.h
Normal file
516
contribution/branches/PSO-DVRP/eoPsoDVRPflight.h
Normal file
|
|
@ -0,0 +1,516 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
#ifndef EOPSODVRPFLIGHT_H_
|
||||
#define EOPSODVRPFLIGHT_H_
|
||||
|
||||
|
||||
#include "eoPsoDVRP.h"
|
||||
|
||||
#include "eoPsoDVRPutils.h"
|
||||
|
||||
#include "eoGlobal.h"
|
||||
|
||||
|
||||
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoPsoDVRPMove:public eoFlight < POT >
|
||||
{
|
||||
|
||||
public:
|
||||
typedef typename POT::AtomType PositionType;
|
||||
|
||||
|
||||
eoPsoDVRPMove() {}
|
||||
|
||||
void operator () (POT & _po)
|
||||
{
|
||||
|
||||
POT _poSave = _po ;
|
||||
|
||||
deleteCustomersToMove(_po);
|
||||
|
||||
if (_po.pRoutes.size() != 0)
|
||||
{
|
||||
|
||||
for (unsigned customer = 0, size = _po.size() ; customer < size; customer++)
|
||||
|
||||
|
||||
if ( ! (_po.planifiedCustomers[customer].pRouting.is_served))
|
||||
{
|
||||
|
||||
unsigned xLimit = _po.pRoutes.size() -1 ;
|
||||
|
||||
PositionType customer_route = _po[customer] -1 ;
|
||||
|
||||
PositionType newTour = boundTour((customer_route + _po.velocities[customer]), xLimit); //
|
||||
|
||||
repositionCustomer(customer,newTour,_po);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
_po = _poSave;
|
||||
|
||||
for (unsigned customer = 0, size = _po.size() ; customer < size; customer++)
|
||||
|
||||
if ( ! (_po.planifiedCustomers[customer].pRouting.is_served))
|
||||
|
||||
{
|
||||
|
||||
unsigned xLimit = _po.pRoutes.size() -1;
|
||||
|
||||
PositionType customer_route = _po[customer] -1 ;
|
||||
|
||||
PositionType newTour = boundTour((customer_route + _po.velocities[customer]), xLimit);
|
||||
|
||||
repositionCustomerInFirst(customer,newTour,_po);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
_po.invalidate();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool deleteCustomersToMove(POT & _po)
|
||||
{
|
||||
|
||||
|
||||
for(size_t i = 0; i < _po.size() ; i ++)
|
||||
{
|
||||
if( ! _po.planifiedCustomers[i].pRouting.is_served )
|
||||
{
|
||||
|
||||
unsigned route = _po.planifiedCustomers[i].pRouting.route - 1 ;
|
||||
|
||||
unsigned position = _po.planifiedCustomers[i].pRouting.routePosition - 1 ;
|
||||
|
||||
_po.pRoutes[route].erase(_po.pRoutes[route].begin() + position);
|
||||
|
||||
|
||||
if (_po.pRoutes[route].size()== 1)
|
||||
|
||||
_po.eraseRoute(route);
|
||||
|
||||
else
|
||||
|
||||
for(size_t j = position, sizetr = _po.pRoutes[route].size(); j < sizetr; j++)
|
||||
|
||||
for(size_t k = 0 , sizeP = _po.size() ; k < sizeP; k ++)
|
||||
|
||||
{
|
||||
if (_po.planifiedCustomers[k].id == _po.pRoutes[route][j] )
|
||||
|
||||
_po.planifiedCustomers[k].pRouting.routePosition -- ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
eoRealVectorBounds bounds(po.size(),0,xlimit);
|
||||
if (bounds.isMinBounded(i))
|
||||
newTour=std::max(newTour,bounds.minimum(i));
|
||||
if (bounds.isMaxBounded(i))
|
||||
newTour=std::min(newTour,bounds.maximum(i));
|
||||
|
||||
*/
|
||||
|
||||
PositionType boundTour(PositionType tour, unsigned limit)
|
||||
{
|
||||
|
||||
|
||||
if(limit == 0)
|
||||
|
||||
return(0);
|
||||
|
||||
else
|
||||
|
||||
if (tour <0)
|
||||
|
||||
return(((-tour) % limit)) ;
|
||||
else
|
||||
|
||||
if (tour > limit)
|
||||
|
||||
return ((tour % limit));
|
||||
|
||||
else
|
||||
return (tour);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void repositionCustomer(unsigned _customer, unsigned _tour, POT& _po)
|
||||
{
|
||||
Route newRoute;
|
||||
|
||||
double dueTime ;
|
||||
|
||||
bool commitCustomer ;
|
||||
|
||||
unsigned positionNewCustomer;
|
||||
|
||||
double depotTimeWindow = clients[0].durationService;
|
||||
|
||||
unsigned customer_id = _po.planifiedCustomers[_customer].id;
|
||||
|
||||
|
||||
commitCustomer = false ;
|
||||
|
||||
|
||||
for (size_t j = 0 ; j < _po.pRoutes.size() ; j++ )
|
||||
{
|
||||
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(_tour))
|
||||
|
||||
{
|
||||
|
||||
|
||||
unsigned lastServedCustomer =_po.IndexLastServedCustomerCurrentPosition(_tour) ;
|
||||
|
||||
|
||||
unsigned positionLastCustomer = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition ;
|
||||
|
||||
|
||||
positionNewCustomer = randPosition(positionLastCustomer, _po.pRoutes[_tour].size());
|
||||
|
||||
|
||||
dueTime = getTimeOfService(_po.pRoutes[_tour], _po.planifiedCustomers[lastServedCustomer].id, _po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime, customer_id, positionNewCustomer)
|
||||
|
||||
|
||||
+ distance (dist, _po.pRoutes[_tour].back(),0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
|
||||
{
|
||||
|
||||
positionNewCustomer = randPosition(1, _po.pRoutes[_tour].size());
|
||||
|
||||
|
||||
dueTime = getTimeOfService(_po.pRoutes[_tour],_po.firstTimeServiceCurrentPosition[_tour], customer_id, positionNewCustomer)+ distance (dist, _po.pRoutes[_tour].back(),0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
double demandTour = getCapacityUsed(_po.pRoutes[_tour]) + clients[customer_id].demand;
|
||||
|
||||
|
||||
if (dueTime <= depotTimeWindow && demandTour <= VEHICULE_CAPACITY )
|
||||
|
||||
{
|
||||
|
||||
|
||||
_po.pRoutes[_tour].insert(_po.pRoutes[_tour].begin() + positionNewCustomer, customer_id );
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route = _po[_customer] = _tour+1;
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.routePosition = positionNewCustomer +1 ;
|
||||
|
||||
|
||||
|
||||
for(size_t i = positionNewCustomer +1 , size = _po.pRoutes[_tour].size() ; i < size; i++)
|
||||
|
||||
|
||||
{
|
||||
for (size_t j = 0 , sizeP = _po.size() ; j < sizeP ; j++)
|
||||
|
||||
{
|
||||
if(_po.planifiedCustomers[j].id == _po.pRoutes[_tour][i])
|
||||
|
||||
{
|
||||
_po.planifiedCustomers[j].pRouting.routePosition ++;
|
||||
|
||||
|
||||
break ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
commitCustomer = true ;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
_tour = ( _tour + 1 ) % _po.pRoutes.size();
|
||||
|
||||
}
|
||||
|
||||
if (!commitCustomer)
|
||||
|
||||
if (_po.pRoutes.size() < FLEET_VEHICLES)
|
||||
|
||||
{
|
||||
|
||||
Route newRoute = emptyRoute();
|
||||
|
||||
newRoute.push_back(customer_id);
|
||||
|
||||
_po.pRoutes.push_back(newRoute);
|
||||
|
||||
_po.firstTimeServiceCurrentPosition.push_back(TIME_STEP);// + TIME_SLICE);
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route = _po[_customer] = _po.pRoutes.size();
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.routePosition = _po.pRoutes.back().size() ;
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route =_po[_customer] = _po.planifiedCustomers[_customer].pRouting.routePosition = -1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void repositionCustomerInFirst(unsigned _customer, unsigned _tour, POT& _po)
|
||||
{
|
||||
|
||||
Route newRoute;
|
||||
|
||||
double dueTime ;
|
||||
|
||||
bool commitCustomer ;
|
||||
|
||||
unsigned positionNewCustomer;
|
||||
|
||||
double depotTimeWindow = clients[0].durationService;
|
||||
|
||||
unsigned customer_id = _po.planifiedCustomers[_customer].id;
|
||||
|
||||
unsigned route = _po[_customer] -1 ;
|
||||
|
||||
unsigned position = _po.planifiedCustomers[_customer].pRouting.routePosition -1;
|
||||
|
||||
|
||||
_po.pRoutes[route].erase(_po.pRoutes[route].begin() + position);
|
||||
|
||||
|
||||
|
||||
for ( unsigned i = position, size = _po.pRoutes[route].size(); i < size; i++) ///en premier
|
||||
|
||||
{ unsigned upcustomer = _po.pRoutes[route][i];
|
||||
|
||||
for (size_t j = 0, Psize = _po.planifiedCustomers.size(); j < Psize ; j++)
|
||||
|
||||
if (_po.planifiedCustomers[j].id == upcustomer)
|
||||
|
||||
{ _po.planifiedCustomers[j].pRouting.routePosition --;
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(_po.pRoutes[route].size() == 1 )//&& _po.pRoutes[route].size() >1) //empty tour, only the depot
|
||||
|
||||
{ _po.eraseRoute(route);
|
||||
|
||||
unsigned xLimit = _po.pRoutes.size() -1 ;
|
||||
|
||||
_tour = boundTour(_tour,xLimit);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
commitCustomer = false ;
|
||||
|
||||
|
||||
for (size_t j = 0 ; j < _po.pRoutes.size() ; j++ )
|
||||
{
|
||||
|
||||
|
||||
if(_po.serviceIsProgressCurrentPosition(_tour))
|
||||
|
||||
{
|
||||
|
||||
|
||||
unsigned lastServedCustomer =_po.IndexLastServedCustomerCurrentPosition(_tour) ;
|
||||
|
||||
|
||||
unsigned positionLastCustomer = _po.planifiedCustomers[lastServedCustomer].pRouting.routePosition ;
|
||||
|
||||
|
||||
positionNewCustomer = randPosition(positionLastCustomer, _po.pRoutes[_tour].size());
|
||||
|
||||
|
||||
dueTime = getTimeOfService(_po.pRoutes[_tour], _po.planifiedCustomers[lastServedCustomer].id, _po.planifiedCustomers[lastServedCustomer].pRouting.serviceTime, customer_id, positionNewCustomer)
|
||||
|
||||
|
||||
+ distance (dist, _po.pRoutes[_tour].back(),0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
|
||||
{
|
||||
|
||||
positionNewCustomer = randPosition(1, _po.pRoutes[_tour].size());
|
||||
|
||||
|
||||
dueTime = getTimeOfService(_po.pRoutes[_tour],_po.firstTimeServiceCurrentPosition[_tour], customer_id, positionNewCustomer)+ distance (dist, _po.pRoutes[_tour].back(),0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
double demandTour = getCapacityUsed(_po.pRoutes[_tour]) + clients[customer_id].demand;
|
||||
|
||||
|
||||
if (dueTime <= depotTimeWindow && demandTour <= VEHICULE_CAPACITY )
|
||||
|
||||
{
|
||||
|
||||
|
||||
_po.pRoutes[_tour].insert(_po.pRoutes[_tour].begin() + positionNewCustomer, customer_id );
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route = _po[_customer] = _tour+1;
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.routePosition = positionNewCustomer +1 ;
|
||||
|
||||
|
||||
|
||||
for(size_t i = positionNewCustomer +1 , size = _po.pRoutes[_tour].size() ; i < size; i++)
|
||||
|
||||
|
||||
{
|
||||
for (size_t j = 0 , sizeP = _po.size() ; j < sizeP ; j++)
|
||||
|
||||
{
|
||||
if(_po.planifiedCustomers[j].id == _po.pRoutes[_tour][i])
|
||||
|
||||
{
|
||||
_po.planifiedCustomers[j].pRouting.routePosition ++;
|
||||
|
||||
|
||||
break ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
commitCustomer = true ;
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
_tour = ( _tour + 1 ) % _po.pRoutes.size();
|
||||
|
||||
}
|
||||
|
||||
if (!commitCustomer)
|
||||
|
||||
if (_po.pRoutes.size() < FLEET_VEHICLES)
|
||||
|
||||
{
|
||||
|
||||
Route newRoute = emptyRoute();
|
||||
|
||||
newRoute.push_back(customer_id);
|
||||
|
||||
_po.pRoutes.push_back(newRoute);
|
||||
|
||||
_po.firstTimeServiceCurrentPosition.push_back(TIME_STEP );//+ TIME_SLICE);
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route = _po[_customer] = _po.pRoutes.size();
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.routePosition = _po.pRoutes.back().size() ;
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
_po.planifiedCustomers[_customer].pRouting.route =_po[_customer] = _po.planifiedCustomers[_customer].pRouting.routePosition = -1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /*EOPSODVRPFLIGHT_H_*/
|
||||
1789
contribution/branches/PSO-DVRP/eoPsoDVRPutils.cpp
Normal file
1789
contribution/branches/PSO-DVRP/eoPsoDVRPutils.cpp
Normal file
File diff suppressed because it is too large
Load diff
201
contribution/branches/PSO-DVRP/eoPsoDVRPutils.h
Normal file
201
contribution/branches/PSO-DVRP/eoPsoDVRPutils.h
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef eoPsoDVRPUTILS_H_
|
||||
#define eoPsoDVRPUTILS_H_
|
||||
|
||||
// General includes
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <eo>
|
||||
#include "eoEventScheduler.h"
|
||||
|
||||
#include "eoGlobal.h"
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
typedef std::vector<unsigned> Route;
|
||||
|
||||
typedef std::vector< Route > Routes;
|
||||
|
||||
|
||||
typedef struct record {
|
||||
|
||||
unsigned id; /**< Client ID number. */
|
||||
|
||||
double availTime; /**<Client's time available.*/
|
||||
|
||||
double x; /**< Client's 'x' position in the map. */
|
||||
|
||||
double y; /**< Client's 'y' position in the map. */
|
||||
|
||||
double demand; /**< Client's demand of delivered product. */
|
||||
|
||||
double durationService; /**< Client's service time (time needed to serve the product). */
|
||||
|
||||
} ClientDataT;
|
||||
|
||||
|
||||
typedef std::vector <ClientDataT> setCustumers;
|
||||
|
||||
extern setCustumers clients; // The matrix relative to the customers
|
||||
|
||||
extern std::vector<unsigned> newCustomers;
|
||||
|
||||
typedef std::vector <std::vector <double> > lengthMatrix ; /**< Distance matrix. */
|
||||
|
||||
extern lengthMatrix dist; // The matrix of distances between the customers*/
|
||||
|
||||
template<typename T> std::string to_string( const T & Value );
|
||||
|
||||
void computeDistances (); // Distance calculation
|
||||
|
||||
double computTourLength(Route _route);
|
||||
|
||||
double computTourLength(Routes _mRoute);
|
||||
|
||||
void getInformation (unsigned _custumer, double& _availTime, double& _durationService); // Obtain certain information about the customer
|
||||
|
||||
double distance (const lengthMatrix _dist, unsigned _from, unsigned _to); // Calculate the distance between two customers
|
||||
|
||||
bool findClient (unsigned id); // Test if the customer exists
|
||||
|
||||
void loadMatrixCustomers (const string _fileName); // Load the benchmark file and fill the customers matrix
|
||||
|
||||
void loadNewCustomers(double _timeStep, double _timeSlice);
|
||||
|
||||
void PrintCustumers(); //Print the Customers matrix and also distance matrix
|
||||
|
||||
void PrintLastCustomers(); // Print the Customers who are comming in the last time slice
|
||||
|
||||
void printRoute (const Route& _route);
|
||||
|
||||
void printRoutes (const Routes& _routes, std::ostream &_os);
|
||||
|
||||
const setCustumers SetKnowClients(); // Return the Customers matrix
|
||||
|
||||
const lengthMatrix distanceMatrix(); //Return the distance matrix
|
||||
|
||||
double getTimeOfService (Route _route, double _startTime, unsigned _newCustomer_id, unsigned _newPosition);
|
||||
|
||||
double getTimeOfService (Route _route, unsigned _lastServedCustomer, double _serviceTime, unsigned _newCustomer_id, unsigned _newPosition);
|
||||
|
||||
double getTimeOfService(const Route _route, unsigned _lastServedCustomer_id, double dispo);
|
||||
|
||||
double startServiceTime (double _nextTimeStep, double _dispoTime);
|
||||
|
||||
double getCapacityUsed (Route _route);
|
||||
|
||||
Route emptyRoute();
|
||||
|
||||
unsigned randTour(unsigned maxTour);
|
||||
|
||||
int randVelocity (int _sizeTour);
|
||||
|
||||
unsigned randPosition (unsigned _lastPosition, unsigned _sizeTour);
|
||||
|
||||
void checkDistances(const Routes _matrix);
|
||||
|
||||
void checkCharge(const Routes _matrix);
|
||||
|
||||
void visualization (const Routes _matrix , unsigned _seed, ofstream & _os);
|
||||
|
||||
double computTourLength(Routes _routes);
|
||||
|
||||
void cheapestInsertionAlgorithm (Route _route, unsigned indexTour,
|
||||
|
||||
unsigned lastServedCustomer_id, unsigned lastServedCustomerPosition,
|
||||
|
||||
double serviceTime, unsigned customer_id, unsigned & cheapestTour,
|
||||
|
||||
double & cheapestTourCost, unsigned & positionCheapestTour, bool & commitCustomer);
|
||||
|
||||
void cheapestInsertionAlgorithm (Route _route, unsigned indexTour,
|
||||
|
||||
double _startTime, unsigned customer_id, unsigned & cheapestTour,double & cheapestTourCost,
|
||||
|
||||
unsigned & positionCheapestTour, bool & commitCustomer) ;
|
||||
|
||||
|
||||
void nearestInsertionAlgorithm (Route _route, unsigned indexTour,
|
||||
|
||||
unsigned lastServedCustomer_id, unsigned lastServedCustomerPosition,
|
||||
|
||||
double serviceTime, unsigned customer_id, unsigned & nearestTour,
|
||||
|
||||
double & nearestTourCost, unsigned & positionNearestTour, bool & commitCustomer);
|
||||
|
||||
void nearestInsertionAlgorithm (Route _route, unsigned indexTour,
|
||||
|
||||
double _startTime, unsigned customer_id, unsigned & nearestTour,double & nearestTourCost,
|
||||
|
||||
unsigned & positionNearestTour, bool & commitCustomer);
|
||||
|
||||
|
||||
void generalizedInsertionTypeOneAlgorithm (Route _route, Route& _Genroute, unsigned indexTour, unsigned lastServedCustomer_id,
|
||||
|
||||
unsigned lastServedCustomerPosition, double serviceTime, unsigned customer_id,
|
||||
|
||||
unsigned & generalizedTour, unsigned & positionGeneralizedTour, double & generalizedTourCost, bool & commitCustomer);
|
||||
|
||||
|
||||
|
||||
void generalizedInsertionTypeOneAlgorithm (Route _route, Route & _GenRoute, unsigned indexTour, double _startTime, unsigned customer_id, unsigned & generalizedTour,
|
||||
|
||||
unsigned & positionGeneralizedTour, double & generalizedTourCost, bool & commitCustomer);
|
||||
|
||||
|
||||
void InsertionTypeOne(Route& _route, unsigned positionGeneralizedTour, unsigned customer_id, std::vector<unsigned> vertices);
|
||||
|
||||
void swapCustomers(Route & _route, unsigned _lastCustomerPosition);
|
||||
|
||||
bool twoOptOnRoute( Route & _route , unsigned from);
|
||||
|
||||
double GainCost(Route _route, unsigned _from, unsigned _to);
|
||||
|
||||
double GainCost(Route _route, unsigned _from, unsigned _to, unsigned _end);
|
||||
|
||||
void threeMoveRoute(Route & _route, unsigned _from, unsigned _to, unsigned _end);
|
||||
|
||||
bool threeOptOnRoute( Route & _route , unsigned _lastServedCustomerPosition);
|
||||
#endif /*eoPsoDVRPUTILS_H_*/
|
||||
175
contribution/branches/PSO-DVRP/eoPsoDVRPvelocity.h
Normal file
175
contribution/branches/PSO-DVRP/eoPsoDVRPvelocity.h
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef EOPSODVRPVELOCITY_H_
|
||||
#define EOPSODVRPVELOCITY_H_
|
||||
|
||||
#include"eoPsoDVRP.h"
|
||||
|
||||
|
||||
template < class POT >
|
||||
|
||||
class eoPsoDVRPvelocity:public eoVelocity < POT >
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
typedef typename POT::ParticleVelocityType VelocityType;
|
||||
|
||||
eoPsoDVRPvelocity( eoDVRPStarTopology<POT> & _topology,
|
||||
|
||||
const double & _w,
|
||||
|
||||
const double & _c1,
|
||||
|
||||
const double & _c2): topology(_topology),
|
||||
|
||||
omega(_w),c1(_c1),c2(_c2){}
|
||||
|
||||
|
||||
|
||||
void updateNeighborhood(POT & _po,unsigned _indice)
|
||||
{
|
||||
|
||||
topology.updateNeighborhood(_po,_indice);
|
||||
|
||||
}
|
||||
|
||||
void updateNeighborhood(eoPop<POT> & _pop,unsigned _indice = 0)
|
||||
{
|
||||
|
||||
for (size_t i =0, size = _pop.size() ; i < size; i++)
|
||||
|
||||
topology.updateNeighborhood(_pop[i],_indice);
|
||||
|
||||
}
|
||||
|
||||
|
||||
eoTopology<POT> & getTopology ()
|
||||
{
|
||||
return topology;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void operator()(POT & _po,unsigned _indice) {
|
||||
|
||||
|
||||
VelocityType newVelocity;
|
||||
|
||||
|
||||
if(_po.size()!=_po.velocities.size() || _po.bestPositions.size()!= _po.velocities.size())
|
||||
|
||||
std::cerr<<"The size of the particle is different to the velocity size...!"<<endl;
|
||||
|
||||
|
||||
if (_po.pRoutes.size() == 0 || _po.bestRoutes.size() ==0)
|
||||
|
||||
std::cerr<<" The current position tours, or the best position tours are empty ....!!!!"<<endl;
|
||||
|
||||
|
||||
int Vlimit = _po.pRoutes.size()-1;
|
||||
|
||||
|
||||
for (unsigned j = 0, size = _po.velocities.size(); j < size ; j++)
|
||||
{
|
||||
|
||||
newVelocity= static_cast<int> (omega * _po.velocities[j] + c1 * (_po.bestPositions[j] - _po[j]) + c2 * (topology.best(_indice).bestPositions[j] - _po[j]));
|
||||
|
||||
|
||||
_po.velocities[j]= _po.planifiedCustomers[j].velocity = randVelocity(_po.pRoutes.size()-1) ;//boundVelocity(newVelocity, Vlimit);
|
||||
|
||||
|
||||
}
|
||||
|
||||
_po.normalizeVelocities();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* eoRealVectorBounds bounds(_po.size(),-Vlimit,Vlimit);
|
||||
|
||||
bounds.adjust_size(_po.size());*/
|
||||
|
||||
/* if (bounds.isMinBounded(j))
|
||||
newVelocity=std::max(newVelocity,bounds.minimum(j));
|
||||
if (bounds.isMaxBounded(j))
|
||||
newVelocity=std::min(newVelocity,bounds.maximum(j));*/
|
||||
|
||||
|
||||
|
||||
VelocityType boundVelocity(VelocityType velocity, int limit)
|
||||
{
|
||||
if(limit == 0)
|
||||
|
||||
return 0;
|
||||
else
|
||||
|
||||
if(velocity < -limit)
|
||||
|
||||
return (velocity % -limit);
|
||||
|
||||
else
|
||||
|
||||
if (velocity > limit)
|
||||
|
||||
return (velocity % limit);
|
||||
|
||||
else
|
||||
|
||||
return velocity;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
eoDVRPStarTopology<POT> & topology;
|
||||
|
||||
const double & omega; // social/cognitive coefficient
|
||||
|
||||
const double & c1; // social/cognitive coefficient
|
||||
|
||||
const double & c2; // social/cognitive coefficient
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*EOPSODVRPVELOCITY_H_*/
|
||||
60
contribution/branches/PSO-DVRP/index.h
Normal file
60
contribution/branches/PSO-DVRP/index.h
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
/** @mainpage Welcome to PSO-DVRP for PARADISEO
|
||||
|
||||
@section Introduction
|
||||
|
||||
we propose a Particle Swarm Optimization metaheuristic (PSO) for resolving the Dynamic Vehicle Routing Problem (DVRP). This problem is the dynamic and real-time version of the conventional Vehicle Routing Problem (VRP).
|
||||
In the classical VRP, the planning of tours is accomplished before the working day, whereas in the dynamic version of this problem, the planning of tours is made in a dynamic or real-time way.
|
||||
The purpose is to try to insert the new customer orders in the already planned tours, when the vehicles are already on routes, and in minimizing the tours cost.
|
||||
|
||||
This metaheuristic is based on the Particle Swarm Optimization metaheuritic (PSO). It constitutes a great bio-inspired model of self-organization. Our approach is adaptive in both the representation of particles, and the step of their evaluation.
|
||||
Furthermore, we handle the DVRP as a mixed problem. This problem is treated as an Open Vehicle Routing Problem (OVRP) at the beginning of the working day. It consists only in optimizing the segments of routes traveled by vehicles.
|
||||
At the end of working day, the problem is treated as a conventional VRP. In this case, the optimization is operated on complete tours. This means that we consider the return to the depot of the whole vehicle fleet.
|
||||
|
||||
As perspective, we expect to parallelize it and scale it on grid. A possible schema of parallelization is the multi-swarm, where several swarms evolve (move) in parallel on different calculation nodes.
|
||||
|
||||
|
||||
@section authors AUTHORS
|
||||
|
||||
<TABLE>
|
||||
<TR>
|
||||
<TD>Dolphin project-team INRIA Futurs, 2008.</TD>
|
||||
<TD>Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr> </TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
|
||||
@section LICENSE
|
||||
|
||||
This software is governed by the CeCILL license under French law and
|
||||
abiding by the rules of distribution of free software. You can use,
|
||||
modify and/ or redistribute the software under the terms of the CeCILL
|
||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
"http://www.cecill.info".
|
||||
|
||||
As a counterpart to the access to the source code and rights to copy,
|
||||
modify and redistribute granted by the license, users are provided only
|
||||
with a limited warranty and the software's author, the holder of the
|
||||
economic rights, and the successive licensors have only limited liability.
|
||||
|
||||
In this respect, the user's attention is drawn to the risks associated
|
||||
with loading, using, modifying and/or developing or reproducing the
|
||||
software by the user in light of its specific status of free software,
|
||||
that may mean that it is complicated to manipulate, and that also
|
||||
therefore means that it is reserved for developers and experienced
|
||||
professionals having in-depth computer knowledge. Users are therefore
|
||||
encouraged to load and test the software's suitability as regards their
|
||||
requirements in conditions enabling the security of their systems and/or
|
||||
data to be ensured and, more generally, to use and operate it in the
|
||||
same conditions as regards security.
|
||||
The fact that you are presently reading this means that you have had
|
||||
knowledge of the CeCILL license and that you accept its terms.
|
||||
|
||||
ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
|
||||
|
||||
@section Paradiseo Home Page
|
||||
|
||||
<A href=http://paradiseo.gforge.inria.fr>http://paradiseo.gforge.inria.fr</A>
|
||||
|
||||
*/
|
||||
89
contribution/branches/PSO-DVRP/parser.cpp
Normal file
89
contribution/branches/PSO-DVRP/parser.cpp
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
|
||||
#include"parser.h"
|
||||
|
||||
|
||||
|
||||
void IsReadable(ifstream& _filein)
|
||||
{
|
||||
|
||||
if ( !_filein)
|
||||
{
|
||||
cerr << "Opening file is fail\n";
|
||||
//exit(1);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
string ReadableLine(ifstream& _filein)
|
||||
{
|
||||
string line;
|
||||
|
||||
if(!(getline(_filein, line )))
|
||||
{
|
||||
cerr << "Error was occur when read line\n";
|
||||
exit(1);
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
|
||||
void IsCreatable(ofstream& _fileout)
|
||||
{
|
||||
if ( !_fileout )
|
||||
{
|
||||
cerr << "Error occur when file was created\n";
|
||||
exit(1);
|
||||
}
|
||||
cout<<" File was created"<<endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
string fileOut(argv[1]);
|
||||
const string BENCHMARK ="/home/mustapha/framework/paradiseo-1.1/paradiseo-dynamic-schedule/application/Benchmarks/"+fileOut+".vrp";
|
||||
std::istringstream iss(argv[2]); iss >> INERTIA; iss.clear();
|
||||
iss.str(argv[3]); iss >> LEARNING_FACTOR1; iss.clear();
|
||||
iss.str(argv[4]); iss >> LEARNING_FACTOR2; iss.clear();
|
||||
iss.str(argv[5]); iss >> SEED; rng.reseed(SEED); iss.clear();
|
||||
|
||||
string extension = "";
|
||||
extension = extension +"-IN(" + argv[2] + ")" + "-C1(" + argv[3] + ")" + "-C2("+ argv[4] + ")" ;
|
||||
|
||||
*/
|
||||
|
||||
58
contribution/branches/PSO-DVRP/parser.h
Normal file
58
contribution/branches/PSO-DVRP/parser.h
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (C) DOLPHIN Project-Team, INRIA Lille Nord-Europe, 2007-2008
|
||||
* (C) OPAC Team, LIFL, 2002-2008
|
||||
*
|
||||
* (c) Mostepha Redouane Khouadjia <mr.khouadjia@ed.univ-lille1.fr>, 2008
|
||||
*
|
||||
* This software is governed by the CeCILL license under French law and
|
||||
* abiding by the rules of distribution of free software. You can use,
|
||||
* modify and/ or redistribute the software under the terms of the CeCILL
|
||||
* license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
* "http://www.cecill.info".
|
||||
*
|
||||
* As a counterpart to the access to the source code and rights to copy,
|
||||
* modify and redistribute granted by the license, users are provided only
|
||||
* with a limited warranty and the software's author, the holder of the
|
||||
* economic rights, and the successive licensors have only limited liability.
|
||||
*
|
||||
* In this respect, the user's attention is drawn to the risks associated
|
||||
* with loading, using, modifying and/or developing or reproducing the
|
||||
* software by the user in light of its specific status of free software,
|
||||
* that may mean that it is complicated to manipulate, and that also
|
||||
* therefore means that it is reserved for developers and experienced
|
||||
* professionals having in-depth computer knowledge. Users are therefore
|
||||
* encouraged to load and test the software's suitability as regards their
|
||||
* requirements in conditions enabling the security of their systems and/or
|
||||
* data to be ensured and, more generally, to use and operate it in the
|
||||
* same conditions as regards security.
|
||||
* The fact that you are presently reading this means that you have had
|
||||
* knowledge of the CeCILL license and that you accept its terms.
|
||||
*
|
||||
* ParadisEO WebSite : http://paradiseo.gforge.inria.fr
|
||||
* Contact: paradiseo-help@lists.gforge.inria.fr
|
||||
*
|
||||
*/
|
||||
#ifndef PARSER_H_
|
||||
#define PARSER_H_
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
void IsReadable( ifstream& filein); //to test the available of file
|
||||
|
||||
string ReadableLine(ifstream& filein);
|
||||
|
||||
void IsCreatable(ofstream& _fileout);
|
||||
|
||||
|
||||
#endif /*PARSER_H_*/
|
||||
Loading…
Add table
Add a link
Reference in a new issue