The Left Bank of the Rhine

This post contains a review of Lotharingia: A Personal History of Europe's Lost Country by Simon Winder, along with a bit of programming practice I did recently.

Lotharingia is a history/travel book about the swath of Europe where French and Germanic cultural regions come into contact—and frequently, over the centuries, conflict. This territory may be generally considered as a strip extending westward from the Rhine for up to a few hundred kilometres. The author refers to it as Lotharingia, for reasons that will become apparent. The book is written in a conversational style; the author is British and this shows up in the form of some dry humour and an attitude of wry bemusement at Continental goings-on:

Britain has always viewed itself as an island of stability and common sense moored offshore from a Continent rife with absurdity and fanaticism.

Lotharingia covers the history of its titular territory from Charlemagne to post-World War II. It also includes a fair bit of art history (something Winder is clearly passionate about) and the mention or recommendation of numerous points of interest. Here is how Winder summarizes the theme of the book:

the area from the Rhine westwards and the German-speakers’ relationship with French-speakers is the least ho-hum subject it is possible to find. The theme of this book is defined by one of the most important if accidental moments in European history.

After Charlemagne, his empire was divided in three pieces by his grandsons in 843. The western and eastern portions become the seminal territories of France and Germany, respectively. The central portion (stretching from Northern Italy to the modern Netherlands) went to the oldest, who was named Lothair. His son, Lothair II, saw the territory split further, with northern Italy and Provence inherited by siblings. The remaining territory north of the Alps became known as Lotharingia, after his name.

Lotharingia was short-lived as an independent entity and ended up getting absorbed by the eastern kingdom (which would become the Holy Roman Empire about a century later). But this was not an entirely stable configuration, and it would end up getting passed around quite a few times over the centuries.

A notable incarnation of this territory was Burgundy, which was ruled by 4 dukes from 1363 to 1477, then inherited by a duchess who married a Habsburg.

One historian has counted fifteen different entities over the centuries called ‘Burgundy’ – post-Ribemont there were four: Boso’s Upper Burgundy, based around Lake Geneva and Lake Neuchâtel and taking in a bit of what is now Alpine northern Italy; Lower Burgundy, which was essentially a giant version of Provence; the Duchy of Burgundy, which was linked to West Francia (with its principal town of Dijon); and the County of Burgundy (a bigger version of the future Franche-Comté – the ‘free county’ – with its principal town of Dole), which was Imperial territory.

Following the Reformation, the Thirty Years' War raged heavily in this area. The Palatinate was especially devastated. At the same time, the Dutch revolt saw the northern portion of the low countries gain independence from the Spanish/Habsburgs. The southern portion, however, remained under their control until things got rearranged in the aftermath of the French Revolution and Napoleonic wars.

A part of Lotharingia that I found very interesting was seeing how choices made after Napoleon was defeated set the stage in a way for World War 1 (via the Franco-Prussian War). Prussia really became dominant in Germany during this era; despite its origins in the northeast, it acquired territories along the Rhine. This was at least in part because their military strength was seen as a counterweight to France:

The French were now hemmed in by a tangled array of very unconvincing military arrangements. Dutch troops sat in flimsy border fortifications such as the clumsily repurposed castle at Bouillon and slow work began on various German fortresses. The different political German political entities created the ‘Confederation’, a loose cooperative organization, with an assembly in Frankfurt, which replaced the Holy Roman Empire.

Something that really hit home from reading this book was the unprecedented destructiveness of World War 1. And then World War 2 (on the western front) played out over the same territory.

The fighting that eventually broke out in the West ran along the same divide as in the First World War. The region described in this book was swept over twice, in 1940 and then in 1944. In the nightmarish interlude terror, genocide, forced labour, aerial bombing and the collapse of almost all social and economic norms wracked the occupied zones.

A thesis of Winder's book is that it isn't a coincidence that both World Wars and numerous previous conflicts (the Franco-Prussian war, the Napoleonic wars, the Thirty Years' War, the Burgundian wars, etc.) occurred over the same geography. The divisions of Charlemagne's empire (and going back even further, the Rhine was part of the border of the Roman empire) kept showing up. Winder concludes his book in the aftermath of World War 2, when a fresh approach was tried. This was the European Coal and Steel Community, the precursor to the European Union.  

This refreshed and overhauled symbolism around Charlemagne came together in the early 1950s. It turned out that the future did not lie in France trying to pinch places like the Saarland, but in the pooling of resources and sovereignty. Rather than thinking punitively again, Monnet and others decided that, starting with steel and coal, there was a potentially serious gain from progressively crossing out the ways in which countries had always been nationally aggressive. It helped to be operating under a combination of the fairly benign aegis of the US and of the very malign threat of the USSR. It will not be a surprise to the reader that I think of this in terms of Lotharingia. The six Lotharingian or part-Lotharingian successor states – the Netherlands, Belgium, Luxembourg, France, Germany and Italy – having been beaten to the ground by the horrors of nationalism and ideology decided to stop any further enmity by joining together. They would go on to make three core Lotharingian cities into their capitals: Brussels, Luxembourg and Strasbourg.

With the historical outline covered, I wanted to share some various things I found interesting from reading Lotharingia. First of all, there are a lot of notable dynasties in European history with a Lotharingian connection. The Habsburg's ancestral castle is on the Aare River, a left-bank tributary of the Rhine in what is now northern Switzerland. The ancestral castle of the House of Nassau is just outside the territories discussed here, on a right-bank tributary of the Rhine, but only 20 km outside Koblenz. Some of their descendants are still the Grand Dukes of Luxembourg; and, of course, others of their descendants in the House of Orange-Nassau would end up ruling the Netherlands. The ancestral castles of a couple of other prominent German ruling families, the Hohenzollerns and Hohenstaufens, aren't far outside Lotharingia either.  

British royal succession also took a detour through Lotharingia, as described in a section of Winder's book. King James I (Stuart) had a daughter, Elizabeth, who married the elector Palatine. Her daughter, Sophia, had a son (George I), who became the first king in the Hanover dynasty after the end of the Stuart dynasty. The last Stuart monarchs were William & Mary (who brought an army from the Netherlands—another Lotharingian connection—in 1688) and Queen Anne. But Queen Mary died childless and none of Queen Anne's children survived childhood, so there was a dynastic succession. This paragraph will probably make more sense with reference to the family tree.

Another thing I found interesting is that although both originated out of Charlemagne's empire, the Kingdom of France and the Holy Roman Empire were structured very differently. The former was as centralized as possible, but Winder describes the latter in contrasting terms:  

The eastern empire was structured differently, with no chief city. The Emperor wandered from palace to palace and different territories made different arrangements depending on the ebb and flow of emergencies and personalities.

The more decentralized nature of the Holy Roman Empire is reflected in the diversity of statuses that different cities and regions had in the empire. For example, there were "free cities" (part of the Empire without being part of any subsidiary Duchy or Principality) and ecclesiastical cities which were ruled by Prince-Bishops. Three of these even had the status of Imperial Electors: Trier (which had been Constantine's capital), Cologne, Mainz—all of these are in the area discussed in Lotharingia, as was the (non-Electorate) Prince-Bishopric of Liège.

Winder describes abbeys (he mentions Maulbronn and Altenberg as nice examples) and guilds as important contributors to European history and technological development:

In some moods I really think that these Cistercian abbeys should lie at the centre of all teaching of European history and that they are far more significant and interesting than most, merely ephemeral political events. We are so used to thinking of the Middle Ages in terms of men covered in sheets of metal clopping about on horses and hitting one another, whereas the true image of the period should be a monk writing.
 
Indeed, there is a good argument that it was [guild] members’ ceaseless mulling and tinkering that allowed Europe to outstrip the rest of the world. Just as over the centuries the needs of long-distance travel and bouts of fighting meant that naval vessels, through hundreds of small and almost unrecorded fixes, became ever more powerful; so, throughout the aggressively self-improving towns of Western Europe, unknown individuals in specific workshops refined locks, hinges, drills, triggers, cheeses, pendulums. Things became miniaturized, alloys more reliable, strawberries bigger, gun ranges longer.

I also found this statement to be thought-provoking:

Nationalism seems to be a universal side effect of specific levels of literacy and communication.

(Here's a short clip from a lecture that touches on the same issue).

Finally, I'll share a tidbit (in the context of logistics for sieges) that I felt was in the same vein as Harvesting the Biosphere:

fun statistic: a large army with forty thousand horses would need a thousand tons of green fodder a day to keep going.

That's 50 pounds per horse.

Because Simon Winder mentions a lot of interesting places in his book, I thought it would be interesting to chart a route that visits some of them. Calculating an efficient route between a number of stops is known as the "travelling salesman problem". I decided to try writing a little program in Clojure to tackle this exercise.

I picked ten cities or towns mentioned in Lotharingia (the choices are discussed a bit more below), listed them in alphabetical order (from Aachen to Tournai) and prepared a matrix of the distances between them (in degrees, as the Euclidean/Pythagorean distance based on their latitudes and longitudes). Because Clojure doesn't really distinguish between data and code, I could use this matrix (a vector of vectors, technically) the same way as I would a function. Here is a brief description of how it and the rest of the program/script work:

  • The first line defines the namespace. Anything preceded by a semi-colon is a comment.
  • dists is a vector of vectors of the distances from each city to each of the others
  • wrap is a function to add the first element of a vector to the end of it. I needed this because the travelling salesman problem is supposed to end up back where it started. It returns a list rather than a vector (being careful about switching between these datatypes was something I had to watch carefully in doing this exercise) so when temporarily binding the shifted variable in the route function, I used vec to get the results back in the form of a vector.
  • travel takes a vector of two numbers (i.e. labels for point A and point B) and looks up the distance between them in the dists matrix
  • places is a vector of numbers assigned to each city from the dists matrix. It starts in order, but gets re-ordered below
  • permut is a function to permutate a vector (vect) by moving a specified element (at position nn) to the front and removing it from its original position
  • route takes a vector (that will be an ordered list of places) and replaces each element with a vector: an ordered pair consisting of that element and the next one. Basically, each element is doubled up so that there is a vector for each segment of the route (instead of A to B to C ..., it becomes A to B, B to C, C to ...) so it's in the right format to be passed to the travel function. It finishes back at the beginning to make a round trip.
  • route-dist combines route and travel to add up the distance of a round trip for places in a given order.
  • A simulated annealing strategy (previously mentioned here) is used; temp is the starting temperature.
  • The loop ties everything together. A starting temperature is given to anneal; when it reaches zero, the current distance and the order of places will be printed and the loop will exit (returning nil, since every Clojure function has to return something). Otherwise, it will temporarily bind a new (random) order of the cities (new-places) using the permut function. If the round-trip distance is less than for the previous order of places, or with a random probability that decreases with the annealling temperature, places will be replaced with the new order. The current distance and order will be printed. If there was no change, "no change" will be printed. Either way, the annealing temperature will be decreased and the loop will repeat.
(ns travellingsalesman)

(def dists [[0 1.81 3.59 1.20 2.05 1.16 2.28 1.67 2.79 2.69] ;from Aachen
  [1.81 0 4.99 1.21 0.92 2.48 4.09 2.88 4.39 1.15] ;from Antwerp
  [3.59 4.99 0 3.80 5.55 2.54 2.48 2.11 1.03 5.28] ;from Basle
  [1.20 1.21 3.80 0 1.96 1.35 3.23 1.69 3.27 1.65] ;from Dinant
  [2.05 0.92 5.55 1.96 0 3.01 4.25 3.48 4.83 1.93] ;from Leiden
  [1.16 2.48 2.54 1.35 3.01 0 2.06 0.51 1.93 2.98] ;from Luxembourg
  [2.28 4.09 2.48 3.23 4.25 2.06 0 2.15 1.46 4.87] ;from Mainz
  [1.67 2.88 2.11 1.69 3.48 0.51 2.15 0 1.65 3.24] ;from Metz
  [2.79 4.39 1.03 3.27 4.83 1.93 1.46 1.65 0 4.87] ;from Strasbourg
  [2.69 1.15 5.28 1.65 1.93 2.98 4.87 3.24 4.87 0]] ;from Tournai
) ; provide a matrix of distances between locations

(defn wrap [x] (conj x (first x)))
 
(defn travel [[a b]] ((dists a) b)) ;a function to retrieve point-to-point distances from the matrix above

(def places (vec (range (count dists)))) ; assign numbers to the points/locations from 'dists'. 

(defn permut [vect nn] 
  (vec (cons (nth vect nn) (remove #(= (nth vect nn) %) vect)))
) ; a function to permute a vector by moving a specified element to the front

(defn route [vect] 
  (let [shifted (vec (drop 1 (wrap vect)))] ; use the 'wrap' function defined above to offset the vector of locations
    (for [x (range (count vect))] 
      (conj [] (vect x) (shifted x)) ; adjacent points are now given as a series of ordered-pair vectors to feed into the 'travel' function
)))

(defn route-dist [vect] (reduce + (map travel (route vect)))) ; add up the point-to-point distances for a round trip

(def temp 50) ; set starting "temperature" for simulated annealing

(loop [anneal temp] ; loop will exit when annealing temperature drops to zero
  (if (= anneal 0) 
    (println (route-dist places) " : " places)
    (let [new-places (permut places (rand-nth (range (count places))))] ; try a random permutation of the vector of the places to visit
      (if (or (< (rand temp) anneal) (< (route-dist new-places) (route-dist places)))
        (do 
          (def places new-places) ; keep the new route if it is shorter than the old one, or with a probability based on the annealing temperature otherwise
          (println (route-dist places) " : " places)
          (recur (dec anneal)) ; lower the annealing temperature and repeat
        )
        (do
          (println "no change")
          (recur (dec anneal))
        )
)))) ; close if, let, if, and loop

Here is an example of running this script:

user=> (load-file "travellingsalesman.clj")
28.989999999999995  :  [9 0 1 2 3 4 5 6 7 8]
26.249999999999996  :  [0 9 1 2 3 4 5 6 7 8]
24.44  :  [7 0 9 1 2 3 4 5 6 8]
no change
28.870000000000005  :  [9 7 0 1 2 3 4 5 6 8]
26.330000000000002  :  [1 9 7 0 2 3 4 5 6 8]
26.450000000000003  :  [9 1 7 0 2 3 4 5 6 8]
23.73  :  [7 9 1 0 2 3 4 5 6 8]
26.83  :  [3 7 9 1 0 2 4 5 6 8]
26.660000000000004  :  [6 3 7 9 1 0 2 4 5 8]
33.43  :  [9 6 3 7 1 0 2 4 5 8]
30.710000000000004  :  [3 9 6 7 1 0 2 4 5 8]
30.61  :  [5 3 9 6 7 1 0 2 4 8]
32.220000000000006  :  [0 5 3 9 6 7 1 2 4 8]
no change
32.220000000000006  :  [0 5 3 9 6 7 1 2 4 8]
no change
no change
26.96  :  [4 0 5 3 9 6 7 1 2 8]
25.760000000000005  :  [5 4 0 3 9 6 7 1 2 8]
27.770000000000003  :  [4 5 0 3 9 6 7 1 2 8]
22.490000000000002  :  [1 4 5 0 3 9 6 7 2 8]
22.419999999999998  :  [3 1 4 5 0 9 6 7 2 8]
22.27  :  [0 3 1 4 5 9 6 7 2 8]
no change
no change
19.44  :  [6 0 3 1 4 5 9 7 2 8]
no change
no change
20.0  :  [2 6 0 3 1 4 5 9 7 8]
no change
no change
no change
no change
20.0  :  [8 2 6 0 3 1 4 5 9 7]
no change
no change
no change
19.439999999999998  :  [2 8 6 0 3 1 4 5 9 7]
no change
no change
no change
16.32  :  [5 2 8 6 0 3 1 4 9 7]
no change
no change
18.250000000000004  :  [3 5 2 8 6 0 1 4 9 7]
no change
no change
no change
no change
18.250000000000004  :  [3 5 2 8 6 0 1 4 9 7]
nil

Note that "no change" is printed more frequently as it gets close to the end. This is because the decreasing simulated annealing temperature as time goes by makes it less likely that a permutation will be accepted if it results in a longer route. The purpose of giving a higher probability of accepting longer routes early on is that a route that is ultimately shorter might take a few steps of rearranging to reach; those steps could temporarily lengthen it, so insisting that every change result in a shorter route could result in the program getting trapped in a dead-end that is far from optimized.

Another thing to note is that the shortest distance in the run above (16.32) was not the final answer. Nor is it the best solution: I ran the program multiple other times and the shortest distance I found was 15.05. Even that may not be the absolute optimal answer. So this program has room for improvement; this exercise was intended to illustrate the travelling salesman problem and simulated annealing, but it certainly isn't an optimized solution. Check out this interactive simulation for a more powerful implementation of this kind of approach.

I took the best solution my program came up with and mapped it out in Google Maps (it wouldn't allow for a closed route). This is a similar distance to the tour of the Maritimes I suggested here, by the way.

The route mapped

To wrap this post up, here are some notes from Lotharingia about the places listed on this route:

  • Aachen was Charlemagne's capital
  • Antwerp:
The Fugger banking family had a set of cages at the Antwerp docks and were on a constant lookout, in what must have been an unbelievably exciting time, for previously unimagined exotica.
  • Basle, Mainz, and Strasbourg were key locations in the early development of printing
  • Dinant occupies a key river crossing and was the site of an early battle in WW1
The Meuse is a river large enough to look like an impressive obstacle on French military maps, but narrow enough to look entirely doable on German military maps.
  • Leiden: a university city in the Netherlands. Winder recommends the Hortus Botanicus and the museum associated with Siebold
  • Luxembourg is significant as a surviving independent Duchy, and remarkable for its geography
Luxembourg City is one of the great, weird European landscapes. Many major towns start, of course, on a defendable, flood-resistant hill, even if it is merely a small rise now invisible under a traffic crossing. But Luxembourg battles with Edinburgh or Budapest in any Most Craggy City contest.
  • Metz changed hands between France and Germany and was an early centre of industrialization
  • Tournai apparently has great museums (including one on tapestries)
Tournai is a gift that just goes on giving – endlessly interesting, with museums packed with curiosities left behind by wave after wave of emperors, artists and generals. A French enclave wedged between Flanders and Hainaut, Tournai’s territory (the Tournaisis) was only finally conquered by Charles V in 1521 and became part of the Spanish Netherlands.

There are also UNESCO sites that sound interesting in a few other places in Lotharingia: Charleroi, Trier, Nancy, Berne, and Speyer.

Permalink