Хрупкий шар
Мне виделось, что значительно менее популярный в ту эпоху, нежели теперь, Python имеет огромный потенциал. В первую очередь тогда мною двигала простая предусмотрительность коммерческого разработчика. Я стремился поглубже узнать упомянутый любопытный язык, пока он не стал языком первого выбора для известного поля задач. Я предчувствовал моду на Python-разработку и хотел получить опыт работы с упомянутым языком заранее.
В частности, мне было интересно посмотреть на то, как Python умеет манипулировать масштабными графами. Я установил NetworkX, открыл PyCharm и стал пробовать.
Тратя на проект по два-четыре часа в день, я за несколько недель построил сильно упрощённую, но работающую программную модель ерунды, о которой рассказывал раньше.
Модель представляла собой шарообразную поверхность, состоящую из запутанного множества рёбер. Эти рёбра соединяли между собой многочисленные узлы.
Каждый узел олицетворял собой единственного экономического актора. Рёбра же изображали связи между ними.
Каждое ребро обладало “массой”. Эта “масса” стремилась связь разорвать. “Масса” зависела только от длины ребра. Связь “хотела” упасть в центр шара. Туда были направлены векторы “масс” рёбер.
От того чтобы провалиться внутрь себя, поверхность удерживалась “упругостью” составляющих её рёбер. Каждая связь вела себя наподобие протяжённой упругой соломинки, тем более хрупкой, чем более длинной.
Упругость определялась “входным числом” связи. Смысл “входного числа” проще понять, если представить себе, что это приходящие в связь деньги. Связь обладала “жадностью”. “Жадность” определяла разницу между входным и выходным числом связи. Жадность могла быть как положительной, так и отрицательной. То есть связь могла отдавать как больше, так и меньше денег, чем получила. Если количество денег в связи сильно падало, ребро из соломинки превращалось в верёвочку, увеличивая таким образом вероятность разрыва всей поверхности.
“Жадность” зависела от лютой прорвы параметров. Например, от длины связи (чем связь длиннее, тем “жадность” её больше), от “входных чисел” и “жадностей” окружающих связей. От близости к корню ветвления графа и от прочего разного. Однако среди параметров, формирующих “жадность” связи, был и случайный компонент. То есть каждое ребро шарообразной сети несло в себе маленькую “бомбу неопределённости”. Жадность связи могла случайно упасть или, наоборот, вырасти. Повышение уровня жадности было более вероятным.
Если масса связи превосходила её “упругость”, связь разрывалась. Деньги текли туда, где дешевле. Новые связи возникали в случае, если разница между выходным числом “донорской” связи и входным “акцепторной” была достаточно большой, чтобы обеспечить связи совместимую с жизнью упругость. “Открытые” связи на внешних концах графа продолжали ветвиться, пока не натыкались на другой граф. Если такая, близкая к нулю по выходному числу, связь оказывалась вблизи “богатой” связи другого графа, они соединялись. Недавно “нулевая” связь становилась “богатой” и способной порождать новые ветви. Такой класс событий я назвал для себя “коммерческой удачей”.
Модель состояла из шести графов. Источники ветвления двух располагались на полюсах шара, остальные четыре я равномерно распределил по экватору. Входное число на источниках ветвления я сделал постоянным. Это упрощение позволило легко решить проблему “иссякания денег” в системе. Деньги иссякать были не должны. Ведь в реальном мире они никогда не иссякают… Точнее, деньги могут иссякнуть в нашем кармане, но не во всей экономической машине.
Если упругость связи становилась меньше её массы, связь просто исчезала. Как правило, это приводило к обрушению соседних рёбер. Я намеренно поместил в модель множество константных коэффициентов, чтобы её можно было легко балансировать вручную.
Получившаяся сфера моделировала большую часть экономических эффектов, о которых я говорил выше. Например, любая рекурсивная связь, то есть образовавшееся кольцо из рёбер, в котором “деньги” бежали по кругу, достаточно быстро разрывалась, поскольку запертые в ней деньги быстро выпивались “жадностью” составляющих кольцо связей.
Однако кое-что — например эффект повышения хрупкости, который создавали сложные продукты, необходимые для производства простых, — пришлось специально реализовать, используя дополнительные свойства и правила.
Вся эта система висела на таймере. Она итеративно изменялась, раз во сколько-то там миллисекунд.
Я сделал программный шар с очень сложной и постоянно изменяющейся поверхностью. Гипотетически эта поверхность могла “треснуть”. В какой-то локальной области поверхности связи периодически резко и лавинообразно разрывались.
Первая “трещина” всегда вызывала дальнейшее быстрое разрушение поверхности. Именно возникновение на поверхности критичной для стабильности системы “трещины” и соответствовало “порогу хрупкости” из моих предыдущих рассуждений.