Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сильный искусственный интеллект и объектно-ориентированное программирование синтез парадигм

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
мы упоминали службу «одно окно». В данном же случае ситуа­ция не совсем противоположная, но все же логически оправдан­ная. Напоминает это некоторую чрезмерно бюрократизированную организацию и определенного «просителя», которому нужна какая-либо справка. Т. е. «проситель» приходит в данную орга­низацию, обращается в некий распределительный пункт (обра­ботчик) и обозначает свой запрос. Его направляют в соот­ветствующий кабинет (конкретный обработчик), в котором (разумеется) оказывается, что ему нужно в совсем другой каби­нет на другом этаже и в противоположном крыле здания, в кото­ром (разумеется) оказывается, что ему нужно в кабинет третий, вообще в подвале и т. д. В конце концов «проситель» получает то, за чем приходил, и измученный, но довольный удаляется. Бывает и такое, что он вовсе ничего не получает, но эта самая чрезмерно бюрократизированная система все же позволяет ми­нимизировать такой риск. Потому что в альтернативном случае – в случае сильного зацепления «просителя» с обработчиком – сразу после того, как «проситель» обозначил бы свой запрос, если ему не повезло сразу попасть в нужный кабинет, его запросу просто отказывается в удовлетворении и на этом все заканчи­вается.
Осмысление структуры паттерна. Собственно, вся струк­тура данного паттерна настолько сильно похожа на структуру связного списка, что, возможно, связный список и есть довольно неплохая кандидатура на реализацию паттерна «Цепочка обя­занностей» на уровне конкретики в рамках определенной системы. Уточним, что мы имеем в виду односвязный список. Связный список представляет собой структуру данных, которая напоми­нает в метафорическом смысле змею, а потому содержит в себе head (голову) – первый элемент – и tail (хвост) – последний эле­мент. Между ними может быть сколь угодно много (зависит от ресурсов конкретной системы) «срединных» элементов. Каждый из элементов содержит в себе два поля: value (значение) и next (ссылка на следующий элемент связного списка). В случае по­следнего элемента ссылка на следующий элемент, само собой, отсутствует. При необходимости отыскать некоторое значение
171
в связном списке мы можем осуществить итерирование по нему («пробежаться» по списку) и в случае совпадения искомого и найденного значений прекратить итерирование. Классический алгоритм поиска. В связном списке ПК (в этом случае объекты) являются равнозначными и связаны отношениями по типу обо­юдостороннего агрегирования.
Значимость паттерна в контексте разработки систем
сильного ИИ. В контексте разработки систем сильного ИИ ПП,
который являет собой довольно близкий аналог ассоциативного мышления, несомненно, на первый взгляд, полезен и годен к ре­ализации. Однако есть нюанс. А именно, мы обладаем ассоциа­тивным мышлением (предположительно) или, еще можно сказать, гиперссылочным мышлением, что в данном контексте синони­мично. Сама структура нейронных связей подразумевает реа­лизацию чего-либо подобного. Однако если мы изначально опре­делим, что у системы сильного ИИ должно быть именно ассоци­ативное мышление, то тем самым загоним систему в рамки и нарушим свои же принципы построения систем сильного ИИ. Мы помним, что лишены права и возможности разрешать част­ности и определять конкретику для интеллектуальной системы с претензией на наличие технотропного сознания, так как мы не можем предполагать никакого конкретного итога по причине отсутствия шаблона сильного ИИ. В отличие от построения си­стем слабого ИИ, тех же нейронных сетей, в которых шаблон, несомненно, присутствует, цели и задачи определены, алгоритмы прописаны и так далее – здесь ситуация иная. Мы имеем право определять лишь наиболее абстрактные константы функциони­рования системы – «законы физики» интеллектуальной «вселен­ной». Мы поступаем так для обеспечения максимально возможной свободы системы, так как считаем, что излишняя конкрети зация на раннем этапе создания развивающихся интеллектуальных систем в данном случае является одной из причин отсутствия сильного ИИ. В связи с этим для извлечения пользы из паттерна «Цепочка обязанностей» необходимо интенсифицировать уро­вень абстракции. Вполне возможно, что сильный ИИ будет об­ладать не ассоциативным мышлением, а мышлением совершенно
172
иного, нам доселе неизвестного типа. Возможно, синергетиче­ским или квантовым и т. д. Возможно, что ассоциативная связь – не самый эффективный тип связи с точки зрения оптимизации по времени или по памяти. К примеру, связь по типу квантовой нелокальности вообще осуществляется за константное время вне зависимости от расстояния между удаленными конечными точ­ками. Само собой разумеется, что система сильного ИИ должна (в соответствии с одним из основных принципов ООП) быть внутренне сильно связанной и таковой она, несомненно, и будет. Но вот сами типы этих внутренних связей не уточняются: они могут быть как прямыми, так и косвенными (опосредованными), как централизованными, так и децентрализованными, как нис­ходящими, так и восходящими. По сути, система в процессе сво­его функционирования и взаимодействия со средой должна сама сформировать все необходимые себе связи с учетом собствен­ных возможностей и потребностей, а также контекста их реали­зации. Поэтому «зародыш» системы сильного ИИ должен быть «готов ко всему». Соответственно, в паттерне «Цепочка обязан­ностей» нам видятся значимыми следующие аспекты: наглядная демонстрация практической значимости принципа слабого за­цепления, а также необходимость установления специфической связи между компонентами системы для эффективной обработ­ки различных ситуаций, возникающих в результате взаимодей­ствия системы со средой. На основе заимствования абстракций паттерна мы считаем, что при разработке системы сильного ИИ ни сильные сцепки, ни конкретный тип взаимодействия между ПК заранее определять не целесообразно. Здесь мы реализуем достаточно простой принцип возрастания уровня абстракций: если нельзя определять конкретный тип взаимодействия между ПК, то при необходимости следует определить для ПК возмож­ность выбирать между различными типами взаимосвязи; еще лучше – определить саму возможность возникновения подобно­го феномена в рамках системы; еще лучше – сформировать та­кую ситуацию, чтобы система сама воспроизвела и определила для себя такую возможность, и так далее выше и выше от содер­жания к форме.
173
12.3. Поведенческий паттерн «Наблюдатель»
Идентификатор. Наблюдатель (Observer). Классические элементы. Субъект, наблюдатель. Назначение. Как указывается в Design patterns, «Наблюда-
тель» «определяет зависимость типа “один ко многим” между объек тами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автомати­чески обновляются» [114, с. 280]. Таким образом, основным на­значением паттерна «Наблюдатель» является синхронизация ПК, которые взаимодействуют тем или иным способом и связаны, как правило, по типу зависимости («многих от одного»). Наблю­датель призван существенно упростить и, более того, автомати­зировать координацию состояний и поведения различных ПК.
Проблема. Представим себе ситуацию, что в некоторой си­стеме наличествует определенное количество ПК, некоторые из которых ответственны за обеспечение эффективного функцио­нирования системы в целом. Ответственность остальных ПК заключается в том, чтобы, так сказать, поддерживать этих «пе­редовиков» в их деятельности. Поддержка эта может осущест­вляться по-разному, однако ее специфика должна быть опреде­лена некоторым конкретным образом для каждой отдельной системы. Проблема заключается в быстрой и эффективной под­стройке «помощников» под актуальные задачи «передовиков». Если осуществлять это вручную, то реагирование системы на быстро изменяющуюся обстановку становится недостаточно эф­фективным. Т. е. если сформировать сильное зацепление меж ду субъектом и наблюдателем и обязать субъекта оповещать кон­кретного наблюдателя о своем состоянии и своих изменениях, то, во-первых, ввиду наличия сильного зацепления данные ПК бу­дет очень сложно повторно использовать и, во-вторых, это со­вершенно не оптимально. Это примерно как сравнить две совер­шенно различные по ресурсозатратности, но одинаковые в плане целей ситуации: в первом случае у объекта А что-то случилось и он, чтобы оповестить об этом объектов В и С, лично едет к ка­ждому из них домой, во втором случае объект А осуществляет
174
рассылку по электронной почте. Для решения данной проблемы и предназначен паттерн «Наблюдатель», который, конечно же, близок ко второму примеру.
Концептуальное решение. В рамках системы происходит следующее. Формируется некоторое количество ПК, каждому из которых назначается определенная ответственность. И, допу­стим, некоторым из этих компонентов (наблюдателям) важно иметь представление о состоянии других компонентов (субъек­тов). Вполне возможно, что наблюдателей интересуют не все возможные состояния субъекта, а лишь некоторые из них (на­пример, два из пяти или одно из десяти). В такой ситуации по­стоянный фоновый мониторинг субъекта со стороны наблюда­теля выглядел бы абсолютно неоптимальным. Даже в том случае, если наблюдателя интересуют сто из ста возможных состояний субъекта, постоянный мониторинг выглядит совершенно из­лишним. Ведь если при изменении субъекта наблюдатель так­же обязан измениться, то этот процесс в любом случае дискре­тен. И даже если наблюдатель обязан изменяться сам в ответ на любую трансформацию субъекта, то в те моменты, когда субъ-
ект некоторое время находится в одном и том же состоянии, на­блюдатель ничего делать не обязан. И именно поэтому при на- личии постоянного контроля состояния субъекта со стороны наблюдателя ресурсы (возможно, нужные для чего-либо друго-
го) растрачиваются впустую, не говоря уже о нарушении прин­ципа слабого зацепления. Решением выглядит следующее: опре­деление механизма подписки наблюдателя на интересующие его изменения состояния субъекта. Происходит это следующим образом. Распределяются роли и ответственности между ПК, определяется механизм подписки и отписки. Затем, в процессе функционирования системы, ПК, реализующий роль субъекта, в момент изменения своего состояния со статуса «Х» на статус «Y» оповещает об этом всех компонентов-наблюдателей, под­писанных именно на переключение статуса субъекта на «Y». В ответ все подписанные компоненты-наблюдатели присылают ком поненту-субъекту запрос на конкретику изменений, т. е. «спра­шивают», каким именно образом им теперь необходимо изме-
175
нить свое состояние и/или поведение, и затем осуществляют необходимые изменения. Компонент-субъект не знает, какие именно компоненты-наблюдатели на него подписаны, и даже не интересуется этим. Компоненты-наблюдатели, в свою очередь, имеют механизм подписки-отписки и вольны им пользоваться по своему усмотрению (с учетом текущей ситуации в контексте программной системы).
Предполагаемые результаты и преимущества. В качестве результатов полагается оптимизированное взаимодействие ПК друг с другом (субъектов с наблюдателями), т. е. отсутствие случаев неэкономичного использования ресурсов. Также нема­ловажным является соблюдение фундаментального принципа слабого зацепления, что позволяет эффективно повторно исполь­зовать наличествующие ПК и предоставляет возможность легче вносить изменения в систему. Также предполагается, что реали­зация паттерна позволяет поддерживать высокий уровень дина­мики в рамках системы, т. е. все необходимые изменения осу­ществляются быстро, точно и эффективно.
Гипотетический пример реализации паттерна. Наличе­ствует реальный пример реализации паттерна «Наблюдатель» – уже упомянутая рассылка по электронной почте. Каждый полу­чатель рассылки не подписан на вообще все рассылки, которые существуют, а также не звонит в организацию, из которой полу­чает рассылку, каждые пять минут с вопросом на тему, что у них там изменилось и нет ли чего-нибудь нового (клинические случаи мы здесь не рассматриваем). Получатель рассылки под­писан на те организации, которые ему интересны и важны, а также (опционально) на те темы (предоставляемые организа­циями-субъектами), которые ему интересны. Это и есть реали­зация паттерна «Наблюдатель» в макромире. Однако данный при­мер слишком тривиален и интуитивно понятен, а сам паттерн способен проявлять себя несколько сложнее и далеко не так оче­видно.
К примеру, мы выше говорили о ситуации в рамках про­граммной системы, в которой наличествуют нами определен­ные ПК, которые несут в себе суть «передовиков», и иные ком-
176
поненты, реализующие функционал «помощников». Мы также указали на необходимость своевременного и адекватного реаги­рования «помощников» на изменившуюся для «передовиков» ситуацию в контексте системы. В макромире бывают ситуации, в которых примерно таким же образом реализуется паттерн «Наблюдатель». Например, боксер перед боем и непосредствен­но в бою. Он сам является субъектом и «передовиком». У него наличествует определенная команда: основной тренер, тренеры по некоторым отдельным аспектам (общая физическая подго­товка, специальная физическая подготовка и так далее), врач, массажист, психолог, секунданты и прочие. В процессе подго­товки к бою состояние субъекта-боксера претерпевает опреде­ленные изменения. В том случае, если наблюдатели (команда боксера) некорректно и/или несвоевременно отреагируют на эти изменения, то пострадает форма боксера и увеличится вероят­ность того, что бой будет им проигран. У секундантов та же си­туация наличествует непосредственно во время боя. Чтобы не происходило некорректных реакций со стороны команды на из­менения состояния боксера, определяется механизм подписки. Каждый член команды подписывается на некоторые изменения и берет их под свою ответственность. Тренеры следят за физиче­ской формой и за тем, чтобы она соответствовала текущему эта­пу подготовки, врач отслеживает результаты анализов и диагно­стирует общее самочувствие по некоторым критериям, психолог следит, соответственно, за психологическим состоянием. Т. е. врач не подписан на изменения в физической форме боксера, а психолог не берет у него анализ крови и т. д. Каждый компо­нент системы под названием «Боксер и его команда» отвечает только за то, за что способен ответить максимально эффективно (к слову, это есть пример реализации паттерна Information expert («Информационный эксперт») из числа основных GRASP-пат­тернов). Также любой из команды может отписаться от под­писки – перейти к другому боксеру, сменить специализацию или попросту уволиться из команды. Т. е. мы наблюдаем все ос­новные аспекты реализации паттерна «Наблюдатель» в макро­мире.
177
Осмысление структуры паттерна. Структура паттерна предполагает довольно высокий уровень динамики связей между ПК и определяется особенностями и спецификой каждой кон­кретной реализации. На отдельный субъект могут подписы­ваться какие угодно наблюдатели, и сам он не интересуется спецификой их реализации. Также наблюдателю ничто не ме­шает быть подписанным одновременно на несколько субъектов. В то же время для субъекта важно, чтобы его функционирова­ние было успешным, и только лишь в том случае, если програм­мная реализация напоминает пример с боксером, субъект зависит от своих наблюдателей. С другой стороны, наблюдатели также зависимы от субъекта и успешность их функционирования так­же им обусловлена. Если взять подобную гипотетическую ситу­ацию, то тип связи между ПК напоминает обоюдостороннюю композицию. Опять же, ничто не мешает реализовать субъект гораздо менее зависимым от наблюдателей или наоборот, и тог­да тип связи между ПК в системе уже предстанет агрегировани­ем. Или реализовать субъект таким образом, чтобы поставить наблюдателей в прямую одностороннюю от себя зависимость. Или поставить субъект в прямую зависимость от его наблюда­телей. А если абстрагировать паттерн «Наблюдатель» еще силь­нее и вновь взглянуть на его структуру, то мы увидим, что при определенных реализациях ничто не мешает субъекту и наблю­дателю так же динамично меняться местами. Резюмируя, как мы и постулировали изначально, связи в паттерне «Наблюда­тель» динамичны и зависят от контекста каждой конкретной ре­ализации.
Значимость паттерна в контексте разработки систем сильного ИИ. На первый взгляд, данный паттерн, если рассма-
тривать его в контексте разработки систем сильного ИИ, ничем особенным среди прочих паттернов не выделяется. Но если взглянуть несколько глубже, то здесь все же имеется некоторая уникальная особенность. А именно: беспрецедентный уровень динамики взаимосвязей и ответственностей между ПК, сформи­рованными в рамках реализации паттерна. Казалось бы, что и в этом нет ничего особенного и чрезмерно значимого для реа­лизации сильного ИИ. Однако нами предполагается, что для
178
создания системы сильного ИИ помимо уже упомянутого «пер­вичного бульона» необходим еще и механизм запуска процесса зарождения технотропного сознания. Мы с некоторой степенью уверенности можем постулировать, что для возникновения фе­номена уровня технотропного сознания необходим механизм самоорганизации. Т. е. механизм, который максимально «авто­номизирует» систему, делает ее внутренне самодостаточной. Разница между самоорганизованными системами и системами, не использующими данный механизм, примерно сопоставима с разницей между летящим снарядом, выпущенным из пушки, и летящей самостоятельно птицей: и снаряд, и птица летят, но есть, как говорится, нюанс. Это также примерно сопоставимо с разницей между системами слабого ИИ и сильного: и те, и дру­гие системы будут способны к обработке информации, но нюанс останется на своем месте. Далее, если абстрагировать сильнее даже такую абстракцию, как самоорганизация, то станет ясно, что все эмерджентные эффекты, все качественные «скачки», кри­тические преобразования и прочие феномены достигаются за счет всего лишь специфического (определенного в каждой реа­лизации) взаимодействия между компонентами, включенными в самоорганизационный процесс. Так как самоорганизация не является линейным процессом, то, соответственно, некие про­гнозы по поводу достигаемых ею результатов далеко не всегда оказываются верны. Собственно говоря, они верны только в том же смысле, в котором верно в рулетке ставить на черное. Соот­ветственно, при определении некой системы, которая после за­пуска должна будет функционировать на основе механизма са­моорганизации, никогда нельзя сказать заранее, какой ПК будет ведущим («передовиком», субъектом) и какой будет последую­щим (наблюдателем, «помощником»). Структура паттерна «На- блюдатель» с динамикой связей между компонентами паттерна позволяет предусмотреть подобную ситуацию. Мы можем про­сто абстрактно определить саму возможность возникновения в системе субъекта и наблюдателя, а какой именно ПК какую позицию займет и какую ответственность примет – это уже ре­шится «само» в ходе функционировании системы по самоорга­низованному типу.
179
12.4. Поведенческий паттерн «Состояние»
Идентификатор. Состояние (State).
Классические элементы. Контекст, состояние.
Назначение. Как указывается в Design patterns, «Состояние»
«позволяет объекту варьировать свое поведение в зависимости от внутреннего состояния. Извне создается впечатление, что из­менился класс объекта» [114, с. 291]. Паттерн «Состояние» пред­назначен для некоторого распределения сложной и обширной логики какого-либо ПК между несколькими ПК, каждый из которых представляет собой некую отдельную ипостась изна­чального компонента со свойственным ей специфическим функ­ционированием. Паттерн «Состояние» позволяет не допустить нарушения принципа высокой связности, а также обеспечить вы­полнение одного из принципов SOLID – принципа единствен­ной ответственности. Более того, здесь мы можем пойти дальше и постулировать, что при помощи данного паттерна обеспечива­ется выполнение еще одного из принципов SOLID, а именно принципа разделения ответственностей. Напомним, что принцип разделения ответственностей тезисно звучит так: ПК не должны зависеть от методов, которые они не используют. В определен­ном смысле данный принцип можно дополнить (с чуть менее ка­тегоричной коннотацией) следующим образом: нежелательно, чтобы ПК зависели от методов, которые они редко используют. Вместо этого продуктивнее было бы инкапсулировать содержи­мое подобного функционала в отдельные ПК. Казалось бы, что выгода неочевидна, ведь в любом случае будет иметь место ис­пользование одним программным компонентом либо метода, либо подкласса. На самом деле мероприятие подобного рода усилит связность базового ПК, упростит взаимодействие поль­зователя с системой и сделает саму систему гораздо более по­нятной с точки зрения управления ею. Можно предположить, что подобных редко используемых методов наличествует до­вольно большое количество. В каждом из них присутствует своя логика, свое состояние, уникальное поведение. И специфика каж­дого из этих методов может настолько различаться, что действи-
180
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]