From 37dedb86ee69b0d3e385dab5ba0269d5d5abef56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Garc=C3=ADa=20Rodr=C3=ADguez?= Date: Sun, 9 Apr 2017 13:12:13 +0200 Subject: [PATCH] Bug Fixing, minor enhancements (and packaging projects upgrades to R2017a) Bug Fixing: #24 Sim fails when using divide-conquer method #25 tsphopfieldnet fails if coordinates are missing, but distance matrix is available Enhancements: #26 Code cleanup #27 Change interface from generichopfieldnet to hopfieldnet Updating release notes. Upgrading to MATLAB R2017a (App and Toolbox packaging projects). --- +Test/test_tsphopfieldnet.m | 77 +++++++++++++++++- @tsphopfieldnet/sim.m | 2 +- @tsphopfieldnet/tsphopfieldnet.m | 3 +- Hopfield Net TSP solver.prj | 18 ++-- Hopfield Network Toolbox.prj | 51 +++++++----- help/html/Example_tspDivideConquer.html | 24 +++--- help/html/Example_tspDivideConquer.png | Bin 4440 -> 4445 bytes help/html/Example_tspDivideConquer_01.png | Bin 42401 -> 42623 bytes help/html/Example_tspReducingC.html | 38 +++++---- help/html/Example_tspReducingC.png | Bin 4563 -> 4549 bytes help/html/Example_tspReducingC_01.png | Bin 22250 -> 22943 bytes help/html/Example_tspReducingC_02.png | Bin 50377 -> 50450 bytes help/html/Example_tspReducingC_03.png | Bin 43498 -> 43466 bytes help/html/Example_tspSaddlePoint.html | 10 +-- help/html/Example_tspUsingCoords.html | 24 +++--- help/html/Example_tspUsingCoords.png | Bin 2824 -> 2796 bytes help/html/Example_tspUsingCoords_01.png | Bin 12824 -> 12880 bytes help/html/Example_tspUsingCoords_02.png | Bin 20409 -> 20411 bytes help/html/Example_tspUsingDistance.html | 16 ++-- .../html/Example_tspUsingRegularPolygons.html | 24 +++--- help/html/Example_tspUsingRegularPolygons.png | Bin 2317 -> 2323 bytes .../Example_tspUsingRegularPolygons_01.png | Bin 9775 -> 9833 bytes .../Example_tspUsingRegularPolygons_02.png | Bin 15784 -> 15807 bytes help/html/Example_tspUsingTSPLIB.html | 26 +++--- help/html/Example_tspUsingTSPLIB.png | Bin 4679 -> 4688 bytes help/html/Example_tspUsingTSPLIB_01.png | Bin 22250 -> 22943 bytes help/html/Example_tspUsingTSPLIB_02.png | Bin 44712 -> 44640 bytes help/html/chn_TSP_APP.html | 4 +- help/html/chn_about.html | 4 +- help/html/chn_concepts.html | 4 +- help/html/chn_product_page.html | 4 +- help/html/chn_release_notes.html | 18 +++- help/html/chn_system_requirements.html | 4 +- help/html/chn_users_guide.html | 4 +- help/html/chn_users_guide_TSP.html | 4 +- help/html/chn_users_guide_hopfieldnet.html | 4 +- ...chn_users_guide_howToUseCreateOptions.html | 4 +- help/html/chn_users_guide_improve.html | 4 +- help/html/chn_users_guide_improveHybrid.html | 4 +- help/html/chn_users_guide_tsplib.html | 4 +- help/html/helpsearch-v3/_s.cfe | Bin 268 -> 0 bytes help/html/helpsearch-v3/_s.cfs | Bin 50799 -> 0 bytes help/html/helpsearch-v3/_s.si | Bin 255 -> 0 bytes help/html/helpsearch-v3/_x.cfe | Bin 0 -> 268 bytes help/html/helpsearch-v3/_x.cfs | Bin 0 -> 54406 bytes help/html/helpsearch-v3/_x.si | Bin 0 -> 255 bytes help/html/helpsearch-v3/segments.gen | Bin 20 -> 20 bytes help/html/helpsearch-v3/segments_t | Bin 81 -> 0 bytes help/html/helpsearch-v3/segments_y | Bin 0 -> 81 bytes help_source/chn_release_notes.m | 14 +++- 50 files changed, 265 insertions(+), 128 deletions(-) delete mode 100644 help/html/helpsearch-v3/_s.cfe delete mode 100644 help/html/helpsearch-v3/_s.cfs delete mode 100644 help/html/helpsearch-v3/_s.si create mode 100644 help/html/helpsearch-v3/_x.cfe create mode 100644 help/html/helpsearch-v3/_x.cfs create mode 100644 help/html/helpsearch-v3/_x.si delete mode 100644 help/html/helpsearch-v3/segments_t create mode 100644 help/html/helpsearch-v3/segments_y diff --git a/+Test/test_tsphopfieldnet.m b/+Test/test_tsphopfieldnet.m index b09ea24..cbd9435 100644 --- a/+Test/test_tsphopfieldnet.m +++ b/+Test/test_tsphopfieldnet.m @@ -125,6 +125,16 @@ function createOptions_simFcnNotChar_Errors(testCase) function createOptions_simFcnNotValid_Errors(testCase) verifyError(testCase, @()tsphopfieldnet.createOptions('simFcn','yanez-talavan'),'tsphopfieldnet:invalid_value'); end + function createOptions_simFcnTalavanYanez(testCase) + options = tsphopfieldnet.createOptions('simFcn','talavan-yanez'); + net = tsphopfieldnet(4, 1e-5, options); + verifyTrue(testCase, strcmp(getSimFcn(net),options.simFcn)); + end + function createOptions_simFcnDivideConquer(testCase) + options = tsphopfieldnet.createOptions('simFcn','divide-conquer'); + net = tsphopfieldnet(4, 1e-5, options); + verifyTrue(testCase, strcmp(getSimFcn(net),options.simFcn)); + end function train_trainFcnIsTrainty_WorksFine(testCase) import matlab.unittest.constraints.IsEqualTo; @@ -189,6 +199,37 @@ function sim_simTalavanYanezOutputWithPolygon_sumsN(testCase) verifyEqual(testCase, sum(sum(V)), networkSize); end + function sim_simDivideConquerOutputWithPolygon_hasOne1perRow(testCase) + rng(2); + options = tsphopfieldnet.createOptions('simFcn','divide-conquer'); + networkSize = 6; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyTrue(testCase, all(sum(V,2) == 1)); + end + function sim_simDivideConquerOutputWithPolygon_hasOne1perCol(testCase) + rng(2); + options = tsphopfieldnet.createOptions('simFcn','divide-conquer'); + networkSize = 6; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyTrue(testCase, all(sum(V,1) == 1)); + end + function sim_simDivideConquerOutputWithPolygon_sumsN(testCase) + rng(2); + options = tsphopfieldnet.createOptions('simFcn','divide-conquer'); + networkSize = 6; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyEqual(testCase, sum(sum(V)), networkSize); + end + function sim_simTalavanYanezOutputWithBerlin52_hasOne1perRow(testCase) rng(2); problem = tsplib({'berlin52'}); @@ -221,7 +262,41 @@ function sim_simTalavanYanezOutputWithBerlin52_sumsN(testCase) train(net); V = sim(net); verifyEqual(testCase, sum(sum(V)), networkSize); - end + end + + function sim_simDivideConquerOutputWithBerlin52_hasOne1perRow(testCase) + rng(2); + problem = tsplib({'berlin52'}); + options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','divide-conquer'); + networkSize = problem.nCities; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyTrue(testCase, all(sum(V,2) == 1)); + end + function sim_simDivideConquerOutputWithBerlin52_hasOne1perCol(testCase) + rng(2); + problem = tsplib({'berlin52'}); + options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','divide-conquer'); + networkSize = problem.nCities; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyTrue(testCase, all(sum(V,1) == 1)); + end + function sim_simDivideConquerOutputWithBerlin52_sumsN(testCase) + rng(2); + problem = tsplib({'berlin52'}); + options = tsphopfieldnet.createOptions('coords',problem.coords,'type',problem.type,'simFcn','divide-conquer'); + networkSize = problem.nCities; + C = 0.1; + net = tsphopfieldnet(networkSize, C, options); + train(net); + V = sim(net); + verifyEqual(testCase, sum(sum(V)), networkSize); + end function reinit_netObjectAlreadySimulated_WorksFine(testCase) import matlab.unittest.constraints.IsEqualTo; diff --git a/@tsphopfieldnet/sim.m b/@tsphopfieldnet/sim.m index 16cf34e..930f43f 100644 --- a/@tsphopfieldnet/sim.m +++ b/@tsphopfieldnet/sim.m @@ -480,7 +480,7 @@ % Backing up distances aux_d = net.cities.d; - [net.cities.d, neighbours] = tsphopfieldnet.neighbourDistance(net, p_or_tau); + [net.cities.d, neighbours] = neighbourDistance(net, p_or_tau); % Starting point close to saddle point if nargin < 2 diff --git a/@tsphopfieldnet/tsphopfieldnet.m b/@tsphopfieldnet/tsphopfieldnet.m index f4cba52..d7b2921 100644 --- a/@tsphopfieldnet/tsphopfieldnet.m +++ b/@tsphopfieldnet/tsphopfieldnet.m @@ -48,7 +48,8 @@ net.trainParam.C = C; - if size(net.cities.coords,1) ~= net.trainParam.N + if (~isempty(net.cities.coords) && size(net.cities.coords,1) ~= net.trainParam.N) || ... + (isempty(net.cities.coords) && size(net.cities.d,1) ~= net.trainParam.N) error('Mismatch between number of coordinates, distance matrix and neurons'); end diff --git a/Hopfield Net TSP solver.prj b/Hopfield Net TSP solver.prj index c02650d..b30b19e 100644 --- a/Hopfield Net TSP solver.prj +++ b/Hopfield Net TSP solver.prj @@ -1,5 +1,5 @@ - + Hopfield Net TSP solver Lucas García Rodríguez lucasgarciarodriguez@ucm.es @@ -26,11 +26,11 @@ Find more information in the documentation of the toolbox or in the <a href=" 19 - 9.0 - 10.2 + 9.2 + 11.1 - E:\Users\Lucas\Documents\Math\PhD\sandbox\hopfield_network\trunk\code + E:\Users\Lucas\Documents\GitHub\HopfieldNetworkToolbox d605def3-3010-4890-ac40-cf704be9aed1 @@ -338,16 +338,17 @@ Find more information in the documentation of the toolbox or in the <a href=" - E:\Users\Lucas\Documents\Math\PhD\sandbox\hopfield_network\trunk\code + E:\Users\Lucas\Documents\GitHub\HopfieldNetworkToolbox - C:\Program Files\MATLAB\R2016a + C:\Program Files\MATLAB\R2017a + @@ -369,6 +370,11 @@ Find more information in the documentation of the toolbox or in the <a href=" true + + + true + + false diff --git a/Hopfield Network Toolbox.prj b/Hopfield Network Toolbox.prj index e89c5cb..6582833 100644 --- a/Hopfield Network Toolbox.prj +++ b/Hopfield Network Toolbox.prj @@ -1,5 +1,5 @@ - + Hopfield Network Toolbox Lucas García Rodríguez lucasgarciarodriguez@ucm.es @@ -9,9 +9,18 @@ ${PROJECT_ROOT}\help\html\hopfieldnet.png 1.1.2 ${PROJECT_ROOT}\Hopfield Network Toolbox.mltbx - - - + + MATLAB + Statistics and Machine Learning Toolbox + + + 1 + 19 + + + 9.2 + 11.1 + 9468a56e-2dfa-48c1-b681-f168f0815c88 % List files contained in your toolbox folder that you would like to exclude @@ -45,35 +54,35 @@ BuildInstructions.m <exampleCategory name="Solving the Traveling Salesman Problem using Hopfield Networks"> <example name="Solving the TSP with cities in Polygon Vertices" type="html"> <file type="source">/help/html/Example_tspUsingRegularPolygons.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspUsingRegularPolygons.m</file> + <file type="main">/help/Example_tspUsingRegularPolygons.m</file> <file type="thumbnail">/help/html/Example_tspUsingRegularPolygons.png</file> <file type="image">/help/html/Example_tspUsingRegularPolygons_01.png</file> <file type="image">/help/html/Example_tspUsingRegularPolygons_02.png</file> </example> <example name="Solving the TSP with TSPLIB cities" type="html"> <file type="source">/help/html/Example_tspUsingTSPLIB.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspUsingTSPLIB.m</file> + <file type="main">/help/Example_tspUsingTSPLIB.m</file> <file type="thumbnail">/help/html/Example_tspUsingTSPLIB.png</file> <file type="image">/help/html/Example_tspUsingTSPLIB_01.png</file> <file type="image">/help/html/Example_tspUsingTSPLIB_02.png</file> </example> <example name="Solving the TSP provided the problem's coordinates" type="html"> <file type="source">/help/html/Example_tspUsingCoords.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspUsingCoords.m</file> + <file type="main">/help/Example_tspUsingCoords.m</file> <file type="thumbnail">/help/html/Example_tspUsingCoords.png</file> <file type="image">/help/html/Example_tspUsingCoords_01.png</file> <file type="image">/help/html/Example_tspUsingCoords_02.png</file> </example> <example name="Solving the TSP provided the distance matrix" type="html"> <file type="source">/help/html/Example_tspUsingDistance.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspUsingDistance.m</file> + <file type="main">/help/Example_tspUsingDistance.m</file> <file type="thumbnail"/> </example> </exampleCategory> <exampleCategory name="Improving Hopfield Network performance when applied to the TSP"> <example name="Reduce the free parameter C" type="html"> <file type="source">/help/html/Example_tspReducingC.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspReducingC.m</file> + <file type="main">/help/Example_tspReducingC.m</file> <file type="thumbnail">/help/html/Example_tspReducingC.png</file> <file type="image">/help/html/Example_tspReducingC_01.png</file> <file type="image">/help/html/Example_tspReducingC_02.png</file> @@ -81,12 +90,12 @@ BuildInstructions.m </example> <example name="Appropriate starting point" type="html"> <file type="source">/help/html/Example_tspSaddlePoint.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspSaddlePoint.m</file> + <file type="main">/help/Example_tspSaddlePoint.m</file> <file type="thumbnail"/> </example> <example name="A Divide-and-Conquer Scheme" type="html"> <file type="source">/help/html/Example_tspDivideConquer.html</file> - <file type="main">E:/Users/Lucas/Documents/MATLAB/Add-Ons/Toolboxes/Hopfield Network Toolbox/code/help/Example_tspDivideConquer.m</file> + <file type="main">/help/Example_tspDivideConquer.m</file> <file type="thumbnail">/help/html/Example_tspDivideConquer.png</file> <file type="image">/help/html/Example_tspDivideConquer_01.png</file> </example> @@ -98,17 +107,16 @@ BuildInstructions.m ${PROJECT_ROOT}\help\info.xml + - - - + - E:\Users\Lucas\Documents\Math\PhD\sandbox\hopfield_network\trunk\code + E:\Users\Lucas\Documents\GitHub\HopfieldNetworkToolbox ${PROJECT_ROOT}\@hopfieldnet @@ -118,8 +126,7 @@ BuildInstructions.m ${PROJECT_ROOT}\@tsplib ${PROJECT_ROOT}\help ${PROJECT_ROOT}\Hopfield Net TSP solver.mlappinstall - ${PROJECT_ROOT}\Phase1_PossibleSaddlePoint - ${PROJECT_ROOT}\ReleaseNotes.txt + ${PROJECT_ROOT}\LICENSE ${PROJECT_ROOT}\setup_TSPLIB.m ${PROJECT_ROOT}\TSPFiles @@ -127,16 +134,17 @@ BuildInstructions.m - E:\Users\Lucas\Documents\Math\PhD\sandbox\hopfield_network\trunk\code\Hopfield Network Toolbox.mltbx + E:\Users\Lucas\Documents\GitHub\HopfieldNetworkToolbox\Hopfield Network Toolbox.mltbx - C:\Program Files\MATLAB\R2016a + C:\Program Files\MATLAB\R2017a + @@ -158,6 +166,11 @@ BuildInstructions.m true + + + true + + false diff --git a/help/html/Example_tspDivideConquer.html b/help/html/Example_tspDivideConquer.html index 5919b8c..972d3ba 100644 --- a/help/html/Example_tspDivideConquer.html +++ b/help/html/Example_tspDivideConquer.html @@ -6,7 +6,7 @@ Improving Hopfield Network performance using a Divide-and-Conquer scheme

Improving Hopfield Network performance using a Divide-and-Conquer scheme

In order to improve the performance of this heuristic technique, a Divide-and-Conquer strategy based on two phases is proposed. The first phase involves linking cities with the most neighbors to define a set of chains of cities and, secondly, to join these with isolated cities to define the final tour. Both problems are solved by mapping the two TSPs onto their respective CHNs.

Contents

TSPLIB problem and network parameters

rng(6); % For reproducibility
+  

Improving Hopfield Network performance using a Divide-and-Conquer scheme

In order to improve the performance of this heuristic technique, a Divide-and-Conquer strategy based on two phases is proposed. The first phase involves linking cities with the most neighbors to define a set of chains of cities and, secondly, to join these with isolated cities to define the final tour. Both problems are solved by mapping the two TSPs onto their respective CHNs.

Contents

TSPLIB problem and network parameters

rng(6); % For reproducibility
 

TSPLIB Problem:

problem = tsplib({'berlin52'});
 

Number of cities:

N = problem.nCities;
 

Free parameter C:

C = 0.00001;
-

Creating the tsphopfieldnetwork object using the Divide-and-Conquer simulation method

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',...
+

Creating the tsphopfieldnetwork object using the Divide-and-Conquer simulation method

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',...
     problem.type,'simFcn','divide-conquer','tau',2);
 net = tsphopfieldnet(N,C,options);
-

Training the network

The default training algorithm is trainty

train(net);
-

Simulating the network

The simulation is using the algorithm is divide-conquer

sim(net);
-

Visualizing results

getResults(net)
+

Training the network

The default training algorithm is trainty

train(net);
+

Simulating the network

The simulation is using the algorithm is divide-conquer

sim(net);
+

Visualizing results

getResults(net)
 plot(net);
 
 ans = 
 
-        compTime: 0.4148
-          energy: [1x466 double]
+  struct with fields:
+
+        compTime: 0.4183
+          energy: [1×466 double]
         exitFlag: 1
     itersReached: 466
-            time: [1x466 double]
+            time: [1×466 double]
       tourLength: 9201
        validPath: 1
-      visitOrder: [1x52 double]
+      visitOrder: [1×52 double]
 
-
Wh})ISXXZ+TO5^YxwA509REiw!gA==6YR`CiBjTv{SB zGi9Be?Ck95ucFtPIS{ZA$!Vqa>EIwxP;AB!SlHS%t|eXJboZ0l+DpxM``Z5(ZXTkr z_N)in4I(Uvn9Je%c)0-t#(zGYlEi{!XdjOwW7SdDYMA*9RS15xc)IVM~}p)d37h_{|lK|@$u_y=r ztN0o(S7=epv8+}S?wB$kMoWw+$!cv|FKJ+!At@Q%Lw;uqaEq(Cow2MDikBmt*IK}A zB~pM%P;jNQGjMxF7=6JNRgT;PBjb*=*ZxH4d8wHX;&E3a5Q3|zSvBQ6=5~(1zexz0 zt!lqta!;9XQ&4CEjJ)}dpp3PKl|yhT6X>fJ{tUzyuC4^|@O;b5^{hr;@1lj-CjF+E zHuP^avID+qmZaD#K3mIE=DmdtXJFzXt{cWGR+R=tWkpIO!tQpWVnHuG5!XN;+i+Ql z?)obinS*?UPeD3v!8kN+TU|u$Ck#l!cYzcYD;S`|i#{r7h_K{1^_+GJiVT!g34@Cb z$^}ZkAg|8IWd8VZvM*-K%R?JTXQ6QYUXDOK%?FPRd*K0LBOo<8^uB9WPuGwla&^IX zt-CVxVztk@o&K4-uORi?&Cqb+X61#I**3M3#pL#M1+>LF*_@W%-%L~gN+tc+cYRvL z8ZfRR^>H08aCIr*#^oCqUw$tXBkb+teE;GQgY}0knHe9l3bANDU2T_!>fM<7rKJae z9ne2SAMujat)`E_Swv(MN9Db&8-@zNvr@HYn_FhH@! z;MmL8>2=ToIYWTAx2ube)xJUsYV}>cRnPZ;cwAs5HFe>d{awcjB@HJSlLH6%`dhRP5`-#?8&m&i)g04+w@w zOAssu?Mzl3l(KwaY001_56~W}XkU=8xM}M?Hdj|;@lw$i2?+^-$0q=oYkq$0+Tpki zeWF%BQ5N`juMq2XcvFnrxN90jNoB$eIHuF6@?%iLX4ik)0ZUaN&r?xUY>ie_F8Di> z0T$mY#2%wpAY(%=A*@4FA>&~&@*~7fj4>4veqi#Os~kWh%Nd6EDky)|k--}Sw8>N? zlkt=o+hb(264;toISiU`ic=*kZq5Me@mTK>_J8Jm4N+4&4@2ivR)WuQhY|PUEkGmU z(r*4mIxbr=9~09SD@7_m$K!r{Hkz5};#$}Kcy2Q|u$X0O4(TW?zY@9_=EC?m>it@9ODwJ?NkQ ze-tMS2U>P8f~DoJLPpcJep$^F=H)Q}746@@lX-b^+}w4`pC>pB9IZ5_?VInG?=CU{ zh0Nji_y)rE_AMeh>Dj}Hi@mW7W%%Wo@Cz~M&;YuXw0d1Z2gCyXDEP&_UkKj3c>}sD z{A_4oWnsC#zRu#Z)dh4}I>tN894HWXj?KT2ghXDt?_d{uwURe~Y`(dBoICmY2j^a2 z7&aoJj9rf6$=<{7f)vux5t!HgI-q907@IslThW;h$5q0q;s5LHs-mjuzWtGw2Bo`{ z77=L#q`N^J>9`M>?0kzt+)grq;~`Hldoj z5+Qgy$swCdIg@X0KgJ3jrx80cofN&9^F~kgdZKXVplE^ey{`cM2T*+UKhs(6s8Wqr+?fy`D=NHz4EU``4{W}kI5-d>z(!^EOL*;z(;7HhY)cm4hrC+w+Wn>n z?iz}XfwgW7?AWDccnJA=6EqiO>I+xwxw)nao02veH*D*K!1uy~DPB2KmI##l_jyHE zR%=$8$DI)LC(i`zZjP+U%8I8fIJ5p{C6th8Lh^4EZ?^`9U#SRANl;H<>1B*7G9ZUrByKjGijI(f298Q z(ZRtu>;=ZnJ&fRBC7fTQA@fH9X{b#lkDp15HRDwYSl(QhFG^7GwL-l(WTmxq6S0}SS)AJG#0=zuZrdcxE~d5LGFtj^qQWcf zCgGbL+M&Y!{&QK5L#@#G_=e>qi@z&Ao0ymv46!g$E`tV7A;i+k%E*YonKa~}BO)S( zCGU=6$C$0)IjFYAOMgi{IM@iai(NU>cSgzY*6>q%7tyuMGTXAVQ{H)ifo-oofnzp@ zF2;z3hH(7zMX7iCD}m~&9f;@TgmMn68x&cp!yzX<2OaTCW=j4f@z>qOuTFK4 z!FEScxbGZPm_F*6eVQDKas>^eQuuu<{nC6?Ol&OKEfZ==N=kC_U|BGq-=1zp-SUZv zA$D_f16V*M$$+RWo{wn%pND!+;(u$>jdgTZh|(#ygxd8;c$`Z}oT5IdQ-k1gW!Rmi zmtR>*tm*l#+uAYQ*5JJI>J1_ButiBQAqrPWs;~>8r2hkb3e={ZWxr0H64-7WAJ?Ya zWv7qUx;=KRI_!WIAqCcyG5PGdFb>gqKUsV>0fGIZ4-Jse$4Th{eX5JkhY$OI{vdq7 z;0E!}$$=ACNOwdt<=_{#FXd8hxisY;nx*=i+(JReq^ADL$Y`&?XCw$bhHrNV2Q~$m zc_UwtR#p<@kdm&U0m6Z{GBRzYPr5sz!MpLD;U{iUQBTlfg*lXhf&wgT zfPE~0kf+f`y}nG3_!EeD?MO0R=x_2tx+TEhUxt;>!uDNaqFyBkCd9?{Axw9cP$3)y zE4H)VT+W>m zKS1Mb*wkGz;a~I3I6jztxB;?Cu$wlrS2|XZnfxDGVVw&H!J4q=!C79~TiFSl??z)K zvp0N6qD8QRq!6o!KC_Q+3YAj-a%||n2aNp~@E37&X zPk@II{QyLg;&I5n6#Q0PLQ9*{b+JZ|O$Cb+v{(gy{|*M8VdkO8BZsFVR2w$5ttO(QQzmZ7#+aXS#_0&3Fa zeV+2s#byf@Bh7iD<#!!LSIWPON70+>h;>Fa2SfcEHD3B&p$kzSAKfyH;lDxyF@|w2Wx2Jl;+=qEr%h5dqC7jw}(&>Mas@GVu%|gCs=KLF=m~ zCcM;|fQ!s$)mIwI@2KTgzo1(hb@bZ+xP9;W7v+reXGlwHXI`3w-m`q zVH6Zc!Xet(GHj96r7;#W+OLjdf7 z(>8_uUAwg)3*S%5wNQdlFg-7iYcpSlra4pccfgwg6o6XM9^K&smzpQ(-yRz~oh8R+ zwdS4a>Qz^!d>@n#Mazr0?n^4^Jl@d)@*mpSdt8{1HUY9>_cdw=&T?`Tec{EkW@eV2 zo*T|%Q8)*@6=1$N^a>TIrMX7O*;$BL7THH42r03JgcQ|&W1%%Y z&C)&W`Kd5)EiJ^{Qq(1f@u7&A+}2H|+5MU|wWoNfcgbY9Le@Iqu|A=V@pC+mzvVNg zDTp!rq7~XV7HA&Mj}txM9P64|lcV>^XPtMMTzP342l%Y*m`s3>*qH%kVP>kl9{yuiKkqCzj@y_Ym19& zYNKCPlg*ZYbQ~ozsFGm4VJ3}m{U2`YQB$qSAK~T$KVg9jBAAk!fFnBSW_x>+?UHle zTnigFYZfMX37yCRkl(e@dQE_o$uE5;e-hL+N zv2z6>EjMLY>OZ+D44xB>PQT?Vrb``gF{BviC8*z_vR-MKohIK6kFD6i;wyFE-i5)E zCATkk3kY-PK*uvN`5GE(09(F_(Fy)>?UQgVId)9&^(4ndCk->grTQ1oC*t}J?+6E< z)(H&Sfv@Y_1knYcK#89^SGWtcK!Um>p%wse{33<9xwQ47|1Qs;0L6$Rp`j7qcz%_{ zh(f|}P##_i{^d(inL&b|8UCW_dBK~sMUDM~f0K`i)H9AoYH7W3j$om;58zT$^K486 z&*0@@P~mPZ1j@(!r-B8L4z$pZY% z^l>TqSnu4?`l)NmV~npiB7ZOK@uNowL~}Elr`Hq?mS9riC&;7&f617h@a*hZ4)M{I zYwAbc1jwVnY!3?|%MGNq88wo>6rF5zRW(UC^PKC#LYVv&V`ry(x2Yuqq!1up0^xD` zYQT>s($b#xSNi$sdw5(y>}*V3(35yu^Nb9_$4kZ#{fBkYvOX6*LxUNV9rpHexz@b) zi&YH`yX@NA+8Bj|^padPqBKsp2z}Ipwd8(7{uUP_OJ17seqpy{Rkc1aZL`)+PLMas z$acdO1@H$nFMABtMUQ#K2x60)M=np4o{Nbdfz&*%U7B$G^2#yoI4Sm2Rn?A8fER+8 zp%!qd^`83p5Gcp;y!Y_|9NI}EO|@|@db?~i$N=2)*r~}`jwmZ@%T_=Y6Wa%6p8l3B zx~`k?3A(@wGc=$q=#ai~?E&ZD%?nt?`j6S+VGW6Qt|Wv zh#e|z3ZM>YnVe2RxFKan7H}I!&I@`E@$^Eh@c4AjOpG}W8f^c8ysV;K6Cdj3D|vbQ z_U+NiwHC-WmGkTJLl>=eRk?8*8!FK@Ga6Shs>;Oo;i-<`NIS|asx0d$pmGOWVz5I(hT7wJ#x*C2~ULS3cBL`hLv z^x*@+)vH3TtFP_Esj)Tw?AMRhSAyHjjaBgo%&r@P)tV85Q_Wz-0)2&8k zukD_W_iwDqABV`hY0`L5V{U$O-%d4psd(h%y z_z|_t$oIx34;WRysR5a&>zy5>q`I=QldAH6Fhh~mZ)5_=*`euIhVuISFbO&m|6*&c z%Q5|$ofXYF5}CHPy6WnxAbAZU5CW7M1xWYB`%E-3K|z=ZU{0en&9+Cz#>UD;P#4%| z@sKN9NL3<*5IeB7~{YICSgqrtFP&)%2 z@LFD4vUD+I2j1y%jw?-T*~l_s0;gIbQ9$10ba5@b%AHH@(fVu&^+PA5|La z>ZW#fT*uOiHLe-z|A53Hm?b}Z_Kbweac#Wf3MxkVY&Ld@^siO+Ga|(|G#RCI8LeYF zCrojIwUpkz)@UNxl|*!Obkx*FkgA8LHM(y(N(DTg2rJ}6NW?8yR@cE-hzhYRFpm=U)Cx=6MYCz30R#H-mAL*S( zj=a;?($WIGr3|@9TKDJAKRI&;P<@2pDUFCLr%4@oecbtfDq>($2RJdLrld^3;JEsd zm7N{w{Tpr<{a5J8{=BdG6&^pOqzJ5`&6Bpyet^OKLyX)rGa(VXDE!*%{t+ z1~x7$8{6S}?FPIU2*vox&WT&Kb6LG`)j7jTNu$X~rpp+1FnJ>WdBH+&~^G_@vG zmB+622b22MwKcFB9CrRu>|*Nnep-8{>-!tbc21Z@*6>owh>iAe_!7#2y#kFUh-GT$&@7IAH9xUK>;qD zN+5=5E3JGsfls`a-P^yXFG9U1^5fx{&LLBr$C~va`rwt-sPQIU}O?6<}WH-26cR-UwllFS8n^_pmE4mNt9yR3Y#uBxg7 zDm^AXwfg+n6`y8Pe}8|^%{DR-*VPB$)>G%cZDeGmZQ2Cv5YSaKl#-G{N}t8L{)mBA znZGEGWWYrWouBWmFOs|!jF>&(GoQ~ckJzicZ)b(C7!wv7JCx88==Up*996eaUIWxsp3O!RfhD*N_sL;)A!` z`k%L)JBb?(dxHigNO)2M%o7Ns+4isxVeq+^<-pZz!fS( z35kg;1gr(3d{s)U8J<_aS*43&6ktQqF)=Z7+G}e?T6j>px}KJSwKNPeCMG7jY)mIj zK1#r;@u>{)^>lZ4E8mFidD=FZlAL@JSyQ}H!=12RuPRClkdaN=$0eg}Z2@yvSmJ{) zoUgL%U?r-jVg%B!s_A&%thC$T*~uQV8gWrmRV5B--Q9&a+~VS5YHDi26B6&|?(Xh) z#Fk=#R8mJE7?ML4)>d51-Cb%lQeR!YytdXekBpf*9vIMIjP6+6E?$|Onj*l(1r}Tg zO_XZhXxzoXZU%Ha5Y_!)kY9RWRK^?ef;<_Q+nLk z*x12TZeHG$62VUPU>{274zy`QLxVZ56*;8XUOLvS)W8c5H2de4$elY(?oCB>UGYIL zI$6$~4~fs7MKKQrC>^kiwPFN@d7GV41l$M6!qMpe4_zUj;V0$I7sf&c&j diff --git a/help/html/Example_tspReducingC.html b/help/html/Example_tspReducingC.html index f8a6ce1..cdc0935 100644 --- a/help/html/Example_tspReducingC.html +++ b/help/html/Example_tspReducingC.html @@ -6,7 +6,7 @@ Improving the convergence of the Hopfield Network applied to the TSP by reducing the parameter C

Improving the convergence of the Hopfield Network applied to the TSP by reducing the parameter C

In this section, you will be able to see how the convergence of the Hopfield Network is improved when reducing the free parameter C. Note that this had been proved experimentaly but there was no analytical proof until [ref].

Contents

TSPLIB problem and network parameters

seed = 10;
+  

Improving the convergence of the Hopfield Network applied to the TSP by reducing the parameter C

In this section, you will be able to see how the convergence of the Hopfield Network is improved when reducing the free parameter C. Note that this had been proved experimentaly but there was no analytical proof until [ref].

Contents

TSPLIB problem and network parameters

seed = 10;
 rng(seed); % For reproducibility
 

TSPLIB Problem:

problem = tsplib({'berlin52'});
 

Number of cities:

N = problem.nCities;
 

Free parameter C:

C = 1e5;
-

Creating the tsphopfieldnetwork object with value of C 'big'

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',problem.type);
+

Creating the tsphopfieldnetwork object with value of C 'big'

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',problem.type);
 net1 = tsphopfieldnet(N,C,options);
 

Data coordinates (cities) can be visualized before training takes place:

plot(net1);
 
Warning: Simulation has not taken place yet. Use 'sim(net)' to simulate your
 network. 
-

Training the network

The default training algorithm is trainty

train(net1);
+

Training the network

The default training algorithm is trainty

train(net1);
 

Results of the training phase. Network parameters

getTrainParam(net1)
 
 ans = 
 
+  struct with fields:
+
         A: 1.0000e+05
         B: 100003
         C: 100000
@@ -93,22 +95,24 @@
     dUaux: 1716
       rho: 0.0087
 
-

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net1);
-

Visualizing results

getResults(net1)
+

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net1);
+

Visualizing results

getResults(net1)
 plot(net1);
 
 ans = 
 
-        compTime: 0.8826
-          energy: [1x836 double]
+  struct with fields:
+
+        compTime: 0.5900
+          energy: [1×836 double]
         exitFlag: 1
     itersReached: 836
-            time: [1x836 double]
+            time: [1×836 double]
       tourLength: 29725
        validPath: 1
-      visitOrder: [1x52 double]
+      visitOrder: [1×52 double]
 
-

Repeating the tsphopfieldnet network simulation with a smaller value of C

rng(seed); % For reproducibility
+

Repeating the tsphopfieldnet network simulation with a smaller value of C

rng(seed); % For reproducibility
 C = 1e-5;
 
 net2 = tsphopfieldnet(N,C,options);
@@ -121,16 +125,18 @@
 
 ans = 
 
-        compTime: 0.2266
-          energy: [1x220 double]
+  struct with fields:
+
+        compTime: 0.1724
+          energy: [1×220 double]
         exitFlag: 1
     itersReached: 220
-            time: [1x220 double]
+            time: [1×220 double]
       tourLength: 12889
        validPath: 1
-      visitOrder: [1x52 double]
+      visitOrder: [1×52 double]
 
-

Note that not only the solution was improved, but the number of iterations and time to convergence was considerably improved.

e7%m{G%%>)BSp?53Ov6C1b^YdeTREgA6~L?;W;`A zN7*wVvAt?>Q0e7(|NUy%!SHpBT>S^7F;Zb{BntU7_vjk6yQPmn2l@hzM0npP%&}d) zKBOn1l#&Q9>Pg+y6LoY)*`Dxl?Om5B4zi4!pQIa&g)yw&;iZ4OzOt+se($L5g{4-! z&6-J(pPF{6fr7X3#L22wjd214PKF2`HUgnv(43FUti)pPt8^xrOB>M0N(*Ij;j8(KBWY$Bk0H>vG~`knY(%@6PU zf8zKfZ0#m23t9iurBZHl6z6^VoCfY_;@#5s^tkK^xoxS#t~rsYbTB4(H|W;@U-__l z$qsKXYZV_G9%?EaqoW_WoutX{b24nQaWD7kd;Bi9A`G6!3m5F$ImpT$ka<20Jto*iv3Xkior)4|N_ z#6aIO?ea)rfPKRCFO0Qxw>Makp;gXf4qJ1R(X9D;hs1G#j@~wQV$QeETUagA2*+@) zylsm-+#R*`^CWgis&edT=T^GYVeqNmt|tXq+_BebW)o?#qIG{Ts!C37Ds!O9G7Q$V zB)E-@Y)ch;vpK9~X;~}y#sakQ{^69B5iw(A=Qwch?HopmqxS>;Epv|dfcp7H&vh?w zsu41S6U{BKk~c_DwD{JrRzAJAJGTb9j$Qv5&Zf~Q&Tnm-xIN)%--uyFoP6kH~ zk{Dhx5uha?!tvN7`7c>h)YF-1x8y$vaU(%#6R_yzn}84n5)l-_b-nWY z@|VsQc45c{8Ann$PPMQ*gMLdi2^Rt1hQze&Uv%%ABbLNB9EPGf>Y=9%gTYN0B)B?x z-ZhdY`Kd}%bL&$h9UZXJomjvNTXX~o1$Q8l(WiA_;A?X;vzVCg<}}2L@`i_*fuYkO zl+uHO^!cvsjhFFnLRj|dP!{auAy)Qt$(rZB?Q4QMa@~FIl+8$41r(;m81##MevSe~ z12z4tmx0FK&HL1`_;%nq%TA~tW=W~VJ9Q_nnZ=r4o-ka!R_^@moux!-W}}#h@@!;WQ zZSFPS)2 z)q8R<$pFnfm6~z`(t(i_8q{mEx^no3I zh$GMIZ4&`D-VB7F8ZKgUeTG`1cLy3CCv4S=Yl7~-3ZU+zT|l4d-)@XZTd(}7mMkt}Gn}{cqle$H z+WlyM{cQ>fPN3Bdhl+lx;&OXv3E1y)N}kb&F}R`7ss&MCMVQnr;r07da`F_U3%7<} zy!xmEDV|)g;$b52<})Id{}u%$mU5Q+vxDSoJwr2RUpSV6Ff22!p#RS#{T_@mV8lb} zceAm;cxYYSZrksz0hu@A8@jI zD_SAr`5(@FIR^(vVq&7u!Js3%G!ae)hI$yW^@xOah;BtlNJFjny|2K2EEk@)(v$_r zV^it2^!@vM;C=S=DZYza`NmME@Xed+b1fB6EkhVvTN}fri|fqn@DWi2dp~1iX3zW+ z(QH)|+uz-H{<@{`TOFR^SuX)v6}rHtXyGRZ+bpXG8)iZ)*bN*rPyS+7n25j3#mje0 zuAR>YJ{DGEMgNr-%$YQKrk{W&Gx;i~?lU6IiF7!&tgI{?zLqMi1qVmfBEb|6&cLG; zYiFJr*V)|_&cf0UQ!LBkHW()q7hjgFTYigrD%~*AnQ#J+il`32Evn7Xma&3pFeI`t zH;=Lhzr3l*N#W~EL^uO{(S`Z|HvgdHe4KjgsHG*$2PA2BV=*uHH7XoEjxtqIXp^QF z7>Lv!T)%&YaM7#^)}ETQL?3D{8C6X77qhOeVZ*1uu1AYrl*L52xg7)r zVXO9F1~!yhC@wm}9ldYcO3BF>&QQgK0C?{;FC7K~uDI67*p-+Nnebp0#(#Uo6sLD{S{3!tU;4R^7eKiJ+a`*^~j*SS~g4C?gk4_dz z)1R&dnKOJ6tw5*FXU{)-KHb8u5Ysja{v%EXm2u$i+5QGUI$I)g{6{8_U@pv}Q_y^@aA~MbggZ8X zAQ^{O@7s<(eafw8pRG!6*6j>T7hduGVVb&`XmmU)N{f&pKvMiazV&ZjciWhpxrtao zpFPJq?p|r^(inPp^q}g(g$p$`HCNZ7Et(PN*i#x30m6RbGvZT+3yZA2dk8-yD18cy>YnT(V-vfdVISTv9^1{>TcI&Pa-juWq?-OxIMIwML3LExoKh$ki@nyy4125u#t^x(<2UdY^3* zxopO9zc_rCF*7rBaVc|Ek#yGOP*S9+4#HnSnJB;c*F@q;slaT-iP6zFP2b&jmLhU; z!0^(w>IB4Ip4f*cr$DiJE^}#J=ix&j+vUft{E0w@-2QAoW2mLI|LeP~OTe=cR&QHd zTbREX7#PNj($gE~x1d3m!qz2YnErk_IjpR#qDkGG2ZXfDNCJjio`c^VU@dK_-A{V5 zqZBhB$7kYLDc?o$!E5O`FZ`)N$AvX5`!=BU6;o38(t}(r?$DT|Bt2c-@$vB-g{U#x zC)UO-2#KgpKvv&9Nj6^o}drQp3uq(sRD4hot$Y;9=j^EP{9&~^E zriEnZgLHm6d^+P#>uOkRoloPqP-=1%pH6;;PU_9M+7J(A1l8-42KbrY=U>%P$N z8^RN>BqwKewjq!*b4{>+WgyE=RL|G9uIC46iahsLAK2R$e%f8^Owh~MO6bhw0y70^ z50Ar>ql4#}S3>9ZJX0loH(aa0*?DMi5X}XCp4zub$YOmy`ow+;noCemAx6HEc^d%j zuJbw+awU2$qXy7=-sjJsS65fzuJu0JSB)uXRiqAEoG7<{Qa-Wn>ihdw!;c*}q4>&1 zUmQ%1`^<$BRX9vm#^)D){D5bPr9$qIxPSn&qu-ldS(mp#?1OlQG9IG62zlQeQ;rb% z40d*QUS8gu92`vl#>Pf|quOQi-P4n2!A;-yJXz0Bbacvz1qX__B=o%!vur%KC_-!} zzx1u`<>ZKi1OvwC^fcf0^oftJiHV7kQR?5pPenylZa+gUDy6Kfe4LfvPn2AsG&j(~ zZ{p>7Q&5>UmCpx%ejs8>%1lG?-oW&rq9Lg0qFA_Bqv|KaTzOD6Aa#nWpTAT>rHl;qTI7swa~ F{12s6B**{& diff --git a/help/html/Example_tspSaddlePoint.html b/help/html/Example_tspSaddlePoint.html index efee596..6c8b6d0 100644 --- a/help/html/Example_tspSaddlePoint.html +++ b/help/html/Example_tspSaddlePoint.html @@ -6,7 +6,7 @@ Improving the convergence of the Hopfield Network applied to the TSP by choosing a starting point close to the Saddle point

Improving the convergence of the Hopfield Network applied to the TSP by choosing a starting point close to the Saddle point

In this section, you will be able to see how the convergence of the Hopfield Network is improved by choosing a starting point close to the Saddle point of the Energy Function of the associated problem.

Contents

Simulating the network with default starting point

seed = 5;
+  

Improving the convergence of the Hopfield Network applied to the TSP by choosing a starting point close to the Saddle point

In this section, you will be able to see how the convergence of the Hopfield Network is improved by choosing a starting point close to the Saddle point of the Energy Function of the associated problem.

Contents

Simulating the network with default starting point

seed = 5;
 rng(seed); % For reproducibility
 

TSPLIB Problem:

problem = tsplib({'tsp225'});
 

Number of cities:

N = problem.nCities;
@@ -75,12 +75,12 @@
 net1 = tsphopfieldnet(N,C,options);
 

Training the network

train(net1);
 

Simulating the network

sim(net1);
-

Simulating the network with starting point close to Saddle point

net2 = tsphopfieldnet(N,C,options);
+

Simulating the network with starting point close to Saddle point

net2 = tsphopfieldnet(N,C,options);
 V = saddle(net2) + (rand(N) - 0.5)*1e-10;
 invTransferFcn = getSetting(net2,'invTransferFcn');
 U = invTransferFcn(V);
 sim(net2,V,U);
-

Comparing results

getResults(net1,'tourLength')
+

Comparing results

getResults(net1,'tourLength')
 
 getResults(net2,'tourLength')
 
@@ -93,7 +93,7 @@
 
        10930
 
-
Solving the TSP provided the problem's coordinates using Hopfield Network

Solving the TSP provided the problem's coordinates using Hopfield Network

The following example shows how to solve any TSP problem, provided the problem coordinates

Contents

Network parameters

rng(22); % For reproducibility
+  

Solving the TSP provided the problem's coordinates using Hopfield Network

The following example shows how to solve any TSP problem, provided the problem coordinates

Contents

Network parameters

rng(22); % For reproducibility
 

Free parameter C:

C = 0.00001;
-

Creating the tsphopfieldnetwork object

Providing problem coordinates

coords = [0.4000 0.4439;...
+

Creating the tsphopfieldnetwork object

Providing problem coordinates

coords = [0.4000 0.4439;...
           0.2439 0.1463;...
           0.1707 0.2293;...
           0.2293 0.7610;...
@@ -85,11 +85,13 @@
 

Data coordinates (cities) can be visualized before training takes place:

plot(net);
 
Warning: Simulation has not taken place yet. Use 'sim(net)' to simulate your
 network. 
-

Training the network

The default training algorithm is trainty

train(net);
+

Training the network

The default training algorithm is trainty

train(net);
 

Results of the training phase. Network parameters

getTrainParam(net)
 
 ans = 
 
+  struct with fields:
+
         A: 2.9408
         B: 3.0000
         C: 1.0000e-05
@@ -102,22 +104,24 @@
     dUaux: 0.8407
       rho: 0.0592
 
-

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
-

Visualizing results

getResults(net)
+

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
+

Visualizing results

getResults(net)
 plot(net);
 
 ans = 
 
-        compTime: 0.0347
-          energy: [1x93 double]
+  struct with fields:
+
+        compTime: 0.0307
+          energy: [1×93 double]
         exitFlag: 1
     itersReached: 93
-            time: [1x93 double]
+            time: [1×93 double]
       tourLength: 2.6907
        validPath: 1
       visitOrder: [2 10 9 8 7 6 5 4 1 3]
 
-
47MEHQ2Yoa$G6KsP-46U(SI5c0!SU*qf8fc3%3D|?{2jS6cTH3%Z z5N9lc6l|(o&jOFdx=R$?gglS(DV-1evdvQovM4(6%ywTymZUupZ-Y?jMe!r8JGB8ld#3=%%gs!V96dzvXT!fY~%)d%aQbMp9UIk6*8p*E1 zbPip3E{dHpcU$Xqi@Y~wW&py5AB$x-dC73FD{>hx1qBmwtPKzQ7>~Ci38~;@M(C^y zco`L3D0J=__yxUm4q}L)knip%7E6+ca4UzJ}j1XaOOHR3?(KyC?+T+SotV4uV0%11SEyS>Iv$! z^|3FX#{XiG+$!09Nt|6>p>h`o^OVpat13@(VL)3_Z>_4V}&8F7e+28sI9csKx3W6M07yJs#bk@-trQk+Dv%z36Z(@7b!DBQ3vLyPl+`B`8py}cp8 zpa|SuuKvoE0tu(_mHhq~jFa)N;Yzl=fL94ukfg<-!H)eRD@jR7p<~`_3NnYz!b0ixL>1N+IH^#G7q^t$I`W&M5J{a4HzxCNryTF2P)uLdtUN}lMv z0q;z>%uI@ig!CL6J1_vm;I{R1Re}x<4#4Oa7QW^I)0KvivDP%u5ls9xl%io&i&bV) z5iv2WDA|1Std*6Oxw*N-L|n3;eSJJGClr_>FxcKy`6@6yF#EfkD_}Ly@!9+HNbR12 z?~{V>7lY?XP(=R-dGP>pfF%XeU+pU6sMb~iOnUVi^X_m$7@PCaQUbu~%DaiA#Km!0 z4g0^!WfOUv%BhPDye#TMyXinJwx)m4Zqrxzy`v+o{HxD6T}}?01#!5#U7JApFwz-% zeCLDlq2)2&n6-*1L$Bw%N|K5@PXI=YXnGa=Lu)I7qTh(?W zHYYI!18p_XX zc=FWdgjgy#&}a|mTZi@L3v```MR&VdVGM)kFItB;Pm&6qHmlU;(%{81-bX6Uo?`Iu z;Mb<5p+<h68Q!;j75EpmX`(c|mW{QdyMz`2lI{2d6 zZmEYUYT}B7)JD1>XZXFO1S#2{ZUO1Oy7_z=<^}f7iDNhwqF2ATu_!3Ca`Ux+Pxtj@ zSFqT;Ik4N@X=<9Yc#iKKr%P6B_f}{nPImIA1OOXM&CUdF?N2iUz84W-dWV7EW(y0g zC<^&*%aKc*zUwb4G@C2WzKIf>cuGWYbkw2z;vkLJ#loWaOJK_li`UjLMgaQl(Q3p6 zrkuh0`sF2>5;{SfFH_mtaAc%&?)$_+H1|kD=g@)U6IZieIrshn*SDvmPmc=}3(-5f z{GDCufx}r|Pq@z?rQF!yuQ#7A@%0_`^qeP8zM<557_8DzWFWEJbFNOk7>~;vr|iMUnBQ(P zMMhrc$-ki_{p=enDNmj3vG()lpaca29SYh@sPkbn{L0F&`FTy`r$=(MxiIYi3TF9& zN!pm-%>Kc^GTDD=IX#V15E~tnV)#9|XQ(u?*L`{wv^Rwvr}bQIuduZ1VA{_8;$U^p zU0*+aPGj!{VtC(QmhSv1O0VZvh1kfqK|y(&p`z{M)!U56g{7#5L-C7lhu&ajC1^Fc zt^aJ!8z{n~^*#$SDJXh+hVF=p(p&OXVPL{?Yq9lWx-wx(FR9;Yu_b2jxZN)wv{g4k zO3I9k{929UJp^C(bye0vJ3lGuG|suMo}2VD%qR^a`?Vg`2{=jdKy!08+PIe(yk)NU zcOQOlpiyQ0-UP|4@cYOFv}~j@_HzkcCu}gkJazo|c{-m9wNx}Y+1j2*lKOnegOyR8 zx%!PzJG-*S6&7jKU;N7TM||?p9EZ-EUUydj3&emU!WF`k=&uIS1<1(tS}$`N8w(S| zLPd2~yS~@k1x%BOLx^<9iZum=D&7@6*C>8PMoc`ED|Kk}`VHF$kQ32cq=IiK>cKCe zz4|qSLP2reX&JR^zn6{kd}DHlE!*3h=%Wd|cO_W(bHYLu>U31gc8J!Rz)g2YM(!mk zNTQ(78}&VU>&8^p`5LU@e5Dwn5%U^4h}bWhRI(J?Tr&J`3D$IJD) zrH3xBucgvlg0yQ+O+S*w#ZGZ!L#{gymOwmYzHA*zuS)orJKRlkT6oE2yVl}y{Yo~K z6L1HkM!@e}4|&~v;4LaFblWTM9+SN*4WPG6NEF8lD;9<;Q>UXZPypsVGgDk@;?+@p zc{wvJ?YFu*m1mzo0?^ab1MGbbp4Ds(Jv)01K=Ic<=<4dmKZzEjr1TXceTdA_Apvdt z@8t_J#%H*(e=prf_pIW|%gTn=*49eDA}7<w@ztnw6E+ zZdXt4bE(otZDAcSwL)Oz$H&H=;<1VIo}Qf0($bn%uT!PFvltI&jAV<|p2;sO=j7!j z3%p0yt)cUFnZAO}jEyNAvl#EHaChkmvEV+1_Kvp!EOW%ze7dNmMJs!x>FE2D{U(KF z90>`D4UE`#s3LtHH;|>S>EE!KoE(aOe)r_)hza-UO6G{My`5R^5qI zjLgc;4ie8F#gwzLv9YwYl$L&qxxT&*?3lcHjoD;LPmj1dVlU5mc{?&v8+6ZICrF+5 z6-5xN!ufawI3X@lQeD7t{9BZ~KUMBm4N{A^xHwEqO!lx?D=^XGwGhh?+=x_Gp4Tur z*%vjyRT{w2m=YA4u_Rcw;UqVDPQ6|_YWL6h~P%&FsaH-j%DIC!vPc7$y(Y3 z#mBO%bkSSBj}9b?9(|Tj-#2Kv=?4ed=tPSDHA=%Ag^emHo5${G`44bq7pa>tl#~n0 zh6$yk7&7rGs4C5mC^|-0s+2ZvO8t4;H#I_)kN9Jfxv(m`O>I|?QM@l82M-TFFzPe5 zK+qGHl_==cfqD-BPaBhj+pMWgNQZ&h9Vr@t?y{XLXXvGV#~8Fl$_3gQD;X{6@+eSNq6Nm7-D9<`49v4EQ)rOMySPY?em+ESyo zr{tZ5wCO)x0h!2D`XGvgsmUtL&X;D-9UNk2#&!|TqXfVfVCNWH`-g@~op+1ffay2J zo|^;fLdxap>Lu&Mu6^;nxfHOUa$`$#Q|79<(b%Z{@rY%CN*^$@<*PraC@49~{)M(s zWTmFEWXs{c+4=2{B&?$|bhexC>e_&ae8KNn)KH^zxV~=LtKH^m-8ZI>A>Em`yA+SHeGX^}IRecjRZOcxP!@?~+|ZdKw7<%Rf<_ zr#VZO6%SE)GLK)l)w8+5Ax4~n0cOAG0bf}uC6nSnuN0mUfB>_nq|&88$p{%UwY4El z3$L2N-@-}S`G=cYy*|LNvs#om=cLM)*67Zxs(QszVKqs%@fZqyHWJrPk%oSK2{%W= zj1w0NVxkGMZ)sEs$b?+B@ebaiVW=&KEj~^QS0hv9g~0NpyY9%6aeK9Bm2z83Tvs>dKB*{V#vTeP#NW zr+S370#?!R%Z&q^H>`g{FDscTDX@M~(d;rCz2&+3j{fWLn$MpQCglqyGT)96zD1@> z4aWUXE{k$uQVFC_pV#z3un)4?Zn!qe!W=R=l|=2r(a=YaT%Y1D>5bIZ@KaD2!-4*- z`bpS0bnstVfQEt|6jD+_v$9iK@4$h;x3m?!|IE8)3Q!8ZeVYN;Jz&j>U&djzgGSTg zeD;T8%17Z?Cr4IPROHE|)VTcK0Gt<{c1x21e3~qW?)OhJDeUwh!w1wg$OQffa`S^3 zl|N30Q!p+rGC}g6y^0~)$B!Q!4;Kc|AMo+j2!Wcv(ycz^-7QH;gaUbk&ziS>X=wqP6l}nZvb01J9>9CH&963W21)4~IT zLqhEA?DRf<45VgcJOr#cEJuO1@Y}a4HDI6=6#>}4pBX?@VbU`wNc-bgq0XZ8hbR&f zoMZp)PZUw&&l$Bq*2G9fK_LxTmXR!xySqDBmHBi9;M$+b)mqN~`t|GX_R#BH3j2P` z^+5`^!_LuihXrA^T^qPpzFHpH62`f(@2-NHczSrrScKIP}=n6w*WdI0hh zxrw*E0kMrJ5-NeW(-zJ&J_SXc=Zd*1gr5{=8a%p=G?D&^yAW-Kk+`^ZHkiBChy^`& z^$v3g8H(nH01rn+q`|HUM@q$gt=`j<@d?3pj+WlYn+R$TXV~X!QLcrVg5RB2=gTK7 zF(eMWDYHn7z#~u z(cX3w8Jr3aPN6)UT5*Nj_@uBV&E$`;ku49b9}|8k4j0Jfm=M$#+9{|er;If! zC@xa0h_EU#6$06Si{<#>Pd0haq0|^pOd4%0`Fy{q}H&yJ-N%Ueb{J4!lTcz zH76weT*343+^RaP1O5vMsSjm&uCnSa11D*2w2<&nuGji2T#AcO-2&qu1(B^H&A)5m z{fIp;3;En+r?_EDz#gk4s>#UHh(@Q%xpEsAVaa(lynkmoKHd0$Pm4Am_xC47u^Ne5 zPTTJFCxz66Vb=LFQG;ZEvr zwnU7eLZt5ch7!?FVvv$l(EXCsW=n#$ z_G@e3B}Vq%&DQ@e{rR)+_!z&4m|uk$V1PI(uHz^)*g5i`shDBeD+3<2H+Ic8#P=Q@ z1M|h@Be*Z9=BsxLmOHL1YYLSJ1H;gcPi(2O6bny0uMG0?^YJmycGiIghBoHPaz=sI za;~`M+Mo>&fQV`e-||pj12`$uyV{uTA4Cj|;Jr((Few)* zV#)zzVC4tWyLYvE-QTjaugi^${z0HbcdT-d#w8@Yc>Wv-85tOrTKAf7-*$lCUC~uh zQ2}C`VqC(xXZ`UGLbO0%BU~`XckOksz0GC~F=1OlsII86g9e2}L{MSwPul@d`OoF$ z85&wwaPZ9iEh8yOhM2YWA$X>l*;&yO#PHxz=A5FUB9qZPK=8Q$&blvw(P~gnOHuU}_Jd0FJ&O%&a(BQ7he)#z9({R&trJb=e^24Uq+9tgW0Eww9a zxvT?xsa7uZFI(^|N=Q(RJ~#h^F||pxX!g?1%;|dFyYw#}e@^uy0C9!S@jO^SpAD7$ zF-}onH_?B}O*qW#wuUnS`Jkkz_=b&bicECtQOzl>VIMcwgd%{~ax3mJ?)lu#p**)& zo2~czR%TPH>7Lx&rV31M8ft1-FQ+HjGkvR%5+ecGj)aCsLFDS<0%T@M>>#lKY}_Ug zO7R0f3GyjGm{u1jpth2|c{A>d*>U#K4;5G9QFU^anv2{yrbWxK3JT^xG7e=_-JIRf zi)=BoQ`Zi=ArY*RtKWbKUfz*+9ya-xFB(;M1Zj^nO_X@3Xts$TpfLbNbCG_3W7O(- z3z8@zkn@$c{4oXj1ikjRva+&ui84OmPRI&k*^*Vig*uQM%D6BL$`s$7&ziV4`vi8P z#jvpcPWL!xND(zD1<4=yOzGX(K_mDmFfcIu+DVA;!bCZ0&7coYP%2UxDb*Gr+ZoLt z0`mgEkpCckRe_>FK-yJ>q{OP?hb&71Cf|8c3 z6u#5IdBsx3|4mT{icab-&`R` zUcQsG3uOK9NS9M=Y-Ld3pkZXHK<3fM*qRy{$poeoV70HVudzld4Eh}RrUYStR4;8h z`KcGd7atjUv;^pjv#}3OiypPb+5Y%(52=6NVqp7p`45aBYBp>q`?TN?5>9gyufLd! zJz*0Xnz)?tU)7ZZZPNwgu~C93DAYY{Pe5|Qdmh=g9rzF&f2=*U=eCbaMSwz&dm0XLA^t^=*Y5Lpg?f`W26dhn|d@X(81+G9H(mgrQJgBzS2hGQuFeie1!E$r(WV&*l*ei71 zemPktZdlP40=`~2Vc3_Kf9Q2O5}3qFK010aIk97bgLfoSWdELaM6tpQT*Dmq&174V zU4Vw~_Vo$lCl zM^7dxb$te)KtfKY?!0z5uc?MWmAjHRe@EOcNn>x^C7tlj(DV+~m>u_kDgu3NGku{v zd(JTmE1SGO*B9ineJ${a zj{+3Asj*|Dg{G&sXs0oOzvVB=%JkdXv;Rqad!H9h;PV&- zNmN9)y9GC71jMsHH@_EyjK{yhmzR@jX&ubg+$P1J?}ih;Gp$CkYOdaI^FbA8Jzz;X z%#-<1b1l;*`X1ZTDl*br%Jj`=e|Zf8km!gC;|+K!&OaJ3r=?-GP*h^S&rJ};9Eql^ zKR%9v#l|UKg8BOA5-=1E1qx33h8tKTMXGWk&-crE58-O4EWdrqvOds#io*FpZKf(x zQ=)eqO<(a_-q|O$5C6&%Q>+d=0Ose|0%DoDdRH=3^aGDQ6$gvrg}%P|taAALsTtz! zZR)mF0$1@ita3ejzS*SBP30c_mOUGHcYR04ZLD`i5fO_=*N6EO&=-Gahzyb^skln0 zwa8nfaKvi+xDMeX)O8K)9@Qtu$8)Xs(+}2H#~WmlfHHC!H8c!)zK8u9_1(Mt;rG9c zJCDVe5WvIWs*_`X?(X9T{kb^wI5+=LJReWr{l#VDI)E6Rn1$kf_B0Tmk~p^fl`NLN z6h?CU(Euo3fXo$kf)KQfrskQSEI_(A+#MqO{K5&i`nccfb$$B6>jG?fe`4Ygk%xVm z1`!OlIW)O@<_~CpRwVRuG?8TuptL9>d>}6SZ8!BNioQDRqQ6Uml1A0toQ{SzG>CF= z1f{5tUKIED-x#F>V>jaKr>jXxroep!&qq=AdCwd`1Qje`&;Vj}^;=9|UqjPud~{Ui z-x9`#JBB6i&Ma&DI8Gp$R?1fb{AG%!eo4aV@v%n3>75cs&ex)*)Ohy6`T22;L&R`@ zoX>i9bjX)7;sA^SyvMe+#Y|IE6Clr2s3^9+?U{qLn#|52RQmJht7`56YLbj@Z#e!9 z4@PS?YSc~m|G>D-nmPiJ;!9S;we@vXR`xnfbK&ex*e}y#A7okGTx<2!@~`bWOcYd9 zKvSs%RC$VuVc=pQJN)&0ybTQvjj`o23y7xaKYrScN|OQU0TqY(C9*e<3e8*|Aiw_u z#qZWI55;-neQKv3M(_X6 zi(LWnrYH=ow>W?o0#&OYG6vbPb*KI2V}0^6C(v{mivL->6%we@4rab3)y+6cvp+Tljjc49drT57kAv^%* zbHIaR&CQ?X#_I-+{||Ki$Le{YE5R4=d=On*5RzyVKH(9AOks_dKvUF^4c8wCc?oIY z*1F>9WQ+4+u_a}@0 zTS)@!OLmrT*-Od72Wp;2ry-Zf+is^*ayf$U{H(=;N_vQb!oAV$LVM!z5IQMoy8}yi zyekCVSCKn|dQLhra>=zUJWA9r9J5VvMRM7E27Zn@lvHq2|AE%0!B!!`$-pTpjQ!&2 zpb&(^kE`JcBvLU{W#w9DXlPOGEKVQc^s(;g5MbzlBGkdiBm*bMwH21RkC_khWYb zF7}?pq-#4R^-oS89FmgypqLjRTWfYIz+h_o5)&Qm>bN;Q~z)hZE_ z%ub?NLBYY#AI(=%Jbu4QEWoJYTz#VpES5-!qsnUS5>i*BcVJmAQJaH&Aq}}7(5+;i zjaMpsGy5Y!9~+kzBd!6IKhwJMzamPTpSx}J=Vpr)P9-fZEp&$~0(bv|A+|#p0|ngR zZGJgJRLBzpeKy7Pg{`#xn;X=m{sca));sH=FY`psZzqam9!RXYlafv|?O|bC%PDz` zj2O^w{r;rmhoPoBIgjtB zwa(5o@-p;iZ`G%60%EbFB~#?1l1>j7ulJ^<_G~=w2+m1ZS-k+MRcX{$+T;Qrt8Ldz zejgc`3I!d$6`2@3Rm^4QCBJr(K`u6k7v>9OW8qMT!v#=+5%iGLr3q-4PU5GUW}^a> zns_vgJTeTD%v`+uicFBCdPXQcR<$x~qL|0r^%cLTvDyshIVUUY{j||xMd!8c6O`Vh zGA_|6u16V)A8Bb{?|y6-qWYV}@+y1>(*3Tm&vu*WmBx@J05jt~bOQbMc5I?^wN%bX zm3FxW13&*4se}cq26?}S*#d6wAv}E~P+O{`zN@c??y1JglUoakT zVLlt~_}M-M{BJnA`VL%G=Z>pN!q*%Gj&d#^qUhD{U?B|znoVI%f0IJke~ZzJSzbQf z*_nq}4QaC<;R-|2B;(HvShEJB=v{#RA`RY>gp}(Um|i3-^eW=AHL~Lb_L!};dw`Lz z1$t~1l_@1ZV4eZD9?Nc_ad-;82N|u;7<7a1O0XPd$@M}>~XlN)M z4Tx&qD=4t(_e6pmLhzYvIzJy^^1&nGOR=6mH;i+(kj%ym1mX<N`HHuOC1p)`RHH zqyIfKQ-T`3ecJ{U%K}$xSnu8qJ)N*{a?T?pcgJpbNwh@4g#H?%{4UnE{6F)rCGf;T z<Qa9s87`B?{0Y>Aql6)!#agSyR4zM!E$i)mrSGsWwSgFU<2+AI3|XqH zjs_{%x#n1#q}p*3Lf>rjwew;N5Xy2)1I3v6&mLo1mG=e1#4J32=Ts2ThjH|3RUS8& zWmM^*742?zWl}`ezTM0eMgjC^Z4!yk>2wl!-(mzYf_0ZFSShke;4}s)dEqMV-WKnw zW3ZR5;o4BIWwklj`m=AyX-7s_7|`ag>D~g-2tnH*rjCImC5XKxe~w$=HS7&=*i}?Y z&AM~*-R`)dJThUU9`}g{Y)M|(TUr(E2kc9muYa&*W4P&k8DtV3rPr~uxl67IGSU9a zPqsV!m$8bIse80%c4wz(haPmXaxGa*e%rwdROVbOV`Py|rgmo8S*Jxtn!|wzDEyZ^ zz#R9?e{ECqG}26K^rCI{*x`Kc{-AZXs6Bi2^Vp~l{TDHikjDP(S3nagyW zU7@)uTYs<0a=sYQa>r!w(}JR~UT@U*!>Yd{RY4WaY*07>aC4HfufmWPtCo;RNL4Yx zvry<>$Hr^z11a${Ik)@%2T8{7(QVHVe4FiZDnM%;9F(lY{4LEmIo`ATJv@ezz^iBZ zDvR05lE->yFILRM@b8`B*ibxHkQY*;FBmu6b_9t} z83hHm=Z%m?>c+fNH#*+h&>&3oymx?}3Y18d6fB%yywFShhvbF-QfDZVlz7gj`{&s% z2G&0$FPafp1W;FT!y2#qf}5Msu&}O7;p?7t!7bc&G}CG#Qi{%B_wf&!kF%YNF^_9m z{`0BHf&z?id?&L?Lz#%bbuHnZ#L|rXZG*-C#XWie9SNvHnzd@>vpfFSLFiOOz<;xG zck9-x-vR_D9BzUTAt9FR8MWKcm%A5xT$%61gSPIQFGmp~SOzl4zq))LgzjRh#Lb}1 z1@2aW@1^s(1@SR33JAEI%%I`tE!c=HnspQfg|cyF%STC`HB0#A$x&yOF}0qaN`P?$ ze}HEjA5XZxID7;2&fqCgkq?^tN(sq7cXyT>qd=kgH6A?0I*B@Cys&#~;DS%0#!Q9-HNp<%H@2_DMdy&s9mFvF@TW{ius=Wjt_uoH3KxRY@cA_MMmZj_kcz{J1!&MVaD9q*F#CUWciV0Mx>j$_ zRr*^Fvz?P0FD;hYa`$K0A1$EuYJ-_4l`If-a&U}I@c0;>J%+_b>M*|inhS%)+PIz0nerx$q5XSydOwVfW=ni}E-IkDJe zSwJ^2U0}ZQZPbXIEE#mQXqV@4WSmE3w>h@y!JIBTDq5XCk$i$?67HpthQ{iMcWZNV z^PQAKwpp#W_ZL;wQN53rhQ*x)zA*cn%g;%y9D$8VgaV$r?Y;wzP69HpY*CL_3CL); zOMbn68fCSv2(tDz*r=)Tz>^Ud1Iq9FcOkP@Gn4JycfYp#7~S;mKXMbF|4r(%bLrjP zq#ra|=?HzV?T%oyc5=Es>ATt6`}L0BB`{FSO$Jn|tbTsspOBEA&aBrgn_uC0BU@7J zitzc7CUKclO+AGc#%W}~4DJ4LUUGxn=!P3DjwX*{WMDkKTiYp>=l!j|y}iIWCtW`y zRemUw%W!h1D?(a{$-KNyl38lry!(X-g7#CG$90K5)=0`>|I$$SY51^JDE-&|<-k1S=2w0$5Px zR*d)MZuf@{(&=vJ%xoiN62WDB9vd60s$x?Y8&L(SBmnqFY0$%g;8rxdd^{d-8nkgc z^_yStLA7ro+9gfH1wfnrEa%L0ah6sWf*iMM#!-}o$>j*|BL_7l;@M-!Bqa@v#0|rO zk`Jx`=nODap#Gef4KM8Apt%1>@6eFf1}G*0<*%Kcu-Bqas{oJ>yh*m4rUCdR$wG@+ z9;=iJcZJd}X5jk>$kG(J#s80#Bv=kI`sR{JO3&4ur+e3#C3JR@s#EJNG7d_qtTT4j26XSaXvB!i$IdXm# z;w-0bQjDHqc3Qp{dc^V!Vvh)g8mXA5Hde-(L%@*exQL72$Wee+IY1;e}VtI(DUMvD1k^+RkUwW0cKw3Ngb9B_A4U#UEfR`-b+9qK#s8DcRII z9X3=KmwZVnGbmPepmc-a%a<|&;rKR?Ha?)gBt@tB?4O*fXf>}Eo!}G)5(3I+_f=xP}bkOr4$EItO#$44b0^!tyLd#(V4zl$WXjlPlS5iWFKY$m8-sr{$ znIZ@0##+4&D~%Yd7xVtc&i{Ea#b2VTnl$v`zxYa0pc71%gM(CIp!6~WTC>`6UUw8A z&Nu0ejj!Fn&K>uAl}^)S3=nU2Qc|wGzo70tt23Hxxv9ExP>G?dgpLBq@DLXd@BKSm z`4NXF4ODf2|D!sOhd?-eT*T2|)Ag5*{{~t^AbwKe!i9LFAI}QYGBPe!7)SxN>h%Dy zW~S!Fz<_JUF+D70Q$PtdM01Qn?|q`V6ithi4BZwREC zalQH=A=m2)P2#l4I-M!@2K?@GkU;_o6xi=#hFTf|VWI-y?SC-w3q=EfCj=IM(RG(z z9pNzqveB)FQIMBsIGiE4l9`a8EGH*d$^PU81E@A{h{vDMe9g<7%9r@J&30KufGlZ% zr>UtW7iVwL0XDK-CsMq`asF?K>qJ+TAP;v@5ZE?F2gqAjoNSJtaMwCF8Eh^u>oVbX z3TKaOZFK3afHGLt|DhW4KL-1+-~a&NL8uxSh5@Q!Ha9l9Iy;}qX=yD0lVw3b0D-6= zMbv($fcApDDPGX2ki_(&6YAJwaL(KHCU#*ep|fjV{=^? zG%WnDygJ$^667HX;uOGhYan(3f}_5n z;e2m;G}%Y4u^h|^LSE;iP8{HWfkWd(==wNYZ@0NUnh*9GF)aK%rfWWM*9kP(nUlN4 zSBJ&70#!gJ1xiyU0JMXEphBM`+ttND2)1~cxOY~=hDIZT9ZdiT2w+98lU^!N5Cpc> zVDdN*<5*BB|M(+UDq*5j8*I1nM)x}c2gmMy!jz{u*u~>680R&pn^Y>%Z~>cRG#)gB z#Iz-Xx*pjy?z3>716(E@@9{^wOf~)e{RvvG+W=nc2hiBhpAEkUd4LS#InkrhZTolp zSNfWo^A8)_*sOL*#Js8p>TjyDbG=!xY``k1D7ge>d@qg+-YEodKLV3V5cDW0DA?GPlRO3* z=BTJBN=nL=$^djiJQjU%2ZuL2sbJ>{P{ckUVGhEXkLF-+0I(r~wSfU8h7U8SzX#jV zC{bgB@|_TetQ~!GP+PeOevmTrA4_Tjs36d`{kxFR7MfB3RBb=Hx`NXm&mtKz;gXS& z0sbFBkP}q2!(g46!U08CDgot$oYp!$k)%|zsm~BHOG;!56o@#j+f2(<@wy`EDE|XA z_`?VU{0~uEc_Seno+~I^mHmhhBrpDG_$ub0ydT&NKx={NK&RPo3hK8|o;<0P6;F%U zAI=npM@BFD_N`)uSlQ^I+ks&DMJvn;Z0Ul*djz2>4+7g8otApt?t(Edn?d`E4v&S< z{{Jeu{-7r7I7~z~&gp;y&z*M+*i4EE*b&4J*|mmH%C8Q`fS?7_l0hPKqj3ccB15@g zk`ow1Qj`-n*hF?mU=Tn0g%dlRP?IL81mif@>9omUJum%}|JDB8`|f?;eZJr4{eGX% z^E{K24PSgy@*r5A@Tl~vm?$Nx3xjL(%)KX8YyJ3rxZm`d1qzTeFF)%d8y#tDYm?LC zFaLm%m8pSTLDw?+k~~51YSVXo9%ukIdl=R%b4N1G*Oh+uz4BEttO6ke)=Kf*E@N52 zhN{^Kmh%&|&vxu<^q^AhsCls$4}yxKA}e}gbUK~jX(wV=uI0VIl8rpLGu{Yir|!YnZrN~Kb8ipHN$1!XOtn`VSxSoa9DdVj_FQheqhGEUQ>AQM>!U}5Y+q*_-U5QQ&UoISgOa8z#bik&gviWX5M&n zwZq|v$I1wFt!Vz*>`r|}MFkARWthsXt*!7F#<)HHR|_zT+jhXP+GwiNAju<$t6rGu zrg_>HCqF=uK)v4e*Jgdx2jW9uxp|S}?duzh>OoD?e?Z{MFQi3`P)M9^^=Qg>0t9AmKHb#Gv%L$Lm7fF>mNF)K#qsL_*C|a4tj4!KtSdG zJ%pta)dj@ifU7wy?Dy95M+i&kwr%~wso*8ITkjXB6XD$u@)MU|lt3Q_*tlFbgj+?@ ziPI2aF7h&=eF1C%-fkxigK23u5mj?NnUA2T z)Ie_tgt7N^+9%4@RDc+j{5f=8XfWOkmy^|bq53jP8{rMyWadd zh4*l&+K0bUbfW+0;>nJVj@KSE9LxopIj{%t1*-S4c~ Q3W<~6ic8{jvH6vM1BK*G?f?J) diff --git a/help/html/Example_tspUsingDistance.html b/help/html/Example_tspUsingDistance.html index cf90c42..315284b 100644 --- a/help/html/Example_tspUsingDistance.html +++ b/help/html/Example_tspUsingDistance.html @@ -6,7 +6,7 @@ Solving the TSP provided the distance matrix using Hopfield Network

Solving the TSP provided the distance matrix using Hopfield Network

The following example shows how to solve any TSP problem, provided the distance matrix between cities.

Contents

Network parameters

rng(22); % For reproducibility
+  

Solving the TSP provided the distance matrix using Hopfield Network

The following example shows how to solve any TSP problem, provided the distance matrix between cities.

Contents

Network parameters

rng(22); % For reproducibility
 

Free parameter C:

C = 0.00001;
-

Creating the tsphopfieldnetwork object

Providing the distance matrix

d = [.0000 .3361 .3141 .3601 .5111 .5176 .2982 .4564 .3289 .2842;...
+

Creating the tsphopfieldnetwork object

Providing the distance matrix

d = [.0000 .3361 .3141 .3601 .5111 .5176 .2982 .4564 .3289 .2842;...
      .3361 .0000 .1107 .6149 .8407 .8083 .5815 .6418 .4378 .3934;...
      .3141 .1107 .0000 .5349 .7919 .8207 .5941 .6908 .4982 .4501;...
      .3601 .6149 .5349 .0000 .3397 .6528 .5171 .7375 .6710 .6323;...
@@ -82,11 +82,13 @@
 

Number of cities:

N = size(d,1);
 
 net = tsphopfieldnet(N,C,options);
-

Training the network

The default training algorithm is trainty

train(net);
+

Training the network

The default training algorithm is trainty

train(net);
 

Results of the training phase. Network parameters

getTrainParam(net)
 
 ans = 
 
+  struct with fields:
+
         A: 2.9408
         B: 3.0000
         C: 1.0000e-05
@@ -99,14 +101,14 @@
     dUaux: 0.8407
       rho: 0.0592
 
-

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
-

Tour Length

getResults(net,'tourLength')
+

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
+

Tour Length

getResults(net,'tourLength')
 
 ans =
 
     2.6908
 
-
Solving the TSP with cities in Polygon Vertices using a Hopfield Network

Solving the TSP with cities in Polygon Vertices using a Hopfield Network

There are numerous TSP problems that have been used in the literature. In this section, an additional set of problem examples is proposed, by placing TSP cities in the vertices of regular polygons. This provides a whole new set of TSP problems that can be used to test different method approaches.

As a matter of fact, the coordinates of a regular polygon of size N is used as the default behaviour of tsphopfieldnet if no set of coordinates is provided to the network.

Contents

Network parameters

rng(2); % For reproducibility
+  

Solving the TSP with cities in Polygon Vertices using a Hopfield Network

There are numerous TSP problems that have been used in the literature. In this section, an additional set of problem examples is proposed, by placing TSP cities in the vertices of regular polygons. This provides a whole new set of TSP problems that can be used to test different method approaches.

As a matter of fact, the coordinates of a regular polygon of size N is used as the default behaviour of tsphopfieldnet if no set of coordinates is provided to the network.

Contents

Network parameters

rng(2); % For reproducibility
 

Number of cities:

N = 10;
 

Free parameter C:

C = 0.00001;
-

Creating the tsphopfieldnetwork object

net = tsphopfieldnet(N,C);
+

Creating the tsphopfieldnetwork object

net = tsphopfieldnet(N,C);
 

Data coordinates (cities) can be visualized before training takes place:

plot(net);
 
Warning: Simulation has not taken place yet. Use 'sim(net)' to simulate your
 network. 
-

Training the network

The default training algorithm is trainty

train(net);
+

Training the network

The default training algorithm is trainty

train(net);
 

Results of the training phase. Network parameters

getTrainParam(net)
 
 ans = 
 
+  struct with fields:
+
         A: 2.6910
         B: 3.0000
         C: 1.0000e-05
@@ -90,22 +92,24 @@
     dUaux: 2
       rho: 0.3090
 
-

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
-

Visualizing results

getResults(net)
+

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
+

Visualizing results

getResults(net)
 plot(net);
 
 ans = 
 
-        compTime: 0.0254
-          energy: [1x64 double]
+  struct with fields:
+
+        compTime: 0.0587
+          energy: [1×64 double]
         exitFlag: 1
     itersReached: 64
-            time: [1x64 double]
+            time: [1×64 double]
       tourLength: 6.1803
        validPath: 1
       visitOrder: [6 7 8 9 10 1 2 3 4 5]
 
-
Solving the TSP with TSPLIB cities using a Hopfield Network

Solving the TSP with TSPLIB cities using a Hopfield Network

TSPLIB is an extensive set of problems frequently used for solving the TSP (and related problems) and used as a powerful reference for benchmarking different algorithms. In this section, tsphopfieldnet is used for solving the TSP when the problem coordinates are given by one of the library problems from TSPLIB.

Contents

TSPLIB problem and network parameters

rng(6); % For reproducibility
+  

Solving the TSP with TSPLIB cities using a Hopfield Network

TSPLIB is an extensive set of problems frequently used for solving the TSP (and related problems) and used as a powerful reference for benchmarking different algorithms. In this section, tsphopfieldnet is used for solving the TSP when the problem coordinates are given by one of the library problems from TSPLIB.

Contents

TSPLIB problem and network parameters

rng(6); % For reproducibility
 

TSPLIB Problem:

problem = tsplib({'berlin52'});
 

Number of cities:

N = problem.nCities;
 

Free parameter C:

C = 0.00001;
-

Creating the tsphopfieldnetwork object

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',problem.type);
+

Creating the tsphopfieldnetwork object

Providing problem coordinates cities and distance matrix to the tsphopfieldnet network by creating a structure of options

options = tsphopfieldnet.createOptions('coords',problem.coords,'d',problem.d,'type',problem.type);
 net = tsphopfieldnet(N,C,options);
 

Data coordinates (cities) can be visualized before training takes place:

plot(net);
 
Warning: Simulation has not taken place yet. Use 'sim(net)' to simulate your
 network. 
-

Training the network

The default training algorithm is trainty

train(net);
+

Training the network

The default training algorithm is trainty

train(net);
 

Results of the training phase. Network parameters

getTrainParam(net)
 
 ans = 
 
+  struct with fields:
+
         A: 2.9913
         B: 3.0000
         C: 1.0000e-05
@@ -92,22 +94,24 @@
     dUaux: 1716
       rho: 0.0087
 
-

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
-

Visualizing results

getResults(net)
+

Simulating the network

The default simulation algorithm is talavan-yanez

sim(net);
+

Visualizing results

getResults(net)
 plot(net);
 
 ans = 
 
-        compTime: 0.3416
-          energy: [1x216 double]
+  struct with fields:
+
+        compTime: 0.1708
+          energy: [1×216 double]
         exitFlag: 1
     itersReached: 216
-            time: [1x216 double]
+            time: [1×216 double]
       tourLength: 12583
        validPath: 1
-      visitOrder: [1x52 double]
+      visitOrder: [1×52 double]
 
-
Hopfield Network TSP Solver App

Hopfield Network TSP Solver App

The Hopfield Network TSP Solver App allows to solve the Traveling Salesman Problem using Continuous Hopfield Networks by using several of the solver algorithms available in Hopfield Network Toolbox (euler, talavan-yanez and divide-conquer.

You will find the Hopfield Network TSP Solver App from the APPS section in your MATLAB Desktop.

The Hopfield Network TSP Solver App can solve TSPLIB problems, TSPs where its cities are located at the vertices of regular polygons, and any TSP problem defined by its coordinates or distance matrix.

About Hopfield Network Toolbox

About Hopfield Network Toolbox

Contents

Acknowledgements

The authors would like to thank:

  • Javier Yáñez of Universidad Complutense de Madrid (Spain)
  • Pedro M. Talaván of Instituto Nacional de Estadística (Spain)

for their sound contributions and recommendations.

What problems can Hopfield Network Toolbox solve?

Hopfield Networks may solve any combinatorial optimization problem, given it is properly mapped to the network. However, at this point, Hopfield Network Toolbox is mainly designed to solve The Traveling Salesman Problem.

The Toolbox has been designed though to be easily expanded to solve any combinatorial optimization problem.

Contents

Acknowledgements

The authors would like to thank:

  • Javier Yáñez of Universidad Complutense de Madrid (Spain)
  • Pedro M. Talaván of Instituto Nacional de Estadística (Spain)

for their sound contributions and recommendations.

What problems can Hopfield Network Toolbox solve?

Hopfield Networks may solve any combinatorial optimization problem, given it is properly mapped to the network. However, at this point, Hopfield Network Toolbox is mainly designed to solve The Traveling Salesman Problem.

The Toolbox has been designed though to be easily expanded to solve any combinatorial optimization problem.

Concepts

Hopfield Network Toolbox

The Hopfield Network Toolbox can solve combinatorial optimization problems by using Hopfield Neural Networks. The Hopfield Network Toolbox is focused in Continuous Hopfield Networks.

If you are interested in using Discrete Hopfield Networks, see the documentation for newhop in Neural Network Toolbox™.

The Continuous Hopfield Network (CHN) is a recurrent neural network with an associated differential equation, whose state evolves from an initial condition to an equilibrium point by minimizing a Lyapunov function. As the Lyapunov function is associated with an objective function of the optimization problem (i.e. the mapping process), the equilibrium, or stable point, helps identify a local optimum for the optimization problem.

You can find more information about Continuous Hopfield Networks in the Concepts Section of the documentation.

Available Documentation

See also the GitHub repository Hopfield Network Toolbox for the latest release of the software.

Hopfield Network Toolbox Release Notes

Hopfield Network Toolbox Release Notes

This toolbox is solves combinatorial optimization problems by using Continuous Hopfield Networks (CHN).

The Hopfield Network Toolbox requires the following products: MATLAB® and Statistics and Machine Learning Toolbox™

Contents

Version 1.1.1, 21-Feb-2015

Bug fixing for Unix platforms

List of Bugs fixed in this release.

Version 1.1.1 on GitHub

Version 1.1, 21-Feb-2015

New App, Toolbox Documentation and Examples.

New Features:

  • Hopfield Net TSP solver App
  • Toolbox documentation
  • Step-by-step examples
  • TSPLIB automatic download

List of Bugs fixed in this release.

Version 1.1 on GitHub

Version 1.0, 02-Nov-2015

Initial release of Hopfield Network Toolbox.

This release is mainly focused in solving the Traveling Salesman Problem using the Continuous Hopfield Network (CHN). However, the release also provides a class structure to solve generic combinatorial optimization problems. Development in this area is undergoing.

The class to solve the TSP problems using CHNs is tsphopfieldnet. This network can solve any TSP problem, provided its coordinates or distance matrix. The Toolbox also includes the library TSPLIB, a de facto library for TSP benchmarks. Instances with up to 13509 cities have been tested using the tsphopfieldnet network. Note that solving such instances might require a large amount of memory.

Two main algorithms can be tested in this release:

  • talavan-yanez: based on the paper Parameter setting of the Hopfield network applied to TSP by Pedro M. Talaván and Javier Yáñez.
  • divide-conquer: based on the paper (pending publishing at the time of this release) Improving the Hopfield model performance when applied to the traveling salesman problem: A divide-and-conquer scheme by Lucas García, Pedro M. Talaván and Javier Yáñez.

Version 1.0 on GitHub

References

The latest version of this toolbox is available on GitHub.

This toolbox is solves combinatorial optimization problems by using Continuous Hopfield Networks (CHN).

The Hopfield Network Toolbox requires the following products: MATLAB® and Statistics and Machine Learning Toolbox™

Contents

Version 1.1.2, 09-Apr-2017

Bug fixing for Unix platforms

List of Bugs fixed and Enhancements in this release.

Version 1.1.2 on GitHub

Version 1.1.1, 21-Feb-2016

Bug fixing for Unix platforms

List of Bugs fixed in this release.

Version 1.1.1 on GitHub

Version 1.1, 21-Feb-2016

New App, Toolbox Documentation and Examples.

New Features:

  • Hopfield Net TSP solver App
  • Toolbox documentation
  • Step-by-step examples
  • TSPLIB automatic download

List of Bugs fixed in this release.

Version 1.1 on GitHub

Version 1.0, 02-Nov-2015

Initial release of Hopfield Network Toolbox.

This release is mainly focused in solving the Traveling Salesman Problem using the Continuous Hopfield Network (CHN). However, the release also provides a class structure to solve generic combinatorial optimization problems. Development in this area is undergoing.

The class to solve the TSP problems using CHNs is tsphopfieldnet. This network can solve any TSP problem, provided its coordinates or distance matrix. The Toolbox also includes the library TSPLIB, a de facto library for TSP benchmarks. Instances with up to 13509 cities have been tested using the tsphopfieldnet network. Note that solving such instances might require a large amount of memory.

Two main algorithms can be tested in this release:

  • talavan-yanez: based on the paper Parameter setting of the Hopfield network applied to TSP by Pedro M. Talaván and Javier Yáñez.
  • divide-conquer: based on the paper (pending publishing at the time of this release) Improving the Hopfield model performance when applied to the traveling salesman problem: A divide-and-conquer scheme by Lucas García, Pedro M. Talaván and Javier Yáñez.

Version 1.0 on GitHub

References

The latest version of this toolbox is available on GitHub.

Hopfield Network Toolbox System Requirements

Hopfield Network Toolbox System Requirements

Hopfield Network Toolbox requires MATLAB® and Statistics and Machine Learning Toolbox™

Hopfield Network Toolbox User's GuideHow to solve the Traveling Salesman Problem using Hopfield Networks

How to solve the Traveling Salesman Problem using Hopfield Networks

The Continuous Hopfield Network has been extensively used to solve the Travelling Salesman Problem. However, only after Talaván and Yáñez's approach with an appropriate problem parametrization, it is reasonable to solve the TSP using a Hopfield Network, as obtaining a feasible solution is guaranteed.

The Hopfield Network tsphopfieldnet can solve the following types of problems:

What is hopfieldnet?

What is hopfieldnet?

hopfieldnet is a MATLAB class that has been developed to solve the Continuous Hopfield Network using MATLAB.

hopfieldnet has been programmed in a similiar way to other Artificial Neural Networks available in Neural Network Toolbox™, using classdef to create and design the class.

hopfielnet is a generic class which can be used to solve any kind of combinatorial optimization problem.

A child class from hopfielnet, tsphopfieldnet, is specially focused in solving the Traveling Salesman Problem using Continuous Hopfield Networks. See the examples using tsphopfieldnet to learn more.

How to use tsphopfieldnet and createOptions

How to solve improve the performance of the Hopfield Network for the TSP

As it probably has already been noted in previous sections, the solutions of the Hopfield Network cannot compete against other popular combinatorial optimization methods. However, there are several ways in which we can considerably improve the solution obtain through Hopfield Networks. The following sections highlight 2 crucial aspects worth considering: the parameter C and the initial point for the simulation.

How to solve improve the performance of the Hopfield Network for the TSP using Hybrid methods

How to solve improve the performance of the Hopfield Network for the TSP using Hybrid methods

TSPLIB - A library for Traveling Salesman Problems

TSPLIB - A library for Traveling Salesman Problems

TSPLIB is a collection of Traveling Salesman Problem instances of varying difficulty published by Gerhard Reinelt in 1991, which has been extensively used by many research groups for comparing results.

The library has already been installed with the Hopfield Network Toolbox. If for some reason you need to download the TSPLIB library again, use the following script to do so (since some TSPLIB instances are not correctly formated and required some additional parsing).

>> setup_TSPLIB;
-