milardovich

Traveling Salesman Problem DRAFT I

Sep 18th, 2013
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 11.60 KB | None | 0 0
  1. class Tsp
  2.     def initialize
  3.         @db = [
  4.             {
  5.                 'name' => 'La Plata',
  6.                 'distance' => [
  7.                      0 => 0,
  8.                      1 => 1543,
  9.                      2 => 1510,
  10.                      3 => 1203,
  11.                      4 => 1043,
  12.                      5 => 1191,
  13.                      6 => 1023,
  14.                      7 => 478,
  15.                      8 => 940,
  16.                      9 => 1040,
  17.                     10 => 480,
  18.                     11 => 715,
  19.                     12 => 1150,
  20.                     13 => 1110,
  21.                     14 => 790,
  22.                     15 => 1155,
  23.                     16 => 1050,
  24.                     17 => 620,
  25.                     18 => 1158,
  26.                     19 => 960,
  27.                     20 => 1455,
  28.                     21 => 2635,
  29.                     22 => 3228
  30.  
  31.                 ]
  32.             },
  33.             {
  34.                 'name' => 'Jujuy',
  35.                 'distance' => [
  36.                      0 => 1543,
  37.                      1 => 0,
  38.                      2 => 99,
  39.                      3 => 340,
  40.                      4 => 500,
  41.                      5 => 960,
  42.                      6 => 860,
  43.                      7 => 1107,
  44.                      8 => 883,
  45.                      9 => 1198,
  46.                     10 => 1138,
  47.                     11 => 930,
  48.                     12 => 770,
  49.                     13 => 1220,
  50.                     14 => 1320,
  51.                     15 => 572,
  52.                     16 => 1345,
  53.                     17 => 1530,
  54.                     18 => 2200,
  55.                     19 => 2124,
  56.                     20 => 2385,
  57.                     21 => 3565,
  58.                     22 => 4158
  59.  
  60.                 ]
  61.             },
  62.             {
  63.                 'name' => 'Salta',
  64.                 'distance' => [
  65.                      0 => 1510,
  66.                      1 => 99,
  67.                      2 => 0,
  68.                      3 => 307,
  69.                      4 => 467,
  70.                      5 => 948,
  71.                      6 => 780,
  72.                      7 => 1074,
  73.                      8 => 803,
  74.                      9 => 1118,
  75.                     10 => 1105,
  76.                     11 => 897,
  77.                     12 => 695,
  78.                     13 => 1145,
  79.                     14 => 1245,
  80.                     15 => 539,
  81.                     16 => 1227,
  82.                     17 => 1497,
  83.                     18 => 2082,
  84.                     19 => 2091,
  85.                     20 => 2352,
  86.                     21 => 3532,
  87.                     22 => 4125
  88.  
  89.                 ]
  90.             },
  91.             {
  92.                 'name' => 'Tucuman',
  93.                 'distance' => [
  94.                      0 => 1203,
  95.                      1 => 340,
  96.                      2 => 307,
  97.                      3 => 0,
  98.                      4 => 160,
  99.                      5 => 936,
  100.                      6 => 768,
  101.                      7 => 767,
  102.                      8 => 791,
  103.                      9 => 1106,
  104.                     10 => 798,
  105.                     11 => 590,
  106.                     12 => 338,
  107.                     13 => 838,
  108.                     14 => 938,
  109.                     15 => 232,
  110.                     16 => 1005,
  111.                     17 => 1190,
  112.                     18 => 1860,
  113.                     19 => 1784,
  114.                     20 => 2045,
  115.                     21 => 3225,
  116.                     22 => 3818
  117.  
  118.                 ]
  119.             },
  120.             {
  121.                 'name' => 'Santiago del Estero',
  122.                 'distance' => [
  123.                      0 => 1043,
  124.                      1 => 500,
  125.                      2 => 467,
  126.                      3 => 160,
  127.                      4 => 0,
  128.                      5 => 776,
  129.                      6 => 610,
  130.                      7 => 607,
  131.                      8 => 633,
  132.                      9 => 948,
  133.                     10 => 638,
  134.                     11 => 430,
  135.                     12 => 360,
  136.                     13 => 810,
  137.                     14 => 850,
  138.                     15 => 212,
  139.                     16 => 977,
  140.                     17 => 1030,
  141.                     18 => 1567,
  142.                     19 => 1624,
  143.                     20 => 1885,
  144.                     21 => 3065,
  145.                     22 => 3658
  146.  
  147.                 ]
  148.             },
  149.             {
  150.                 'name' => 'Formosa',
  151.                 'distance' => [
  152.                      0 => 1191,
  153.                      1 => 960,
  154.                      2 => 948,
  155.                      3 => 936,
  156.                      4 => 776,
  157.                      5 => 0,
  158.                      6 => 168,
  159.                      7 => 713,
  160.                      8 => 191,
  161.                      9 => 506,
  162.                     10 => 744,
  163.                     11 => 1043,
  164.                     12 => 1136,
  165.                     13 => 1543,
  166.                     14 => 1463,
  167.                     15 => 988,
  168.                     16 => 1710,
  169.                     17 => 1523,
  170.                     18 => 2060,
  171.                     19 => 2117,
  172.                     20 => 2378,
  173.                     21 => 3558,
  174.                     22 => 4151
  175.  
  176.                 ]
  177.             },
  178.             {
  179.                 'name' => 'Resistencia',
  180.                 'distance' => [
  181.                      0 => 1023,
  182.                      1 => 860,
  183.                      2 => 780,
  184.                      3 => 765,
  185.                      4 => 610,
  186.                      5 => 168,
  187.                      6 => 0,
  188.                      7 => 545,
  189.                      8 => 23,
  190.                      9 => 338,
  191.                     10 => 576,
  192.                     11 => 875,
  193.                     12 => 970,
  194.                     13 => 1420,
  195.                     14 => 1295,
  196.                     15 => 822,
  197.                     16 => 1587,
  198.                     17 => 1475,
  199.                     18 => 2012,
  200.                     19 => 2069,
  201.                     20 => 2210,
  202.                     21 => 3390,
  203.                     22 => 3983
  204.  
  205.                 ]
  206.             },
  207.             {
  208.                 'name' => 'Santa Fe',
  209.                 'distance' => [
  210.                      0 => 478,
  211.                      1 => 1107,
  212.                      2 => 1074,
  213.                      3 => 767,
  214.                      4 => 607,
  215.                      5 => 713,
  216.                      6 => 545,
  217.                      7 => 0,
  218.                      8 => 568,
  219.                      9 => 883,
  220.                     10 => 31,
  221.                     11 => 330,
  222.                     12 => 765,
  223.                     13 => 830,
  224.                     14 => 625,
  225.                     15 => 770,
  226.                     16 => 885,
  227.                     17 => 810,
  228.                     18 => 1347,
  229.                     19 => 1404,
  230.                     20 => 1665,
  231.                     21 => 2845,
  232.                     22 => 3438
  233.  
  234.                 ]
  235.             },
  236.             {
  237.                 'name' => 'Corrientes',
  238.                 'distance' => [
  239.                      0 => 940,
  240.                      1 => 883,
  241.                      2 => 803,
  242.                      3 => 791,
  243.                      4 => 633,
  244.                      5 => 191,
  245.                      6 => 23,
  246.                      7 => 568,
  247.                      8 => 0,
  248.                      9 => 315,
  249.                     10 => 590,
  250.                     11 => 898,
  251.                     12 => 993,
  252.                     13 => 1398,
  253.                     14 => 1318,
  254.                     15 => 845,
  255.                     16 => 1565,
  256.                     17 => 1378,
  257.                     18 => 1989,
  258.                     19 => 2046,
  259.                     20 => 2187,
  260.                     21 => 3367,
  261.                     22 => 3960
  262.  
  263.                 ]
  264.             },
  265.             {
  266.                 'name' => 'Posadas',
  267.                 'distance' => [
  268.                      0 => 1040,
  269.                      1 => 1198,
  270.                      2 => 1118,
  271.                      3 => 1106,
  272.                      4 => 948,
  273.                      5 => 506,
  274.                      6 => 338,
  275.                      7 => 883,
  276.                      8 => 315,
  277.                      9 => 0,
  278.                     10 => 820,
  279.                     11 => 1213,
  280.                     12 => 1308,
  281.                     13 => 1758,
  282.                     14 => 1633,
  283.                     15 => 1160,
  284.                     16 => 1925,
  285.                     17 => 1660,
  286.                     18 => 2198,
  287.                     19 => 2000,
  288.                     20 => 2495,
  289.                     21 => 3675,
  290.                     22 => 4268
  291.  
  292.                 ]
  293.             },
  294.             {
  295.                 'name' => 'Parana',
  296.                 'distance' => [
  297.                      0 => 480,
  298.                      1 => 1138,
  299.                      2 => 1105,
  300.                      3 => 798,
  301.                      4 => 638,
  302.                      5 => 744,
  303.                      6 => 576,
  304.                      7 => 31,
  305.                      8 => 590,
  306.                      9 => 820,
  307.                     10 => 0,
  308.                     11 => 361,
  309.                     12 => 796,
  310.                     13 => 861,
  311.                     14 => 656,
  312.                     15 => 801,
  313.                     16 => 916,
  314.                     17 => 841,
  315.                     18 => 1378,
  316.                     19 => 1435,
  317.                     20 => 1696,
  318.                     21 => 2876,
  319.                     22 => 3469
  320.  
  321.                 ]
  322.             },
  323.             {
  324.                 'name' => 'Cordoba',
  325.                 'distance' => [
  326.                      0 => 715,
  327.                      1 => 930,
  328.                      2 => 897,
  329.                      3 => 590,
  330.                      4 => 430,
  331.                      5 => 1043,
  332.                      6 => 875,
  333.                      7 => 330,
  334.                      8 => 898,
  335.                      9 => 1213,
  336.                     10 => 361,
  337.                     11 => 0,
  338.                     12 => 435,
  339.                     13 => 500,
  340.                     14 => 420,
  341.                     15 => 440,
  342.                     16 => 670,
  343.                     17 => 600,
  344.                     18 => 1137,
  345.                     19 => 1194,
  346.                     20 => 1455,
  347.                     21 => 3635,
  348.                     22 => 3228
  349.  
  350.                 ]
  351.             },
  352.             {
  353.                 'name' => 'La Rioja',
  354.                 'distance' => [
  355.                      0 => 1150,
  356.                      1 => 770,
  357.                      2 => 695,
  358.                      3 => 388,
  359.                      4 => 360,
  360.                      5 => 1136,
  361.                      6 => 970,
  362.                      7 => 765,
  363.                      8 => 993,
  364.                      9 => 1308,
  365.                     10 => 796,
  366.                     11 => 435,
  367.                     12 => 0,
  368.                     13 => 450,
  369.                     14 => 550,
  370.                     15 => 156,
  371.                     16 => 617,
  372.                     17 => 1035,
  373.                     18 => 1472,
  374.                     19 => 1629,
  375.                     20 => 1890,
  376.                     21 => 3070,
  377.                     22 => 3663
  378.  
  379.                 ]
  380.             },
  381.             {
  382.                 'name' => 'San Juan',
  383.                 'distance' => [
  384.                      0 => 1110,
  385.                      1 => 1220,
  386.                      2 => 1145,
  387.                      3 => 838,
  388.                      4 => 810,
  389.                      5 => 1543,
  390.                      6 => 1420,
  391.                      7 => 830,
  392.                      8 => 1398,
  393.                      9 => 1758,
  394.                     10 => 861,
  395.                     11 => 500,
  396.                     12 => 450,
  397.                     13 => 0,
  398.                     14 => 320,
  399.                     15 => 606,
  400.                     16 => 167,
  401.                     17 => 825,
  402.                     18 => 1022,
  403.                     19 => 1419,
  404.                     20 => 1680,
  405.                     21 => 2860,
  406.                     22 => 3453
  407.  
  408.                 ]
  409.             },
  410.             {
  411.                 'name' => 'San Luis',
  412.                 'distance' => [
  413.                      0 => 790,
  414.                      1 => 1320,
  415.                      2 => 1245,
  416.                      3 => 938,
  417.                      4 => 850,
  418.                      5 => 1463,
  419.                      6 => 1295,
  420.                      7 => 625,
  421.                      8 => 1318,
  422.                      9 => 1633,
  423.                     10 => 656,
  424.                     11 => 420,
  425.                     12 => 550,
  426.                     13 => 320,
  427.                     14 => 0,
  428.                     15 => 705,
  429.                     16 => 260,
  430.                     17 => 505,
  431.                     18 => 883,
  432.                     19 => 1099,
  433.                     20 => 1360,
  434.                     21 => 2540,
  435.                     22 => 3133
  436.  
  437.                 ]
  438.             },
  439.             {
  440.                 'name' => 'Catamarca',
  441.                 'distance' => [
  442.                      0 => 1145,
  443.                      1 => 572,
  444.                      2 => 539,
  445.                      3 => 232,
  446.                      4 => 212,
  447.                      5 => 988,
  448.                      6 => 822,
  449.                      7 => 770,
  450.                      8 => 845,
  451.                      9 => 1160,
  452.                     10 => 801,
  453.                     11 => 440,
  454.                     12 => 156,
  455.                     13 => 606,
  456.                     14 => 705,
  457.                     15 => 0,
  458.                     16 => 773,
  459.                     17 => 1040,
  460.                     18 => 1588,
  461.                     19 => 1634,
  462.                     20 => 1895,
  463.                     21 => 3075,
  464.                     22 => 3668
  465.  
  466.                 ]
  467.             },
  468.             {
  469.                 'name' => 'Mendoza',
  470.                 'distance' => [
  471.                      0 => 1050,
  472.                      1 => 1345,
  473.                      2 => 1227,
  474.                      3 => 1005,
  475.                      4 => 977,
  476.                      5 => 1710,
  477.                      6 => 1587,
  478.                      7 => 885,
  479.                      8 => 1565,
  480.                      9 => 1925,
  481.                     10 => 916,
  482.                     11 => 670,
  483.                     12 => 617,
  484.                     13 => 167,
  485.                     14 => 260,
  486.                     15 => 773,
  487.                     16 => 0,
  488.                     17 => 765,
  489.                     18 => 855,
  490.                     19 => 1359,
  491.                     20 => 1620,
  492.                     21 => 2800,
  493.                     22 => 3393
  494.  
  495.                 ]
  496.             },
  497.             {
  498.                 'name' => 'Santa Rosa',
  499.                 'distance' => [
  500.                      0 => 620,
  501.                      1 => 1530,
  502.                      2 => 1497,
  503.                      3 => 1190,
  504.                      4 => 1030,
  505.                      5 => 1523,
  506.                      6 => 1475,
  507.                      7 => 810,
  508.                      8 => 1378,
  509.                      9 => 1660,
  510.                     10 => 841,
  511.                     11 => 600,
  512.                     12 => 1035,
  513.                     13 => 825,
  514.                     14 => 505,
  515.                     15 => 1040,
  516.                     16 => 765,
  517.                     17 => 0,
  518.                     18 => 537,
  519.                     19 => 594,
  520.                     20 => 855,
  521.                     21 => 2035,
  522.                     22 => 2628
  523.  
  524.                 ]
  525.             },
  526.             {
  527.                 'name' => 'Neuquen',
  528.                 'distance' => [
  529.                      0 => 1158,
  530.                      1 => 2200,
  531.                      2 => 2082,
  532.                      3 => 1860,
  533.                      4 => 1567,
  534.                      5 => 2060,
  535.                      6 => 2012,
  536.                      7 => 1347,
  537.                      8 => 1989,
  538.                      9 => 2198,
  539.                     10 => 1378,
  540.                     11 => 1137,
  541.                     12 => 1472,
  542.                     13 => 1022,
  543.                     14 => 883,
  544.                     15 => 1588,
  545.                     16 => 855,
  546.                     17 => 537,
  547.                     18 => 0,
  548.                     19 => 660,
  549.                     20 => 750,
  550.                     21 => 1930,
  551.                     22 => 2523
  552.  
  553.                 ]
  554.             },
  555.             {
  556.                 'name' => 'Viedma',
  557.                 'distance' => [
  558.                      0 => 960,
  559.                      1 => 2124,
  560.                      2 => 2091,
  561.                      3 => 1784,
  562.                      4 => 1624,
  563.                      5 => 2117,
  564.                      6 => 2069,
  565.                      7 => 1404,
  566.                      8 => 2046,
  567.                      9 => 2000,
  568.                     10 => 1435,
  569.                     11 => 1194,
  570.                     12 => 1629,
  571.                     13 => 1419,
  572.                     14 => 1099,
  573.                     15 => 1634,
  574.                     16 => 1359,
  575.                     17 => 594,
  576.                     18 => 660,
  577.                     19 => 0,
  578.                     20 => 495,
  579.                     21 => 1675,
  580.                     22 => 2268
  581.  
  582.                 ]
  583.             },
  584.             {
  585.                 'name' => 'Rawson',
  586.                 'distance' => [
  587.                      0 => 1455,
  588.                      1 => 2385,
  589.                      2 => 2352,
  590.                      3 => 2045,
  591.                      4 => 1885,
  592.                      5 => 2378,
  593.                      6 => 2210,
  594.                      7 => 1665,
  595.                      8 => 2187,
  596.                      9 => 2495,
  597.                     10 => 1696,
  598.                     11 => 1455,
  599.                     12 => 1890,
  600.                     13 => 1680,
  601.                     14 => 1360,
  602.                     15 => 1895,
  603.                     16 => 1620,
  604.                     17 => 855,
  605.                     18 => 750,
  606.                     19 => 495,
  607.                     20 => 0,
  608.                     21 => 1180,
  609.                     22 => 1773
  610.  
  611.                 ]
  612.             },
  613.             {
  614.                 'name' => 'Rio Gallegos',
  615.                 'distance' => [
  616.                      0 => 2635,
  617.                      1 => 3565,
  618.                      2 => 3532,
  619.                      3 => 3225,
  620.                      4 => 3065,
  621.                      5 => 3558,
  622.                      6 => 3390,
  623.                      7 => 2845,
  624.                      8 => 3367,
  625.                      9 => 3675,
  626.                     10 => 2876,
  627.                     11 => 2635,
  628.                     12 => 3070,
  629.                     13 => 2860,
  630.                     14 => 2540,
  631.                     15 => 3075,
  632.                     16 => 2800,
  633.                     17 => 2035,
  634.                     18 => 1930,
  635.                     19 => 1675,
  636.                     20 => 1180,
  637.                     21 => 0,
  638.                     22 => 593
  639.  
  640.                 ]
  641.             },
  642.             {
  643.                 'name' => 'Ushuaia',
  644.                 'distance' => [
  645.                      0 => 3228,
  646.                      1 => 4158,
  647.                      2 => 4125,
  648.                      3 => 3818,
  649.                      4 => 3658,
  650.                      5 => 4151,
  651.                      6 => 3983,
  652.                      7 => 3438,
  653.                      8 => 3960,
  654.                      9 => 4268,
  655.                     10 => 3469,
  656.                     11 => 3228,
  657.                     12 => 3660,
  658.                     13 => 3453,
  659.                     14 => 3133,
  660.                     15 => 3668,
  661.                     16 => 3393,
  662.                     17 => 2628,
  663.                     18 => 2523,
  664.                     19 => 2268,
  665.                     20 => 1773,
  666.                     21 => 593,
  667.                     22 => 0
  668.  
  669.                 ]
  670.             }
  671.         ]
  672.         # Initialize the "used" capitals array
  673.         @used = []
  674.         @db.count.times {
  675.             | i |
  676.             @used[i] = 0
  677.         }
  678.  
  679.         # In this global variable we save the total of Kms
  680.         @total_route = 0
  681.     end
  682.     def test
  683.         #self.travel(0)
  684.         puts @db[0]['distance'][1]
  685.     end
  686.     def travel(start)
  687.         @db.count.times {      
  688.             start = self.findShortestNextPath(start)
  689.         }
  690.     end
  691.     def findShortestNextPath(start)
  692.         shortest_distance = 999999
  693.         shortest_aim = 0
  694.         found = false
  695.         @db.count.times{
  696.             | i |
  697.             if @db[start]['distance'][i] < shortest_distance && @used[i] == 0 then
  698.                 shortest_distance = @db[start]['distance'][i]
  699.                 shortest_aim = i
  700.                 found = true
  701.             end
  702.         }
  703.         if found == true then
  704.             @used[shortest_aim] = 1
  705.             @total_route = @total_route+shortest_distance
  706.             printf("%d --> %d | %dkms \n",start,shortest_aim,shortest_distance)
  707.         else
  708.             printf("Total distance: %d",@total_route)
  709.         end
  710.     end
  711. end
  712. t = Tsp.new
  713. t.test
Advertisement
Add Comment
Please, Sign In to add comment