SGA-PMX Demo

Skrypt przedstawia przykładową implementację algorytmu Simple Genetic Algorithm (SGA) z operatorem PMX i jego zastosowanie do rozwiązywania problemu komiwojażera (ang. Travelling Salesman Problem, TSP). Popularne instancje problemu TSP można znaleźć w bibliotece TSPLib [1]. Skrypt skupia się na rozwiązywaniu instancji BERLIN52, w celu rozwiązywania innych instancji może okazać się konieczna zmiana ustawień parametrów algorytmu, a może też i operatorów ewolucyjnych.

Literatura:

[1] TSPLIB, http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/

In [1]:
import numpy as np
import matplotlib.pyplot as plt
import time

%matplotlib inline

Input data

In [2]:
# BERLIN52

n = 52
print('Problem size: %d' % n)

coords = np.array([565.0, 575.0, 25.0, 185.0, 345.0, 750.0, 945.0, 685.0, 845.0, 655.0, 880.0, 660.0, 25.0, 230.0, 525.0, 1000.0, 580.0, 1175.0, 650.0, 1130.0, 1605.0, 620.0, 1220.0, 580.0, 1465.0, 200.0, 1530.0, 5.0, 845.0, 680.0, 725.0, 370.0, 145.0, 665.0, 415.0, 635.0, 510.0, 875.0, 560.0, 365.0, 300.0, 465.0, 520.0, 585.0, 480.0, 415.0, 835.0, 625.0, 975.0, 580.0, 1215.0, 245.0, 1320.0, 315.0, 1250.0, 400.0, 660.0, 180.0, 410.0, 250.0, 420.0, 555.0, 575.0, 665.0, 1150.0, 1160.0, 700.0, 580.0, 685.0, 595.0, 685.0, 610.0, 770.0, 610.0, 795.0, 645.0, 720.0, 635.0, 760.0, 650.0, 475.0, 960.0, 95.0, 260.0, 875.0, 920.0, 700.0, 500.0, 555.0, 815.0, 830.0, 485.0, 1170.0, 65.0, 830.0, 610.0, 605.0, 625.0, 595.0, 360.0, 1340.0, 725.0, 1740.0, 245.0])
coords = coords.reshape(n, 2)

A = np.empty((n, n))
for i in range(n):
    for j in range(n):
        A[i, j] = np.sqrt(((coords[i, :] - coords[j, :])**2).sum())
print('Distance matrix:\n', A)

p = [0, 48, 31, 44, 18, 40,  7,  8,  9, 42, 32, 50, 10, 51, 13, 12, 46, 25, 26, 27, 11, 24,  3,  5, 14,  4, 23, 47, 37, 36, 39, 38, 35, 34, 33, 43, 45, 15, 28, 49, 19, 22, 29,  1,  6, 41, 20, 16,  2, 17, 30, 21]
print('Optimal solution:\n', p)
Problem size: 52
Distance matrix:
 [[    0.           666.10809934   281.11385594 ...,   217.08293346
    789.38267019  1220.46097848]
 [  666.10809934     0.           649.32657423 ...,   596.25917184
   1421.55724471  1716.04924172]
 [  281.11385594   649.32657423     0.         ...,   463.24939288
    995.3140208   1483.59361012]
 ..., 
 [  217.08293346   596.25917184   463.24939288 ...,     0.           829.60834133
   1150.76061803]
 [  789.38267019  1421.55724471   995.3140208  ...,   829.60834133     0.
    624.81997407]
 [ 1220.46097848  1716.04924172  1483.59361012 ...,  1150.76061803
    624.81997407     0.        ]]
Optimal solution:
 [0, 48, 31, 44, 18, 40, 7, 8, 9, 42, 32, 50, 10, 51, 13, 12, 46, 25, 26, 27, 11, 24, 3, 5, 14, 4, 23, 47, 37, 36, 39, 38, 35, 34, 33, 43, 45, 15, 28, 49, 19, 22, 29, 1, 6, 41, 20, 16, 2, 17, 30, 21]
In [3]:
plt.figure(figsize=(12,8))

plt.plot(coords[:, 0], coords[:, 1], 'o')

for i in range(n):
    plt.text(coords[i, 0]+8, coords[i, 1]+8, str(i), fontdict={'weight':'bold', 'size':8})

plt.title('Berlin52 - problem definition')

plt.show()
In [4]:
from matplotlib.lines import Line2D

route = p

plt.figure(figsize=(12,8))
fig, ax = plt.subplots(figsize=(12,8))

plt.plot(coords[:, 0], coords[:, 1], 'o')

for i in range(n):
    plt.text(coords[i, 0]+8, coords[i, 1]+8, str(i), fontdict={'weight':'bold', 'size':8})

ax.add_line(Line2D(
    [coords[0, 0], coords[route[0], 0]],
    [coords[0, 1], coords[route[0], 1]],
    linewidth=1, color='gray'))
plt.text((coords[0, 0] + coords[route[0], 0])/2 + 6,
         (coords[0, 1] + coords[route[0], 1])/2 + 6,
         '%d' % A[0, route[0]], fontdict={'weight':'normal', 'size':7})
for i in range(1, len(route)):
    ax.add_line(Line2D(
        [coords[route[i-1], 0], coords[route[i], 0]],
        [coords[route[i-1], 1], coords[route[i], 1]],
        linewidth=1, color='gray'))
    plt.text((coords[route[i-1], 0] + coords[route[i], 0])/2 + 6,
             (coords[route[i-1], 1] + coords[route[i], 1])/2 + 6,
             '%d' % A[route[i-1], route[i]], fontdict={'weight':'normal', 'size':7})
ax.add_line(Line2D(
    [coords[route[-1], 0], coords[0, 0]],
    [coords[route[-1], 1], coords[0, 1]],
    linewidth=1, color='gray'))
plt.text((coords[route[-1], 0] + coords[0, 0])/2 + 6,
         (coords[route[-1], 1] + coords[0, 1])/2 + 6,
         '%d' % A[route[-1], 0], fontdict={'weight':'normal', 'size':7})

plt.title('Berlin52 - optimal solution')

plt.show()
<matplotlib.figure.Figure at 0x88f8198>

Objective function

In [5]:
def tsp_objective_function(p):
    s = 0.0
    for i in range(n):
        s += A[p[i-1], p[i]]
    return s
In [6]:
print(tsp_objective_function(p), p)
7544.3659019 [0, 48, 31, 44, 18, 40, 7, 8, 9, 42, 32, 50, 10, 51, 13, 12, 46, 25, 26, 27, 11, 24, 3, 5, 14, 4, 23, 47, 37, 36, 39, 38, 35, 34, 33, 43, 45, 15, 28, 49, 19, 22, 29, 1, 6, 41, 20, 16, 2, 17, 30, 21]

Random Sampling

In [7]:
t0 = time.time()

T = 1000000

permutations = np.empty((T, n), dtype=np.int64)
costs = np.zeros(T)
for i in range(T):
    permutations[i, :] = np.random.permutation(n)
    costs[i] = tsp_objective_function(permutations[i, :])

print(time.time() - t0)

p = permutations[costs.argmin(), :]
print(tsp_objective_function(p), p)
42.270999908447266
21785.7986805 [29  6 21 35  7 18  2  0 30 41 22 19 20  1 17  8 33 44 24 40 47 31 36 23 43
 15 32 45 34 38 14 39  5  9 49 48 11 50  4 42 12 28 51 10  3 16 37 27 25 13
 46 26]
In [8]:
plt.figure(figsize=(12,4))
plt.hist(costs, bins=100)
plt.show()

print(costs.mean(), costs.std())
29916.5052699 1578.60276838

Simulated Annealing

In [9]:
def random_neighbor(p, radius):
    q = p.copy()
    for r in range(radius):
        i, j = np.random.choice(n, 2, replace=False)
        q[i], q[j] = q[j], q[i]
    return q
In [10]:
T = 500000
radius = 1
alpha = 1.0

t0 = time.time()

p = np.random.permutation(n)
p_cost = tsp_objective_function(p)
costs = np.zeros(T)
for t in range(T):
    q = random_neighbor(p, radius)
    q_cost = tsp_objective_function(q)
    if(q_cost < p_cost):
        p, p_cost = q, q_cost
    elif(np.random.rand() < np.exp(- alpha * (q_cost - p_cost) * t/T)):
        p, p_cost = q, q_cost
    costs[t] = p_cost

print(time.time() - t0, costs.min())
30.25100016593933 9329.95320462
In [11]:
plt.figure(figsize=(12,4))
plt.plot(costs)
plt.show()

SGA-PMX

In [15]:
def PMX(ind1, ind2):

    # TODO

    return ind1, ind2
In [13]:
def reverse_sequence_mutation(p):
    a = np.random.choice(len(p), 2, False)
    i, j = a.min(), a.max()
    q = p.copy()
    q[i:j+1] = q[i:j+1][::-1]
    return q
In [14]:
population_size = 500
chromosome_length = n
number_of_offspring = population_size
crossover_probability = 0.95
mutation_probability = 0.25
number_of_iterations = 250

time0 = time.time()

best_objective_value = np.Inf
best_chromosome = np.zeros((1, chromosome_length))

# generating an initial population
current_population = np.zeros((population_size, chromosome_length), dtype=np.int64)
for i in range(population_size):
    current_population[i, :] = np.random.permutation(chromosome_length)

# evaluating the objective function on the current population
objective_values = np.zeros(population_size)
for i in range(population_size):
    objective_values[i] = tsp_objective_function(current_population[i, :])

for t in range(number_of_iterations):

    # selecting the parent indices by the roulette wheel method
    fitness_values = objective_values.max() - objective_values
    if fitness_values.sum() > 0:
        fitness_values = fitness_values / fitness_values.sum()
    else:
        fitness_values = np.ones(population_size) / population_size
    parent_indices = np.random.choice(population_size, number_of_offspring, True, fitness_values).astype(np.int64)

    # creating the children population
    children_population = np.zeros((number_of_offspring, chromosome_length), dtype=np.int64)
    for i in range(int(number_of_offspring/2)):
        if np.random.random() < crossover_probability:
            children_population[2*i, :], children_population[2*i+1, :] = PMX(current_population[parent_indices[2*i], :].copy(), current_population[parent_indices[2*i+1], :].copy())
        else:
            children_population[2*i, :], children_population[2*i+1, :] = current_population[parent_indices[2*i], :].copy(), current_population[parent_indices[2*i+1]].copy()
    if np.mod(number_of_offspring, 2) == 1:
        children_population[-1, :] = current_population[parent_indices[-1], :]

    # mutating the children population
    for i in range(number_of_offspring):
        if np.random.random() < mutation_probability:
            children_population[i, :] = reverse_sequence_mutation(children_population[i, :])

    # evaluating the objective function on the children population
    children_objective_values = np.zeros(number_of_offspring)
    for i in range(number_of_offspring):
        children_objective_values[i] = tsp_objective_function(children_population[i, :])

    # replacing the current population by (Mu + Lambda) Replacement
    objective_values = np.hstack([objective_values, children_objective_values])
    current_population = np.vstack([current_population, children_population])

    I = np.argsort(objective_values)
    current_population = current_population[I[:population_size], :]
    objective_values = objective_values[I[:population_size]]

    # recording some statistics
    if best_objective_value < objective_values[0]:
        best_objective_value = objective_values[0]
        best_chromosome = current_population[0, :]

    print('%3d %14.8f %12.8f %12.8f %12.8f %12.8f' % (t, time.time() - time0, objective_values.min(), objective_values.mean(), objective_values.max(), objective_values.std()))
  0     0.04699993 24964.81600321 28448.19109047 29735.88772161 1003.74797641
  1     0.07399988 23144.93826132 27588.97410282 28740.61067907 907.31888916
  2     0.10000014 23144.93826132 26970.23988763 28021.96527908 807.93651039
  3     0.12699986 23144.93826132 26461.26918515 27410.98469899 730.43063554
  4     0.15300012 23129.48209390 26091.99626286 26947.46333276 691.09793276
  5     0.17799997 21477.09824545 25714.42953781 26536.78142028 679.17314947
  6     0.20499992 21477.09824545 25330.48665796 26133.02940188 673.67108528
  7     0.23099995 21477.09824545 24963.01727292 25796.34828420 754.68972734
  8     0.25699997 20990.36850812 24570.79530123 25453.41372432 848.87623319
  9     0.28699994 20762.06471098 24116.25143862 25092.54614284 918.86072463
 10     0.31499982 20657.46692039 23549.94792303 24724.87213980 998.26974922
 11     0.34200001 20631.28628172 22881.11414313 24101.44148387 884.00113780
 12     0.36800003 20309.11931081 22245.65387059 23205.28856972 643.31126791
 13     0.39499998 19440.51458474 21771.08729698 22417.84540379 518.02301911
 14     0.42199993 19173.44544018 21368.06320977 21979.39933224 454.18931392
 15     0.44900012 19173.44544018 21006.87980835 21498.29370263 454.30476414
 16     0.47799993 18682.97278154 20670.02863582 21215.58017343 469.11909397
 17     0.50900006 17485.50585828 20259.14444366 20926.72396079 538.86068348
 18     0.53600001 17485.50585828 19763.54262368 20452.20629267 536.63745173
 19     0.56200004 16614.35053461 19270.60581746 19878.84299344 521.94208304
 20     0.58899999 16614.35053461 18822.69860380 19440.77554030 502.84580899
 21     0.61600018 16223.84204697 18414.79617784 18997.27106678 481.61953850
 22     0.64199996 16223.84204697 18048.95472690 18608.32620740 441.54620655
 23     0.66799998 15920.91773873 17650.49437583 18188.59171911 398.58883733
 24     0.69700003 15920.91773873 17345.99788311 17819.73792915 386.52313077
 25     0.72600007 15869.89402312 17054.84326420 17494.90266416 363.45239455
 26     0.75300002 15680.77342358 16753.68272820 17203.40582021 339.56153564
 27     0.77999997 15386.08532295 16483.20601847 16867.35781037 274.40195295
 28     0.80900002 15386.08532295 16290.51572601 16606.76353058 234.95726203
 29     0.83599997 15386.08532295 16096.35418316 16377.45815462 178.68470689
 30     0.86299992 15386.08532295 15959.84764954 16163.62683212 144.05593212
 31     0.88899994 15085.62657556 15845.83423381 15986.12474598 137.90502779
 32     0.91700006 15085.62657556 15733.31900315 15920.91773873 167.10282244
 33     0.94599986 14919.98872922 15597.64203587 15812.05650390 160.27684509
 34     0.97300005 14919.98872922 15470.05212508 15675.28881428 152.61389314
 35     1.00000000 14691.26372108 15357.87911254 15552.76229219 143.47511430
 36     1.02600002 14412.81521738 15233.00084496 15402.45672652 165.56675971
 37     1.05299997 14412.81521738 15091.37961216 15306.18539331 193.13838219
 38     1.08000016 14008.97626474 14919.73868144 15184.37229322 186.43954602
 39     1.10699987 14008.97626474 14761.23391337 14968.97398345 169.36000838
 40     1.13400006 13843.03288616 14623.63413322 14817.78848474 175.67905418
 41     1.16499996 13843.03288616 14490.41852285 14723.46013412 186.96426734
 42     1.19200015 13687.08440603 14354.19914522 14601.06093052 183.31036864
 43     1.21899986 13476.65026528 14219.56297898 14447.41430907 196.55178718
 44     1.24600005 13476.65026528 14075.87498962 14338.89502445 185.44199404
 45     1.27300000 12808.52022681 13939.02052714 14162.53057576 179.07860974
 46     1.30000019 12582.76434477 13797.83788812 13997.80377888 198.59470065
 47     1.32599998 12399.50566504 13633.12079176 13901.21380483 251.77974250
 48     1.35399985 12399.50566504 13396.39946130 13700.37339715 310.91842672
 49     1.38299990 11700.38809666 13073.75129708 13515.53221128 320.14246031
 50     1.40899992 11637.68810326 12760.98556685 13039.36015585 177.44867534
 51     1.43499994 11637.68810326 12613.09579689 12767.45245587 137.53941874
 52     1.46199989 11475.57407560 12507.41298088 12656.28832197 182.95480973
 53     1.48800015 11363.39289292 12339.60556892 12561.65172356 294.71764866
 54     1.51499987 11211.83774641 11950.81516742 12439.30827521 332.65003281
 55     1.54200006 10893.92738388 11625.44280710 11821.33140207 125.61788013
 56     1.56999993 10893.92738388 11511.22029086 11657.89165989 117.06726970
 57     1.60100007 10893.92738388 11402.82391093 11529.42973581  99.52361520
 58     1.62800002 10893.92738388 11310.46964965 11415.64373927 101.10114870
 59     1.65499997 10678.63455285 11213.31259136 11347.65570081 125.63050958
 60     1.68199992 10678.63455285 11096.06007222 11254.61180563 131.69141920
 61     1.70900011 10595.92994415 10965.39993723 11138.13179990 106.08131832
 62     1.73600006 10595.92994415 10872.49431482 10937.15328025  71.20635370
 63     1.76299977 10497.81703785 10798.78820814 10893.92738388  86.54286103
 64     1.78999996 10354.44464164 10712.22860115 10818.53057269  80.93044519
 65     1.81900001 10354.44464164 10631.71981837 10707.58899340  62.75242476
 66     1.84500003 10311.04515751 10573.17165251 10661.88434947  75.17527283
 67     1.87099981 10068.14653955 10497.60306248 10595.92994415  99.12975274
 68     1.89700007 9947.97396794 10385.82930889 10522.49296811  90.91318672
 69     1.92400002 9947.97396794 10312.13853221 10380.63711313  93.84445886
 70     1.95000005 9801.91093261 10199.98810722 10354.44464164 113.01703282
 71     1.97700000 9801.91093261 10098.76888497 10233.62716661 101.01662408
 72     2.00400019 9728.96026201 10003.51563062 10095.75232648  70.50490515
 73     2.03399992 9728.96026201 9936.95935898 9952.37993026  36.27032726
 74     2.06000018 9424.26482932 9881.30714051 9947.97396794  70.03127884
 75     2.08699989 9336.36616367 9818.13904940 9893.97083686  69.57169779
 76     2.11399984 9336.36616367 9760.02735217 9857.31349767  78.96062603
 77     2.14000010 9336.36616367 9699.18874081 9793.46117287  91.34170691
 78     2.16599989 9296.82026507 9639.36030644 9728.96026201 127.22376175
 79     2.19300008 9189.86633932 9518.41693214 9724.55429968 137.00168401
 80     2.22000003 9030.11333447 9403.07845291 9551.65899470  82.46479994
 81     2.25000000 9030.11333447 9330.05805079 9414.44248193  37.95506766
 82     2.27699995 9030.11333447 9310.66044706 9336.36616367  59.14858705
 83     2.30299997 8883.61351011 9211.23209713 9336.36616367 100.35752097
 84     2.32999992 8833.61653234 9110.87081089 9189.86633932  78.51898656
 85     2.35600019 8767.31936746 9008.68944858 9069.16623434  56.20939583
 86     2.38199997 8767.31936746 8955.00756891 9030.11333447  80.08330303
 87     2.40899992 8767.31936746 8861.24663123 8963.81616959  47.39965261
 88     2.43600011 8767.31936746 8825.64793560 8853.05315789  23.10286662
 89     2.46599984 8702.30340818 8802.97475698 8833.61653234  31.56106720
 90     2.49200010 8702.30340818 8766.84838357 8767.31936746   5.12227397
 91     2.51899981 8702.30340818 8733.55669589 8767.31936746  32.10708711
 92     2.54500008 8702.30340818 8702.30340818 8702.30340818   0.00000000
 93     2.57200003 8644.75217314 8702.14903721 8702.30340818   2.71504447
 94     2.60000014 8593.40669221 8668.53609885 8702.30340818  27.21513691
 95     2.62599993 8499.16385679 8642.94911752 8644.75217314   8.76158411
 96     2.65200019 8437.15802960 8616.25832009 8644.75217314  45.96863989
 97     2.68299985 8379.60679457 8554.62568116 8625.11792322  67.51175982
 98     2.70900011 8379.60679457 8479.82126332 8499.16385679  26.78712578
 99     2.73600006 8352.35015571 8442.09410166 8456.53788713  11.13054013
100     2.76199985 8352.35015571 8433.83531854 8441.61262176  19.09629934
101     2.78900003 8284.94505844 8394.36529286 8441.61262176  33.65006059
102     2.81699991 8284.94505844 8358.36461484 8379.60679457  16.32382159
103     2.84299994 8273.28100678 8345.04934174 8352.35015571  19.95620018
104     2.87099981 8205.87590952 8303.18301456 8352.35015571  27.81550050
105     2.90000010 8205.87590952 8283.08933592 8284.94505844   9.45109057
106     2.92699981 8182.94171438 8244.43002209 8284.94505844  33.41021469
107     2.95400000 8182.94171438 8204.97697919 8205.87590952   4.34284259
108     2.98000002 8162.22769636 8188.70483536 8205.87590952  10.26098741
109     3.00800014 8162.22769636 8181.89685443 8182.94171438   3.95575272
110     3.03399992 8121.78771976 8173.45367336 8182.94171438   8.32547466
111     3.06100011 8121.78771976 8166.49221823 8168.59343343   5.35854887
112     3.08800006 8121.78771976 8157.96098570 8168.59343343  10.84128333
113     3.11800003 8096.52814806 8149.23107901 8162.22769636  13.69684553
114     3.14400005 8096.52814806 8136.56301120 8147.87941540  13.83986145
115     3.16999984 8044.72421801 8119.44079364 8121.78771976   6.76945100
116     3.19700003 8030.37593705 8105.85366511 8121.78771976  12.84884375
117     3.22399998 8030.37593705 8096.99135051 8107.43943881  17.40829328
118     3.25099993 8019.46464630 8073.40384240 8096.52814806  27.92817569
119     3.27799988 8019.46464630 8039.17786610 8044.72421801   7.25220603
120     3.30599999 8011.17694632 8029.37954263 8030.37593705   3.17858342
121     3.33399987 8011.17694632 8021.78355831 8030.37593705   5.17980101
122     3.36100006 7990.76797519 8017.98829232 8019.46464630   3.64629749
123     3.38800001 7987.17332513 8010.70696664 8019.46464630   5.15591677
124     3.41499996 7950.77133689 8007.42287218 8011.17694632   5.99620442
125     3.44099998 7915.73244254 7999.54968730 8011.17694632   7.22881851
126     3.46800017 7915.73244254 7997.65037365 8000.14167315  11.92478733
127     3.49399996 7915.73244254 7968.61254768 8000.14167315  35.30532269
128     3.52199984 7915.73244254 7933.60122523 8000.14167315  24.35879101
129     3.54900002 7915.73244254 7915.73244254 7915.73244254   0.00000000
130     3.57599998 7915.73244254 7915.73244254 7915.73244254   0.00000000
131     3.60299993 7915.73244254 7915.73244254 7915.73244254   0.00000000
132     3.62999988 7869.86489887 7915.64070745 7915.73244254   2.04920663
133     3.65700006 7869.86489887 7880.52434320 7915.73244254  19.32727328
134     3.68400002 7869.86489887 7869.86489887 7869.86489887   0.00000000
135     3.71000004 7869.86489887 7869.86489887 7869.86489887   0.00000000
136     3.73799992 7869.86489887 7869.86489887 7869.86489887   0.00000000
137     3.76500010 7869.86489887 7869.86489887 7869.86489887   0.00000000
138     3.79299998 7869.86489887 7869.86489887 7869.86489887   0.00000000
139     3.82000017 7869.86489887 7869.86489887 7869.86489887   0.00000000
140     3.84599996 7869.86489887 7869.86489887 7869.86489887   0.00000000
141     3.87299991 7869.86489887 7869.86489887 7869.86489887   0.00000000
142     3.90000010 7869.86489887 7869.86489887 7869.86489887   0.00000000
143     3.92699981 7853.49114817 7869.83215137 7869.86489887   0.73152377
144     3.95499992 7853.49114817 7858.14129337 7869.86489887   7.38352679
145     3.98299980 7853.49114817 7853.49114817 7853.49114817   0.00000000
146     4.00900006 7853.49114817 7853.49114817 7853.49114817   0.00000000
147     4.03699994 7853.49114817 7853.49114817 7853.49114817   0.00000000
148     4.06500006 7853.49114817 7853.49114817 7853.49114817   0.00000000
149     4.09099984 7853.49114817 7853.49114817 7853.49114817   0.00000000
150     4.11800003 7853.49114817 7853.49114817 7853.49114817   0.00000000
151     4.14499998 7853.49114817 7853.49114817 7853.49114817   0.00000000
152     4.17300010 7853.49114817 7853.49114817 7853.49114817   0.00000000
153     4.20099998 7853.49114817 7853.49114817 7853.49114817   0.00000000
154     4.22800016 7853.49114817 7853.49114817 7853.49114817   0.00000000
155     4.25499988 7853.49114817 7853.49114817 7853.49114817   0.00000000
156     4.28200006 7853.49114817 7853.49114817 7853.49114817   0.00000000
157     4.30900002 7853.49114817 7853.49114817 7853.49114817   0.00000000
158     4.33599997 7853.49114817 7853.49114817 7853.49114817   0.00000000
159     4.36299992 7853.49114817 7853.49114817 7853.49114817   0.00000000
160     4.39099979 7853.49114817 7853.49114817 7853.49114817   0.00000000
161     4.41799998 7853.49114817 7853.49114817 7853.49114817   0.00000000
162     4.44599986 7853.49114817 7853.49114817 7853.49114817   0.00000000
163     4.47300005 7853.49114817 7853.49114817 7853.49114817   0.00000000
164     4.50000000 7853.49114817 7853.49114817 7853.49114817   0.00000000
165     4.52600002 7853.49114817 7853.49114817 7853.49114817   0.00000000
166     4.55299997 7853.49114817 7853.49114817 7853.49114817   0.00000000
167     4.57900000 7853.49114817 7853.49114817 7853.49114817   0.00000000
168     4.60699987 7853.49114817 7853.49114817 7853.49114817   0.00000000
169     4.63400006 7853.49114817 7853.49114817 7853.49114817   0.00000000
170     4.66100001 7853.49114817 7853.49114817 7853.49114817   0.00000000
171     4.68799996 7853.49114817 7853.49114817 7853.49114817   0.00000000
172     4.71499991 7853.49114817 7853.49114817 7853.49114817   0.00000000
173     4.74099994 7853.49114817 7853.49114817 7853.49114817   0.00000000
174     4.76999998 7853.49114817 7853.49114817 7853.49114817   0.00000000
175     4.79699993 7853.49114817 7853.49114817 7853.49114817   0.00000000
176     4.82500005 7853.49114817 7853.49114817 7853.49114817   0.00000000
177     4.85399985 7853.49114817 7853.49114817 7853.49114817   0.00000000
178     4.88100004 7853.49114817 7853.49114817 7853.49114817   0.00000000
179     4.90799999 7853.49114817 7853.49114817 7853.49114817   0.00000000
180     4.93499994 7853.49114817 7853.49114817 7853.49114817   0.00000000
181     4.96199989 7853.49114817 7853.49114817 7853.49114817   0.00000000
182     4.98900008 7853.49114817 7853.49114817 7853.49114817   0.00000000
183     5.01600003 7853.49114817 7853.49114817 7853.49114817   0.00000000
184     5.04299998 7853.49114817 7853.49114817 7853.49114817   0.00000000
185     5.07200003 7853.49114817 7853.49114817 7853.49114817   0.00000000
186     5.10000014 7853.49114817 7853.49114817 7853.49114817   0.00000000
187     5.12599993 7853.49114817 7853.49114817 7853.49114817   0.00000000
188     5.15200019 7853.49114817 7853.49114817 7853.49114817   0.00000000
189     5.17899990 7853.49114817 7853.49114817 7853.49114817   0.00000000
190     5.20499992 7853.49114817 7853.49114817 7853.49114817   0.00000000
191     5.23200011 7853.49114817 7853.49114817 7853.49114817   0.00000000
192     5.25899982 7853.49114817 7853.49114817 7853.49114817   0.00000000
193     5.28699994 7853.49114817 7853.49114817 7853.49114817   0.00000000
194     5.31299996 7853.49114817 7853.49114817 7853.49114817   0.00000000
195     5.34000015 7853.49114817 7853.49114817 7853.49114817   0.00000000
196     5.36699986 7853.49114817 7853.49114817 7853.49114817   0.00000000
197     5.39300013 7853.49114817 7853.49114817 7853.49114817   0.00000000
198     5.41899991 7853.49114817 7853.49114817 7853.49114817   0.00000000
199     5.44599986 7853.49114817 7853.49114817 7853.49114817   0.00000000
200     5.47399998 7853.49114817 7853.49114817 7853.49114817   0.00000000
201     5.50199986 7853.49114817 7853.49114817 7853.49114817   0.00000000
202     5.52900004 7853.49114817 7853.49114817 7853.49114817   0.00000000
203     5.55499983 7853.49114817 7853.49114817 7853.49114817   0.00000000
204     5.58200002 7853.49114817 7853.49114817 7853.49114817   0.00000000
205     5.60800004 7853.49114817 7853.49114817 7853.49114817   0.00000000
206     5.63499999 7853.49114817 7853.49114817 7853.49114817   0.00000000
207     5.66199994 7853.49114817 7853.49114817 7853.49114817   0.00000000
208     5.69000006 7853.49114817 7853.49114817 7853.49114817   0.00000000
209     5.71700001 7853.49114817 7853.49114817 7853.49114817   0.00000000
210     5.74400020 7853.49114817 7853.49114817 7853.49114817   0.00000000
211     5.77099991 7853.49114817 7853.49114817 7853.49114817   0.00000000
212     5.79799986 7853.49114817 7853.49114817 7853.49114817   0.00000000
213     5.82400012 7853.49114817 7853.49114817 7853.49114817   0.00000000
214     5.85099983 7853.49114817 7853.49114817 7853.49114817   0.00000000
215     5.87800002 7853.49114817 7853.49114817 7853.49114817   0.00000000
216     5.90400004 7853.49114817 7853.49114817 7853.49114817   0.00000000
217     5.93400002 7853.49114817 7853.49114817 7853.49114817   0.00000000
218     5.96099997 7853.49114817 7853.49114817 7853.49114817   0.00000000
219     5.98699999 7853.49114817 7853.49114817 7853.49114817   0.00000000
220     6.01300001 7853.49114817 7853.49114817 7853.49114817   0.00000000
221     6.04000020 7853.49114817 7853.49114817 7853.49114817   0.00000000
222     6.06599998 7853.49114817 7853.49114817 7853.49114817   0.00000000
223     6.09399986 7853.49114817 7853.49114817 7853.49114817   0.00000000
224     6.12100005 7853.49114817 7853.49114817 7853.49114817   0.00000000
225     6.14899993 7853.49114817 7853.49114817 7853.49114817   0.00000000
226     6.17600012 7853.49114817 7853.49114817 7853.49114817   0.00000000
227     6.20400000 7853.49114817 7853.49114817 7853.49114817   0.00000000
228     6.23099995 7853.49114817 7853.49114817 7853.49114817   0.00000000
229     6.25699997 7853.49114817 7853.49114817 7853.49114817   0.00000000
230     6.28400016 7853.49114817 7853.49114817 7853.49114817   0.00000000
231     6.31099987 7853.49114817 7853.49114817 7853.49114817   0.00000000
232     6.33800006 7853.49114817 7853.49114817 7853.49114817   0.00000000
233     6.36699986 7853.49114817 7853.49114817 7853.49114817   0.00000000
234     6.39400005 7853.49114817 7853.49114817 7853.49114817   0.00000000
235     6.42100000 7853.49114817 7853.49114817 7853.49114817   0.00000000
236     6.44699979 7853.49114817 7853.49114817 7853.49114817   0.00000000
237     6.47300005 7853.49114817 7853.49114817 7853.49114817   0.00000000
238     6.50000000 7853.49114817 7853.49114817 7853.49114817   0.00000000
239     6.52699995 7853.49114817 7853.49114817 7853.49114817   0.00000000
240     6.55399990 7853.49114817 7853.49114817 7853.49114817   0.00000000
241     6.58200002 7853.49114817 7853.49114817 7853.49114817   0.00000000
242     6.60899997 7853.49114817 7853.49114817 7853.49114817   0.00000000
243     6.63600016 7853.49114817 7853.49114817 7853.49114817   0.00000000
244     6.66199994 7853.49114817 7853.49114817 7853.49114817   0.00000000
245     6.68900013 7853.49114817 7853.49114817 7853.49114817   0.00000000
246     6.71499991 7853.49114817 7853.49114817 7853.49114817   0.00000000
247     6.74099994 7853.49114817 7853.49114817 7853.49114817   0.00000000
248     6.76800013 7853.49114817 7853.49114817 7853.49114817   0.00000000
249     6.79600000 7853.49114817 7853.49114817 7853.49114817   0.00000000