Test avec des opérateurs de permutation hétérogène sur le problème du TSP

Nous définissons ici le nombre d'ile à utiliser ainsi que le niveau de lissage des courbes.


In [150]:
N=4
A=1000
OPS=['1swap','2swap','shift','2-opt']

Puis quelques routines…


In [4]:
import pandas as pd

In [5]:
import matplotlib as mpl
mpl.rc('figure', figsize=(10, 8))

In [11]:
%%script ./tsp -h


>> Loading [benchs/ali535.tsp]
./tsp: 

Usage: ./tsp [Options]
Options of the form "-f[=Value]" or "--Name[=value]"
Where:

### GENERAL ########################################################################
-h, --help :	Prints this message (optional, default: 0)
--stopOnUnknownParam :	Stop if unkown param entered (optional, default: 1)
-S, --seed :	Random number seed (optional, default: 0)

### EVOLUTION ENGINE ###############################################################
-P, --popSize :	Population Size (optional, default: 100)

### ISLANDS MODEL ##################################################################
--nislands :	Number of islands (see --smp) (optional, default: 4)
-a, --alpha :	Alpha Probability (optional, default: 0.2)
-A, --alphaF :	Alpha Fitness (optional, default: 0.01)
-b, --beta :	Beta Probability (optional, default: 0.01)
-d, --probaSame :	Probability for an individual to stay in the same island (optional, default: 25)
-I, --initG :	initG (optional, default: 1)
--nmigrations :	Number of migrations to do at each generation (0=all individuals are migrated) (optional, default: 1)
--stepTimer :	stepTimer (optional, default: 0)
--deltaUpdate :	deltaUpdate (optional, default: 1)
--deltaFeedback :	deltaFeedback (optional, default: 1)
--sensitivity :	sensitivity of delta{t} (1/sensitivity) (optional, default: 1)
--rewardStrategy :	Strategy of rewarding: best or avg (optional, default: best)
--operator0 :	Set an operator between 1swap, 2swap, shift and 2opt (optional, default: 1swap)
--operator1 :	Set an operator between 1swap, 2swap, shift and 2opt (optional, default: 1swap)
--operator2 :	Set an operator between 1swap, 2swap, shift and 2opt (optional, default: 1swap)
--operator3 :	Set an operator between 1swap, 2swap, shift and 2opt (optional, default: 1swap)

### LOGGER #########################################################################
-v, --verbose :	Set the verbose level (optional, default: quiet)
-l, --print-verbose-levels :	Print verbose levels (optional, default: 0)
-o, --output :	Redirect a standard output to a file (optional, default: )

### OUTPUT #########################################################################
--monitorPrefix :	Monitor prefix filenames (optional, default: result)

### PARALLELIZATION ################################################################
--parallelize-dynamic :	Enable dynamic memory shared parallelization (optional, default: 1)
--parallelize-do-measure :	Do some measures during execution (optional, default: 0)

### PARALLELIZATION WITH MPI #######################################################
--parallelize-packet-size :	Number of elements which should be sent in a single message during a parallel evaluation based on message passing. (optional, default: 1)

### PERSISTENCE ####################################################################
-L, --Load :	A save file to restart from (optional, default: )
-r, --recomputeFitness :	Recompute the fitness after re-loading the pop.? (optional, default: 0)
--status :	Status file (optional, default: ./tsp.status)

### PROBLEM ########################################################################
--tspInstance :	filename of the instance for TSP problem (optional, default: benchs/ali535.tsp)

### STOPPING CRITERION #############################################################
-T, --targetFitness :	Stop when fitness reaches (optional, default: 0)
-G, --maxGen :	Maximum number of generations () = none) (optional, default: 10000)

@param_file 	 defines a file where the parameters are stored

You can use an edited copy of file ./tsp.status as parameter file

Paramètres

Nous lançons le test suivant: DIM auquel s'applique le problème du TSP avec les paramétres:

  • 4 iles avec les opérateurs de permutation suivants: 1swap, 2swap, shift, 2-opt
  • appliqué à l'instance « benchs/ali535.tsp »
  • avec un critère d'arrêt « genmax » définit à 10000 (pas de targetFitness)
  • en mode SMP (synchrone)
  • $\alpha_p = 0.2$
  • $\beta_p = 0.01$
  • $\alpha_f = 0.2$
  • statégie de récompense: MAX
  • $P=100$
  • $$M = \begin{bmatrix} 25 & 25 & 25 & 25 \\\ 25 & 25 & 25 & 25 \\\ 25 & 25 & 25 & 25 \\\ 25 & 25 & 25 & 25 \\\ \end{bmatrix}$$

In [12]:
%%script /Dev/dim/release/application/TSP/tsp --monitorPrefix=/tmp/tsp_test_result --operator0=1swap --operator1=2swap --operator2=shift --operator3=2opt -G=10000 --tspInstance=/Dev/dim/release/application/TSP/benchs/ali535.tsp --nislands=4


>> Loading [benchs/ali535.tsp]
Migration probability (in %) among islands
	0	1	2	3
0	25	25	25	25
1	25	25	25	25
2	25	25	25	25
3	25	25	25	25

sum	100	100	100	100
size: 535
island 0
4 0 1swap
island 1
4 1 2swap
island 2
4 2 shift
island 3
4 3 2opt
end
end
end
end

In [13]:
!head /tmp/tsp_test_result_monitor_*


==> nb_test_result_monitor_0 <==
Island,Time,DateTime,migration,nb_individual_isl0,sending_queue_size_isl0,receiving_queue_size_isl0,avg_ones_isl0,delta_avg_ones_isl0,best_value_isl0,nb_input_ind_isl0,nb_output_ind_isl0,P0to0,P0to1,P0to2,P0to3,P0to*,P*to0,F0to0,F0to1,F0to2,F0to3,nb_migrants_isl0to0,nb_migrants_isl0to1,nb_migrants_isl0to2,nb_migrants_isl0to3
0,0.007,2013-Jul-11 10:37:16.489176,0,100,0,0,-39353.2,-39353.2,-37787,0,0,25,25,25,25,100,0,0,0,0,0,0,0,0,0
0,0.033,2013-Jul-11 10:37:16.514630,1,94,0,0,-39262.8,-39262.8,-37166,94,100,39.7,20,20.1,20.2,100,0,0.4137,0,0,0,36,16,25,23
0,0.035,2013-Jul-11 10:37:16.516876,2,106,0,0,-39298.7,-39298.7,-37166,106,94,51.5,16.2,16.2,16.1,100,0,0.740674,0.693125,0.3528,0.303043,44,18,17,15
0,0.039,2013-Jul-11 10:37:16.520892,3,81,0,0,-39121.3,-39121.3,-37812,81,106,40.9,32.9,13.1,13.1,100,0,1.05349,1.2223,0.676919,0.580013,48,34,16,8
0,0.041,2013-Jul-11 10:37:16.522751,4,63,0,0,-39015.5,-39015.5,-37481,63,81,32.4,46.2,10.5,10.9,100,0,1.294,1.81449,0.892025,0.650463,27,36,8,10
0,0.043,2013-Jul-11 10:37:16.525551,5,46,0,0,-39275,-39275,-37690,46,63,25.8,56.5,8.7,9,100,0,1.44477,2.38468,1.1331,0.908958,11,44,4,4
0,0.047,2013-Jul-11 10:37:16.528813,6,28,0,0,-39113.7,-39113.7,-37672,28,46,21,64.6,6.9,7.5,100,0,1.62577,3.0172,1.27927,1.00237,7,32,2,5
0,0.05,2013-Jul-11 10:37:16.532353,7,22,0,0,-39254.7,-39254.7,-36956,22,28,16.7,71.1,5.8,6.4,100,0,2.12666,3.45046,1.49148,1.39835,8,17,1,2
0,0.055,2013-Jul-11 10:37:16.536691,8,22,0,0,-38511.7,-38511.7,-36949,22,22,13.4,76.3,4.7,5.6,100,0,2.18539,3.6789,1.47657,1.39936,5,14,3,0

==> nb_test_result_monitor_1 <==
Island,Time,DateTime,migration,nb_individual_isl1,sending_queue_size_isl1,receiving_queue_size_isl1,avg_ones_isl1,delta_avg_ones_isl1,best_value_isl1,nb_input_ind_isl1,nb_output_ind_isl1,P1to0,P1to1,P1to2,P1to3,P1to*,P*to1,F1to0,F1to1,F1to2,F1to3,nb_migrants_isl1to0,nb_migrants_isl1to1,nb_migrants_isl1to2,nb_migrants_isl1to3
1,0.005,2013-Jul-11 10:37:16.489176,0,100,0,0,-39243.3,-39243.3,-37166,0,0,25,25,25,25,100,0,0,0,0,0,0,0,0,0
1,0.03,2013-Jul-11 10:37:16.514636,1,105,0,0,-39294.9,-39294.9,-37540,105,100,20.1,39.9,20,20,100,0,0,0.466,0,0,19,42,18,21
1,0.032,2013-Jul-11 10:37:16.516887,2,134,0,0,-39192.9,-39192.9,-37485,134,105,16.2,51.5,15.8,16.5,100,0,0.0952632,0.902769,0.242222,0.175714,21,58,10,16
1,0.036,2013-Jul-11 10:37:16.520372,3,158,0,0,-39238.7,-39238.7,-36994,158,134,13.2,60.7,12.7,13.4,100,0,0.399549,1.33857,0.6618,0.392707,16,80,16,22
1,0.039,2013-Jul-11 10:37:16.523592,4,209,0,0,-39226.9,-39226.9,-37076,209,158,10.5,68.2,10.3,11,100,0,0.592428,1.75156,1.01268,0.539235,17,113,18,10
1,0.042,2013-Jul-11 10:37:16.526592,5,252,0,0,-39122.1,-39122.1,-37008,252,209,8.3,74.1,8.5,9.1,100,0,0.661798,2.10785,1.14422,0.541842,23,147,18,21
1,0.045,2013-Jul-11 10:37:16.529710,6,306,0,0,-39109.7,-39109.7,-36986,306,252,6.8,78.7,6.9,7.6,100,0,1.07083,2.56636,1.31111,0.678329,15,211,11,15
1,0.048,2013-Jul-11 10:37:16.532720,7,330,0,0,-39049.2,-39049.2,-36986,330,306,5.6,82.4,5.6,6.4,100,0,1.41012,3.08885,1.52255,0.770212,8,267,14,17
1,0.053,2013-Jul-11 10:37:16.537052,8,338,0,0,-39019.6,-39019.6,-36986,338,330,4.6,85.1,4.7,5.6,100,0,2.40477,3.53152,1.78518,0.840157,17,284,15,14

==> nb_test_result_monitor_2 <==
Island,Time,DateTime,migration,nb_individual_isl2,sending_queue_size_isl2,receiving_queue_size_isl2,avg_ones_isl2,delta_avg_ones_isl2,best_value_isl2,nb_input_ind_isl2,nb_output_ind_isl2,P2to0,P2to1,P2to2,P2to3,P2to*,P*to2,F2to0,F2to1,F2to2,F2to3,nb_migrants_isl2to0,nb_migrants_isl2to1,nb_migrants_isl2to2,nb_migrants_isl2to3
2,0.002,2013-Jul-11 10:37:16.489174,0,100,0,0,-39246.3,-39246.3,-37022,0,0,25,25,25,25,100,0,0,0,0,0,0,0,0,0
2,0.028,2013-Jul-11 10:37:16.514672,1,103,0,0,-39272.3,-39272.3,-36994,103,100,19.9,20,39.8,20.3,100,0,0,0,0.2822,0,25,23,37,15
2,0.03,2013-Jul-11 10:37:16.516753,2,91,0,0,-39238.2,-39238.2,-36994,91,103,15.9,16,51.7,16.4,100,0,0.2504,0.41,0.645864,0.252,23,19,48,13
2,0.032,2013-Jul-11 10:37:16.519016,3,104,0,0,-39185.2,-39185.2,-37121,104,91,12.6,13,60.9,13.5,100,0,0.661374,0.690637,0.888989,0.684865,11,13,58,9
2,0.036,2013-Jul-11 10:37:16.522747,4,77,0,0,-39136.2,-39136.2,-36994,77,104,10.5,30.2,48.3,11,100,0,0.770215,1.26912,1.17941,0.694683,14,31,47,12
2,0.038,2013-Jul-11 10:37:16.525525,5,53,0,0,-38988.7,-38988.7,-36994,53,77,8.5,43.9,38.5,9.1,100,0,1.07251,1.93836,1.5591,1.04107,7,30,27,13
2,0.042,2013-Jul-11 10:37:16.528813,6,33,0,0,-39042.6,-39042.6,-37747,33,53,6.8,54.9,30.6,7.7,100,0,1.37464,2.31931,1.86537,1.3222,4,24,19,6
2,0.045,2013-Jul-11 10:37:16.532397,7,23,0,0,-38877.3,-38877.3,-37474,23,33,5.6,63.6,24.3,6.5,100,0,1.7509,2.59362,2.12303,1.34564,4,20,7,2
2,0.05,2013-Jul-11 10:37:16.536706,8,21,0,0,-39274.1,-39274.1,-37612,21,23,4.5,70.6,19.3,5.6,100,0,2.03589,3.12668,2.38323,1.50219,0,17,3,3

==> nb_test_result_monitor_3 <==
Island,Time,DateTime,migration,nb_individual_isl3,sending_queue_size_isl3,receiving_queue_size_isl3,avg_ones_isl3,delta_avg_ones_isl3,best_value_isl3,nb_input_ind_isl3,nb_output_ind_isl3,P3to0,P3to1,P3to2,P3to3,P3to*,P*to3,F3to0,F3to1,F3to2,F3to3,nb_migrants_isl3to0,nb_migrants_isl3to1,nb_migrants_isl3to2,nb_migrants_isl3to3
3,0,2013-Jul-11 10:37:16.489286,0,100,0,0,-39392.2,-39392.2,-37678,0,0,25,25,25,25,100,0,0,0,0,0,0,0,0,0
3,0.025,2013-Jul-11 10:37:16.514646,1,98,0,0,-39274,-39274,-37568,98,100,19.8,20.3,19.9,40,100,0,0,0,0,0.1317,14,24,23,39
3,0.027,2013-Jul-11 10:37:16.516760,2,69,0,0,-39272.9,-39272.9,-37531,69,98,16,35.9,15.8,32.3,100,0,0.263571,0.57125,0.187391,0.224229,18,39,16,25
3,0.029,2013-Jul-11 10:37:16.518802,3,57,0,0,-39325,-39325,-37076,57,69,13,48.2,12.8,26,100,0,0.438158,0.871691,0.300517,0.378787,6,31,14,18
3,0.033,2013-Jul-11 10:37:16.522714,4,51,0,0,-39241.3,-39241.3,-37427,51,57,10.5,58.1,10.3,21.1,100,0,0.873776,1.63394,0.348227,0.631666,5,29,4,19
3,0.036,2013-Jul-11 10:37:16.525513,5,49,0,0,-39283.6,-39283.6,-37750,49,51,8.4,66,8.5,17.1,100,0,1.12504,2.21036,0.349744,0.722191,5,31,4,11
3,0.039,2013-Jul-11 10:37:16.528818,6,33,0,0,-39080.3,-39080.3,-37960,33,49,6.6,72.4,7,14,100,0,1.13979,2.57148,0.366247,0.881333,2,39,1,7
3,0.043,2013-Jul-11 10:37:16.532508,7,25,0,0,-39116.1,-39116.1,-37419,25,33,5.5,77.5,5.7,11.3,100,0,1.12839,3.20731,0.362584,1.32681,2,26,1,4
3,0.047,2013-Jul-11 10:37:16.536681,8,19,0,0,-39147.4,-39147.4,-37512,19,25,4.4,81.5,4.8,9.3,100,0,1.99711,3.68139,0.358958,1.40354,0,23,0,2

Data mining


In [8]:
data_set = [pd.read_csv('/tmp/tsp_test_result_monitor_%d' % i, index_col=['DateTime','migration'], parse_dates='DateTime') for i in range(N)]
mig_set = [data_set[i].reset_index(0) for i in range(N)]

Attractivité des opérateurs

Nous illustrons ci-dessous l'actractivité sans et avec le cumul des valeurs.


In [159]:
attractiveness = pd.concat([pd.concat([mig_set[j]['P%dto%d' % (j,i)] for j in range(N)],axis=1).sum(axis=1) for i in range(N)],axis=1)
attractiveness.rename(columns=dict(zip(attractiveness.columns,OPS)), inplace=True)
fig, axes = subplots(nrows=2,ncols=2)
for affinity, ax in [(1,axes[0,0]), (10,axes[0,1]), (100,axes[1,0]), (1000,axes[1,1])]:
    attractiveness[::affinity].plot(ax=ax, title="smoothing = %d" % affinity).set_ylabel('nb individuals')
attractiveness.cumsum().plot(title='sum of cumul').set_ylabel('cumul')


Out[159]:
<matplotlib.text.Text at 0x7f3d696b81d0>

Evolution des populations


In [168]:
nbindis = pd.concat([mig_set[i]['nb_individual_isl%d' % i] for i in range(N)], axis=1)
nbindis.rename(columns=dict(zip(nbindis.columns,OPS)), inplace=True)
nbindis_max = nbindis.max(axis=1); nbindis_max.name = 'nbindis max'
nbindis_avg = nbindis.mean(axis=1); nbindis_avg.name = 'nbindis avg'
#nbindis = nbindis.join(nbindis_max).join(nbindis_avg)
fig, axes = subplots(nrows=2,ncols=2)
for affinity, ax in [(1,axes[0,0]), (10,axes[0,1]), (100,axes[1,0]), (1000,axes[1,1])]:
    nbindis[::affinity].plot(ax=ax, title="smoothing = %d" % affinity).set_ylabel('nb individuals')
[ax.set_ylabel('nb individuals') for ax in nbindis[::A].plot(subplots=True, title="smoothing = %d" % A)]
nbindis.cumsum().plot(title='sum of cumul').set_ylabel('cumul of nb individuals')


Out[168]:
<matplotlib.text.Text at 0x7f3d68f734d0>

In [149]:
fig, ax = subplots()
ax.set_ylabel('nb individuals')
nbindis.boxplot(ax=ax)


Out[149]:
{'boxes': [<matplotlib.lines.Line2D at 0x7f3d70a78dd0>,
  <matplotlib.lines.Line2D at 0x7f3d6bcc38d0>,
  <matplotlib.lines.Line2D at 0x7f3d699ee110>,
  <matplotlib.lines.Line2D at 0x7f3d6983af50>],
 'caps': [<matplotlib.lines.Line2D at 0x7f3d69d03d50>,
  <matplotlib.lines.Line2D at 0x7f3d69ae9550>,
  <matplotlib.lines.Line2D at 0x7f3d69a5a610>,
  <matplotlib.lines.Line2D at 0x7f3d69a5a350>,
  <matplotlib.lines.Line2D at 0x7f3d69b07f90>,
  <matplotlib.lines.Line2D at 0x7f3d699de9d0>,
  <matplotlib.lines.Line2D at 0x7f3d697ffb90>,
  <matplotlib.lines.Line2D at 0x7f3d697ff7d0>],
 'fliers': [<matplotlib.lines.Line2D at 0x7f3d69a21d90>,
  <matplotlib.lines.Line2D at 0x7f3d69b0a250>,
  <matplotlib.lines.Line2D at 0x7f3d6bcc30d0>,
  <matplotlib.lines.Line2D at 0x7f3d69b65f10>,
  <matplotlib.lines.Line2D at 0x7f3d69849950>,
  <matplotlib.lines.Line2D at 0x7f3d697f68d0>,
  <matplotlib.lines.Line2D at 0x7f3d6989d1d0>,
  <matplotlib.lines.Line2D at 0x7f3d697eca10>],
 'medians': [<matplotlib.lines.Line2D at 0x7f3d70a78bd0>,
  <matplotlib.lines.Line2D at 0x7f3d6bcc3e50>,
  <matplotlib.lines.Line2D at 0x7f3d69849450>,
  <matplotlib.lines.Line2D at 0x7f3d6983a310>],
 'whiskers': [<matplotlib.lines.Line2D at 0x7f3d69d95750>,
  <matplotlib.lines.Line2D at 0x7f3d69d8da10>,
  <matplotlib.lines.Line2D at 0x7f3d69b0a110>,
  <matplotlib.lines.Line2D at 0x7f3d69a29850>,
  <matplotlib.lines.Line2D at 0x7f3d69b65410>,
  <matplotlib.lines.Line2D at 0x7f3d69b07b50>,
  <matplotlib.lines.Line2D at 0x7f3d697f6990>,
  <matplotlib.lines.Line2D at 0x7f3d697f6410>]}

In [166]:
nbindis.describe()


Out[166]:
1swap 2swap shift 2-opt
count 10000.000000 10000.000000 10000.000000 10000.000000
mean 13.032100 27.034500 81.260900 278.672500
std 35.646595 80.425944 103.363865 127.526056
min 0.000000 0.000000 0.000000 1.000000
25% 3.000000 3.000000 4.000000 195.000000
50% 4.000000 4.000000 7.000000 368.500000
75% 7.000000 6.000000 177.000000 387.000000
max 373.000000 395.000000 393.000000 399.000000

Évolution des solutions


In [155]:
bests = pd.concat([mig_set[i]['best_value_isl%d' % i] for i in range(N)], axis=1)
bests.rename(columns=dict(zip(bests.columns,OPS)), inplace=True)
bests_max = bests.max(axis=1); bests_max.name = 'bests max'
bests_avg = bests.mean(axis=1); bests_avg.name = 'bests avg'
#bests = bests.join(bests_max).join(bests_avg)
bests[::A].plot().set_ylabel('fitness')


Out[155]:
<matplotlib.text.Text at 0x7f3d69651e10>

Évolution de la fitness


In [167]:
nbindis_bests_max = nbindis.join(bests_max).set_index('bests max')
fig, axes = subplots(nrows=2,ncols=2)
for affinity, ax in [(1,axes[0,0]), (10,axes[0,1]), (100,axes[1,0]), (1000,axes[1,1])]:
    ax = nbindis_bests_max[::affinity].plot(ax=ax, title='smoothing = %d' % affinity)
    ax.set_ylabel('nb individuals')
    ax.set_xlabel('fitness')
ax = nbindis_bests_max.cumsum().plot()
ax.set_ylabel('cumul of nb individuals')
ax.set_xlabel('fitness')


Out[167]:
<matplotlib.text.Text at 0x7f3d6912c190>