I explore here a Scheme version that deploys a mutable array of immutable zone states. The array has one cell per zone and that cell accesses the "current" LC.
(define (Do k proc)(let loop ((j 0)) (if (< j k)
  (begin (proc j) (loop (+ j 1))))))
(define (vg n) (let* ((n2 (* n n))(2n (+ n n))(s (make-vector n2 '()))
   (d (let ((f 1/4)) (lambda (n) (cons n f)))))
  (vector-set! s 0
      (list 0 (d 1) (d n)))
  (vector-set! s (- n 1)
      (list 0 (d (- n 2)) (d(- 2n 1))))
  (vector-set! s (- n2 n)
      (list 0 (d (- n2 2n)) (d (+ (- n2 n) 1))))
  (vector-set! s (- n2 1)
      (list 0 (d (- n2 2)) (d (- (- n2 n) 1))))
  (Do (- n 2)(lambda (j) (vector-set! s (+ j 1)
      (list 1/4 (d j) (d (+ j 2)) (d (+ j n 1))))
    (let ((k (- (+ j n2 1) n))) (vector-set! s k
      (list 1/4 (d (- k 1)) (d (+ k 1)) (d (- k n)))))
    (let ((k (* n (+ j 1)))) (vector-set! s k
      (list -1/4 (d (- k n)) (d (+ k n)) (d (+ k 1)))))
    (let ((k (- (+ (* n j) 2n) 1))) (vector-set! s k
      (list -1/4 (d (- k n)) (d (+ k n)) (d (- k 1)))))
    (Do (- n 2)(lambda (m) (let ((k (+ n 1 j (* n m)))) (vector-set! s k
       (list 0 (d (+ k 1))(d (- k 1))
           (d (+ k n))(d (- k n)))))))))
  (Do n2 (lambda (x) (if (null? (vector-ref s x)) (write (list x)))))
  ;(let ((t (make-vector n2 0)))
  ; (Do n2 (lambda (k) (map (lambda (n) (vector-set! t (car n)
  ;     (+ 1 (vector-ref t (car n))))) (cdr (vector-ref s k)))))
  ;  t)
  s
  ))
(define s (vg 5))
(define (merge-assim A B comp assim) (if (null? A) B (if (null? B) A
  (let ((t (comp (car A) (car B))))
    (cond ((positive? t) (cons (car A) (merge-assim (cdr A) B comp assim)))
      ((negative? t) (cons (car B) (merge-assim A (cdr B) comp assim)))
      (else (cons (assim (car A)(car B)) (merge-assim (cdr A) (cdr B) comp assim))))))))
(define (retire n)(let ((lc (vector-ref s n)))
  (for-each (lambda (N) (let* ((id (car N))(nlc (vector-ref s id))
     (f (let ff ((u (cdr nlc))) (if (= n (caar u)) u (let ((z (ff (cdr u))))
       (cons (car z) (cons (car u) (cdr z)))))))(g (cdar f)))
     (vector-set! s id (cons (+ (* (car lc) g) (car nlc)) (merge-assim (cdr lc) (cdr nlc) 
       (lambda (x y) (- (car x) (car y))) (lambda (x y) (+ (* g x) y))))))) (cdr lc))
    (vector-set! s n (cons "d" lc))))
The following verifies that the acquaintance is still symmetric. It requires the definition of ms. sl sorts a list of pairs of zone ids, i.e. a relation between zones. ln uses sl to test if the recorded relation is its own converse, i.e. symetric. In ln, c grows to become the list of pairs.
(define (sl a) ((ms (lambda (x y) (let ((s (- (car x) (car y))))
  (if (zero? s) (- (cdr x) (cdr y)) s))) (mer "bump")) a))
(define (ln s) (let ((c '()))
  (Do (vector-length s) (lambda (j) (let ((x (vector-ref s j)))
    (if (number? (car x)) (map (lambda (e) 
     (if (= (car e) j) ((mer "Reflexive!") j))
      (set! c (cons (cons j (car e)) c))) (cdr x))))))
   (let ((d (sl c))(e (sl (map (lambda (x) (cons (cdr x)(car x))) c))))
 (list (equal? d e) d e))))