alykoff.github.io

влияние предмета наблюдения на наблюдателя посредством наблюдения

Идеальный муравей

Муравьи. Какие же они бывают разные! И черные, и красные, и черные маленькие, и черные большие и…Ох, сколько же вас! Давным-давно мне очень нравились муравьи. С ними было неплохо, можно было наблюдать их локальные войны. Отчего-то (в какой-то степени это и ясно) муравьи одного цвета не любят муравьев другого цвета. Но в данном случае у нас муравьи все одного цвета - черно-белого. Да-да, черно-белого. (На самом деле это муравьи Лэнгтона). В конкретном случае муравьи работают только с черным и белым цветом, оттого я их так и назвал. А что ещё они умеют? А вот что:

  • Жить на клеточном поле занимая при этом одну клетку.
  • При нахождении на черной клетке — поворачивать на 90 градусов влево, изменяя при этом цвет клетки на противоположный и делая шаг вперед на следующую клетку.
  • При нахождении на белой клетке — поворачивать на 90° вправо, изменяя цвет клетки на противоположный и делая шаг вперед на следующую клетку.

Казалось бы что муравей подчиняесь вполня четким правилам ведет себя хаотично. Но в итоге это оказывается не так. Через некоторое время, если муравью никто не мешал он начинает строить дорожку с цикличностью в 104 шага. И так до бесконечности.

Черное и белое. Где правда, а где вымысел? Где фон, а где узор? Забавно представить все с другой стороны. Например, как-будто муравей наоборот препятствует изменению цветов поля, а его отсутствие не уберегает поле от изменения цвета.

А вот и история о трех муравьях:

И для увеличение объема написанно текста - код на processing:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
final int WIDHT = 200;
final int HEIGTH = 200;
final color BLACK = color(0, 0, 0);
final color WHITE = color(255, 255, 255);

int frameRateValue = 300;
int centerX = WIDHT / 2;
int centerY = HEIGTH / 2;
int direction = 0;
Ant ant1, ant2, ant3;


void setup() {
  frameRate(frameRateValue);
  size(WIDHT, HEIGTH);
  background(BLACK);
  ant1 = new Ant(centerX, centerY, 0);
  ant2 = new Ant(50, 50, 0);
  ant3 = new Ant(50, 150, 3);
}

void draw() {
   ant1.step();
   ant2.step();
   ant3.step();
}

class Direction {
   static final int UP_DIRECTION = 0;
   static final int RIGTH_DIRECTION = 1;
   static final int DOWN_DIRECTION = 2;
   static final int LEFT_DIRECTION = 3;
   static final int MAX_DIRECTION_STATE = LEFT_DIRECTION;
   static final int MIN_DIRECTION_STATE = UP_DIRECTION;
   static final int LEFT_STEP_ROTATE = -1;
   static final int RIGTH_STEP_ROTATE = 1;
}

class Ant {
    private int x, y, direction;

    Ant(int x, int y) {
      this.x = x;
      this.y = y;
      this.direction = 0;
    }

    Ant(int x, int y, int direction) {
      this.x = x;
      this.y = y;
      this.direction = direction;
    }

    void step() {
      color currentColor = get(x, y);
      if (currentColor == BLACK) {
        set(x, y, WHITE);
        turn(Direction.LEFT_STEP_ROTATE);
      } else if (currentColor == WHITE) {
        set(x, y, BLACK);
        turn(Direction.RIGTH_STEP_ROTATE);
      }
      move();
    }

    private void move() {
      if (x < 0) x = WIDHT;
      else if (x > WIDHT) x = 0;
      if (y < 0) y = HEIGTH;
      else if (y > HEIGTH) y = 0;
      switch(direction) {
        case Direction.UP_DIRECTION:
          y = y - 1;
          break;
        case Direction.RIGTH_DIRECTION:
          x = x + 1;
          break;
        case Direction.DOWN_DIRECTION:
          y = y + 1;
          break;
        case Direction.LEFT_DIRECTION:
          x = x - 1;
          break;
      }
    }

    private void turn(int step) {
      direction = direction + step;
      if (direction > Direction.MAX_DIRECTION_STATE)
      	direction = Direction.MIN_DIRECTION_STATE;
      if (direction < Direction.MIN_DIRECTION_STATE)
      	direction = Direction.MAX_DIRECTION_STATE;
    }
}