Test avec des opérateurs de permutation uniforme sur le problème du TSP

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


In [1]:
N=3
A=1000
OPS=['1swap (0)','1swap (1)','1swap (2)','1swap (3)']

Puis quelques routines…


In [2]:
import pandas as pd

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

In [7]:
%%script /Dev/dim/release/application/TSP/tsp -h


>> Loading [benchs/ali535.tsp]
/Dev/dim/release/application/TSP/tsp: 

Usage: /Dev/dim/release/application/TSP/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: /Dev/dim/release/application/TSP/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 /Dev/dim/release/application/TSP/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 l'opérateur de permutation « 1swap » assignés uniformément.
  • 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}$$

Exécution

Nous lançons ici l'algorithme DIM utilisant le problème du TSP avec le jeu de paramètres définis ci-dessus.


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


>> Loading [/Dev/dim/release/application/TSP/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 1swap
island 2
4 2 1swap
island 3
4 3 1swap
end
end
end
end

In [9]:
!head /tmp/tsp_uniform_test_result_monitor_*


==> /tmp/tsp_uniform_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.006,2013-Jul-11 16:50:59.848273,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.011,2013-Jul-11 16:50:59.852569,1,104,0,0,-39276.5,-39276.5,-37488,104,100,39.8,20,20,20.2,100,0,0.2997,0,0,0,37,20,19,24
0,0.014,2013-Jul-11 16:50:59.856350,2,99,0,0,-39096.4,-39096.4,-37298,99,104,51.5,16.1,16.1,16.3,100,0,0.469676,0.2365,0.137368,0.392917,55,24,11,14
0,0.017,2013-Jul-11 16:50:59.859319,3,87,0,0,-39146.5,-39146.5,-37282,87,99,60.8,12.7,13.3,13.2,100,0,0.750252,0.532468,0.283267,0.636845,59,11,14,15
0,0.02,2013-Jul-11 16:50:59.861421,4,89,0,0,-39293.3,-39293.3,-37164,89,87,48.5,10.3,10.7,30.5,100,0,0.927156,0.999871,0.444721,1.05381,41,9,8,29
0,0.023,2013-Jul-11 16:50:59.864991,5,111,0,0,-39112.5,-39112.5,-37319,111,89,38.5,8.4,8.8,44.3,100,0,1.32959,1.19765,0.866523,1.41293,37,12,7,33
0,0.027,2013-Jul-11 16:50:59.868816,6,144,0,0,-39164.9,-39164.9,-37164,144,111,50.5,6.9,7.1,35.5,100,0,1.78251,1.43901,1.245,1.47789,60,9,7,35
0,0.03,2013-Jul-11 16:50:59.871605,7,134,0,0,-39252.9,-39252.9,-36815,134,144,40.2,5.6,6,48.2,100,0,1.95002,1.97795,1.66969,2.01111,52,10,9,73
0,0.034,2013-Jul-11 16:50:59.875878,8,152,0,0,-39033.6,-39033.6,-36815,152,134,31.9,4.7,5.1,58.3,100,0,2.21302,2.20917,1.91189,2.32018,40,7,6,81

==> /tmp/tsp_uniform_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.004,2013-Jul-11 16:50:59.848273,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.009,2013-Jul-11 16:50:59.852583,1,97,0,0,-39315.5,-39315.5,-37164,97,100,20.3,39.8,19.8,20.1,100,0,0,0.3044,0,0,19,37,21,23
1,0.012,2013-Jul-11 16:50:59.856335,2,104,0,0,-39370.2,-39370.2,-37017,104,97,16.2,51.5,15.7,16.6,100,0,0.381053,0.441897,0.321429,0.173043,11,49,18,19
1,0.015,2013-Jul-11 16:50:59.859403,3,132,0,0,-39168.5,-39168.5,-37004,132,104,13.1,60.7,12.4,13.8,100,0,0.85906,0.928702,0.820992,0.58605,13,70,11,10
1,0.017,2013-Jul-11 16:50:59.861440,4,112,0,0,-39159,-39159,-37499,112,132,11,48.1,29.8,11.1,100,0,1.13124,1.0717,1.16369,0.757189,13,66,36,17
1,0.021,2013-Jul-11 16:50:59.864928,5,75,0,0,-39124.6,-39124.6,-37391,75,112,8.8,38.3,43.8,9.1,100,0,1.293,1.34947,1.47622,1.02491,8,47,50,7
1,0.025,2013-Jul-11 16:50:59.868733,6,65,0,0,-39002,-39002,-37271,65,75,7.1,30.6,54.7,7.6,100,0,1.56632,1.56576,1.74406,1.41895,3,30,37,5
1,0.027,2013-Jul-11 16:50:59.871441,7,40,0,0,-39004.1,-39004.1,-37164,40,65,6,24.5,63.1,6.4,100,0,1.89399,1.8541,1.97094,1.48676,3,16,42,4
1,0.03,2013-Jul-11 16:50:59.874080,8,33,0,0,-39172.2,-39172.2,-37591,33,40,4.8,19.6,69.9,5.7,100,0,2.34839,2.00431,2.39814,1.69939,0,9,31,0

==> /tmp/tsp_uniform_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 16:50:59.848273,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.008,2013-Jul-11 16:50:59.854463,1,100,0,0,-39332.9,-39332.9,-37022,100,100,20.3,19.8,39.6,20.3,100,0,0,0,0.2952,0,26,19,38,17
2,0.01,2013-Jul-11 16:50:59.856363,2,104,0,0,-39456.5,-39456.5,-37781,104,100,16.4,15.9,51.4,16.3,100,0,0.348846,0.538947,0.558564,0.180588,13,18,57,12
2,0.013,2013-Jul-11 16:50:59.859359,3,100,0,0,-39391,-39391,-37781,100,104,13.3,12.8,60.5,13.4,100,0,0.816896,0.691891,0.91368,0.397949,10,19,64,11
2,0.015,2013-Jul-11 16:50:59.861453,4,118,0,0,-39068.8,-39068.8,-37004,118,100,30.6,10.4,48.1,10.9,100,0,1.58573,1.11287,1.16564,0.797606,28,12,49,11
2,0.019,2013-Jul-11 16:50:59.865103,5,146,0,0,-39146.4,-39146.4,-37004,146,118,44.1,8.4,38.3,9.2,100,0,1.89916,1.26841,1.41867,1.11327,62,5,45,6
2,0.023,2013-Jul-11 16:50:59.868743,6,111,0,0,-39169.5,-39169.5,-37004,111,146,54.7,6.7,30.8,7.8,100,0,2.17162,1.40372,1.58915,1.42213,75,12,48,11
2,0.026,2013-Jul-11 16:50:59.872418,7,100,0,0,-39019.9,-39019.9,-37344,100,111,63.7,5.3,24.4,6.6,100,0,2.3855,1.41552,1.88972,1.69609,73,5,24,9
2,0.03,2013-Jul-11 16:50:59.875751,8,77,0,0,-39047,-39047,-37128,77,100,70.5,4.4,19.4,5.7,100,0,2.77041,1.45736,2.22916,1.99247,77,4,14,5

==> /tmp/tsp_uniform_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 16:50:59.848318,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.005,2013-Jul-11 16:50:59.853398,1,99,0,0,-39196.5,-39196.5,-37629,99,100,19.8,19.8,20,40.4,100,0,0,0,0,0.2412,22,21,22,35
3,0.008,2013-Jul-11 16:50:59.856346,2,93,0,0,-39061.8,-39061.8,-37629,93,99,15.9,15.7,16.1,52.3,100,0,0.213182,0.38619,0.260909,0.551074,20,13,18,48
3,0.011,2013-Jul-11 16:50:59.859333,3,81,0,0,-39159.9,-39159.9,-37656,81,93,12.7,32.2,13,42.1,100,0,0.42955,1.10156,0.751078,0.823063,5,32,11,45
3,0.013,2013-Jul-11 16:50:59.861402,4,81,0,0,-39298.4,-39298.4,-37451,81,81,10.4,25.7,30.3,33.6,100,0,0.727254,1.34211,1.3572,1.04461,7,25,25,24
3,0.016,2013-Jul-11 16:50:59.864919,5,68,0,0,-39299.2,-39299.2,-37276,68,81,8.2,20.6,43.9,27.3,100,0,1.06855,1.61829,1.63483,1.50875,4,11,44,22
3,0.022,2013-Jul-11 16:50:59.870051,6,80,0,0,-39125.7,-39125.7,-37489,80,68,6.8,16.6,35,41.6,100,0,1.06037,1.71938,1.87507,1.97821,6,14,19,29
3,0.023,2013-Jul-11 16:50:59.871681,7,126,0,0,-39039.3,-39039.3,-37211,126,80,5.4,13.2,28.3,53.1,100,0,1.83643,1.97647,2.14948,2.27256,6,9,25,40
3,0.026,2013-Jul-11 16:50:59.874343,8,138,0,0,-39090.1,-39090.1,-37646,138,126,24.2,10.5,22.7,42.6,100,0,2.6714,2.48559,2.38079,2.65984,35,13,26,52

Data mining

Nous récupérons l'ensemble des résultats générés par l'exécution de l'algorithme dont chaque ligne est indexé par une pair « DateTime » correspondant à la date de l'enregistrement de la ligne dans le fichier de résultat et « migration » correspondant au numéro de migration. Nous créeons également la variable « mig_set » qui correspond à l'ensemble des résultats utilisant uniquement comme indice « migration ».


In [18]:
data_set = [pd.read_csv('/home/candan/Dev/dim/release/application/TSP/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 [19]:
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[19]:
<matplotlib.text.Text at 0x7fba3f5d6090>

Evolution des populations


In [20]:
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[20]:
<matplotlib.text.Text at 0x7fba3ebeed90>

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


Out[21]:
{'boxes': [<matplotlib.lines.Line2D at 0x7fba3f204910>,
  <matplotlib.lines.Line2D at 0x7fba3f359ed0>,
  <matplotlib.lines.Line2D at 0x7fba3eb35b50>],
 'caps': [<matplotlib.lines.Line2D at 0x7fba3ee5f410>,
  <matplotlib.lines.Line2D at 0x7fba3eb2c0d0>,
  <matplotlib.lines.Line2D at 0x7fba3ebd4ed0>,
  <matplotlib.lines.Line2D at 0x7fba3f359fd0>,
  <matplotlib.lines.Line2D at 0x7fba3ec39190>,
  <matplotlib.lines.Line2D at 0x7fba3ec39950>],
 'fliers': [<matplotlib.lines.Line2D at 0x7fba3eada1d0>,
  <matplotlib.lines.Line2D at 0x7fba3ec1b0d0>,
  <matplotlib.lines.Line2D at 0x7fba3efb36d0>,
  <matplotlib.lines.Line2D at 0x7fba3eb65990>,
  <matplotlib.lines.Line2D at 0x7fba3ec3f210>,
  <matplotlib.lines.Line2D at 0x7fba3f479590>],
 'medians': [<matplotlib.lines.Line2D at 0x7fba3f204b50>,
  <matplotlib.lines.Line2D at 0x7fba3ec4ac90>,
  <matplotlib.lines.Line2D at 0x7fba3ec3fd90>],
 'whiskers': [<matplotlib.lines.Line2D at 0x7fba3f2a16d0>,
  <matplotlib.lines.Line2D at 0x7fba3eae9c90>,
  <matplotlib.lines.Line2D at 0x7fba3ec1b750>,
  <matplotlib.lines.Line2D at 0x7fba3ec1bf10>,
  <matplotlib.lines.Line2D at 0x7fba3eb2fb50>,
  <matplotlib.lines.Line2D at 0x7fba3eb7f390>]}

In [22]:
nbindis.describe()


Out[22]:
1swap (0) 1swap (1) 1swap (2)
count 2678.000000 2678.000000 2678.000000
mean 94.795743 190.877894 14.326363
std 104.685257 108.430703 26.053584
min 2.000000 0.000000 0.000000
25% 10.000000 106.000000 5.000000
50% 15.000000 277.000000 7.000000
75% 153.000000 284.000000 9.000000
max 298.000000 295.000000 122.000000

Évolution des solutions


In [23]:
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[::].plot().set_ylabel('fitness')


Out[23]:
<matplotlib.text.Text at 0x7fba3f494a50>

Évolution de la fitness


In [17]:
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[17]:
<matplotlib.text.Text at 0x7fba3f1dac90>

In [17]: