singlepost

модель кота << На главную или назад  

а вот взбрело мне в голову написать модель кота.
Кот должен:
-иметь характеристики:
сытость
сонливость
довольность
-уметь выполнять действия:
есть
спать
идти чтобы его погладили

соответственно,
если кот голоден – он идет есть (сытость увеличивается)
если кот хочет спать – он спит (сонливость уменьшается)
если он недоволен – он идет чтобы его погладили (довольность увеличивается)

довольность кота определяется как сумма сытости и сонливости с некоторыми коэффициентами (что не очень важно)
выполнение каждого действия снижает все характеристики на единицу например (что не очень важно)

Модель хочется сделать легко расширяемой, т.е. чтобы легко можно было добавить или еще десяток свойств коту, или изменить его алгоритм выполнения действий (например чтобы он проснувшись сперва ел и потом цел чтобы его погладили, или наоборот) или добавить десяток котов, чтобы они при перемещении по некоей площади где размещены источники пищи и места где их гладят или мырлыкали друг на друга или кусали в зависимости от довольства, итд…
"Легко" – это значит не требовало переписывания бОльшей части программы.

Интуитивно понятно, чтореализация на любом языке типа ява, с++, питон,… возможна но неудобна.

Собстно вопрос(ы):
- где (какая дисциплина) разбирает такие задачи?
- верно ли понимание что для удобного решения такой задачи стоит сделать специализированный язык?

28 ответов в теме “модель кота”

  1. 28
    Людмила Уланова ответил:

    По-моему, Вам будет проще всего смоделировать вашего кота как мультиагентную систему. Загуглите теорию по мультиагентным системам. Там онтология (именно Онтология) есть, в которой можно задавать самые различные свойства и отношения. А на чём писать мультиагентную систему – это уж вы сами решайте.)))) Можно и движки, наверно, поискать.

  2. 27
    Расул Фазлыев ответил:

    Может, не в тему, но:

    MODEL Cat;
    USE syslib;

    TCat aCat;

    CLASS TCat []
    LIST Properties = [sleeping];
    FUNCTION LIST Actions = [eat, sleep, go];
    END TCat;

    CODE
    SET PROBABILITY OF aCat.Actions[sleep] BY aCat.Properties[sleeping];

    END MODEL Cat.

  3. 26
    Василий Some ответил:

    #26 за ссылки на статьи спасибо, почитаю на досуге…

    #22 мне видится все чуть проще: объекты просто содержат списки именованных атрибутов (однотипных) и имя функции (указатель на нее, если угодно, в терминах с++). Функции хранятся во внешних по отношению к движку файлах.
    Это одна из предпосылок, почему , возможно, уйду на питон – тогда конфиг может содержать куски кода (функции) которые можно будет вызывать
    но это пока только мысли…

    #24 взять готовое практичнее когда нужно срочно сделать. А мне интересно понять как самому такое написать. Т.к. это нужно только мне – могу ковыряться в свое удовольствие сколько нужно времени

  4. 25
    Антон Кононов ответил:

    в википедии статья интересная
    поиск по: Игровой искусственный интеллект

    внизу ссылок много

  5. 24
    Антон Кононов ответил:

    еще куча статей на английском:
    //www.devmaster.net/articles.php

  6. 23
    Влад Иванов ответил:

    мб стоит поискать какие-то новые движки ai? видел простой двиг дя делфи… а если расширять плагинами?

    ps интересно, моя кошка на чем написана… спрошу у нее как-нибудь

  7. 22
    Богдан Черненко ответил:

    пишите кота на Action Script 3.0, а переменные поведения кота выносите во внешний XML файл. Код переписывать не придется, просто сразу сделать модель наивозможно более полной, вплоть до "кот в Матрице" или "кот во время ядерной войны в Матрице" )) Кстати, заодно и нарисуете собсно кота, без этого в AS3 никак…

  8. 21
    Нгамдкхе Кверос ответил:

    у вас есть объект кот,
    он состоит из

    списка характеристик,
    список действий,
    функции принятия решения.
    наверно ещё понадобятся (рано или поздно пригодятся)
    вид (кот, собака,…)
    кличка (идентификатор кота)

    в зависимости от условий функцию принятия решений можно иметь или как она есть создавая кучу классов переопределяющих данный или как указатель на функцию определяя которую фактически будете определять кота, конкретней нужно смотреть, что удобней или что чаще будет меняться и что от чего зависить. допустим если есть 3 типа принятия решений и пять списков характеристик а коты строятся рандомайзом то делать 15 классов окажется перебором и не достаточно гибким, тогда указатели на функции выиграют.

  9. 20
    Василий Some ответил:

    сейчас думаю в сторону третьего варианта
    есть идея имплементировать довольно базовые вещи (действие, свойство, поведение, объект) отдельными модулями (может бинарными) чтобы иметь возможность гибкой настройки окружения, объекты могут быть вложенными (т.е. объект может содержать список объектов)
    пользуясь базовыми вещами описывать модель

    Описание мира – внешний конфиг, по которому создаются объекты

    пока не понял (не придумал) как реализовать взаимодействие между объектами на одном уровне, или воздействие объекта с нижнего уровня на вышестоящий объект

    язык – пока плюсы (ибо на них мне естественнее всего писать), но видимо все кончится питоном, если пойдет таким путем.

    Или же, если все-таки это будет язык – то через yacc + далее обертка какая-нить

    ЗЫ вредно самому себе придумывать интересные задачи :)

  10. 19
    Александр Микинас ответил:

    to Василий:
    Каким именно образом вы собираетесь расширять модель ? Мне например видиться несколько способов:
    1. Создать класс AbstractCat и наследовать от него, переписывая нужные методы.
    2. Использовать паттерн "стратегия". Расширение в этом случае – создание класса, который реализует какую то одну особенность кота, например искать пищу по запаху.
    3. Использовать паттерн "команда". Наиболее сложный, но и наиболее гибкий вариант. Имеется набор простых классов-команд, которые может выполнять кот. Более сложное поведение строиться путем их комбинирования.
    Никто не запрещает применять все 3 подхода вместе. От языка исполнения зависит немного, все языки эквивалентны машине Тьюринга, поэтому выше головы здесь не прыгнешь.

  11. 18
    zubr kabbi ответил:

    есть такая штука – Artificial intelligence, в играх используется как компьютерный интеллект… а зачем все так сложно? на ООП и на том же LUA можно сделать очень просто и очень легкоизменяемо…

  12. 17
    Александр Васюченко ответил:

    #16 боты квака это уже типичный пример искуственного интелекта

  13. 16
    Василий Some ответил:

    о! пасиба, пойду искать и смотреть

    это конечно отправная точка, но как это делать правильно? :( (
    в смысле есть ли какая-то теория как создавать такого рода программы?

  14. 15
    Антон Кононов ответил:

    отвечаю автору темы:

    есть такой движок Raven AI Game Engine. А проще "Raven".

    к нему прилагается наиподробнейшие исходники на сях. Он делает все то, что ты просил от движка. Но вот незадача: я не могу его найти. Гугль мне не помог :( если найдешь Raven – кинь ссылку, я тоже скачаю.

    Он у меня был давно, но потерялся. К нему еще книга прилагается с подробным описанием и принципом работы.

    Самый последний пример – это модель поведения игроков Quake. Забавно наблюдать когда видишь о чем думает каждый бот (там рядом с каждым ботом окошко и в нем все мысли бота, не одна мысль, а именно мысли. Бот сам решает что лучше взять броню или сбегать за здоровьем в зависимости от окружающей обстановки).

  15. 14
    Василий Some ответил:

    #13 все правильно, можно написать на чем угодно.
    но хочется создать легко изменяемую модель (оператором, не из программы)
    ЛЕГКО изменяемую. Т.е. чтобы легко было изменить поведение модели, например, переставив просто две строки (аргумент что в яве или с++ это просто переставление вызовов двух методов – не канает, могу придумать ситуацию когда не пройдет)

    ключевое в задаче (решение которой я ищу) – как правильно делать легко изменяемые модели. Очень похожие друг на друга…

  16. 13
    Василий Some ответил:

    просто представьте – делаем кота, который удовлетворяет первому описанию
    дальше хотелось бы иметь возможность легко, с колоссальным реюзом кода(?) :

    дать ему возможность ходить по полю, где есть источники еды/сна/почесывания
    ИЛИ
    сделать стадо котов бродящее по полю
    ИЛИ
    сделать стадо котов и собак бродящее по полю

    при этом МИНИМАЛЬНО изменяя исходный код

    Мне интересно понять как такое сделать, если сделать это можно. Или какая наука отвечает за такое… Мат. моделирование это чуть-чуть чересчур общая формулировка.

  17. 12
    Игорь Толкачников ответил:

    Вы загоняетесь…Можно написать и на Java и на Delphi и на C++. Нужна модель с коэффицентами – учи мат. мод. Нужен алгоритм – теория графови конечных автоматов. Нужно размножить по образу и подобию? Правильно тебе сказали – ООП.

  18. 11
    Александр Васюченко ответил:

    может тут чёта с искуственным интелектом связано,раз речь зашла о динамическом изменении кода…

  19. 10
    Василий Some ответил:

    #8 знаю…
    вот только за кодом скрывается собственно модель
    и главный минус такого подхода: как только хочется расширить модель – ее нужно целиком переписать. или очень многое в ней…

  20. 9
    Расул Фазлыев ответил:

    А в Java можно динамически, из программы добавлять методы и свойства? Или заменять их код?

  21. 8
    Александр Васюченко ответил:

    #9 Можно динамически изменять данные объекта, и через уже написанные методы обрабатывать новые данные соответсвующим образом. Чем не решение?

  22. 7
    Александр Микинас ответил:

    Я бы смотрел в сторону dotnet или Java. Особенно если хочется не останавливать кота перед тем как его расширить :) .Под dotnet есть и функциональные языки – F#

  23. 6
    Александр Васюченко ответил:

    Василий, в ООП можно спокойно добавлять новые виртуальные функции и новые данные в обект…

  24. 5
    Василий Some ответил:

    чем плохо создание специально заточеннного под текущую модель языка?

    бегло посмотрел на GPSS и BPEL – может быть на них и можно решить задачу, но нет ощущения что это будет удобнее чем на плюсах..

  25. 4
    Василий Some ответил:

    да очень просто – да, можно и на плюсах все это написать.
    вот только, расширяемость модели будет никакая.
    Т.е. чтобы играться с моделью (сделать из одного кота стадо котов, или добавить в модель собак и мышей) нужно почти (или просто полностью) полностью перевернуть всю программу на плюсах.

    соответственно, хотелось бы понять – а как такое делать правильно?

  26. 3
    Денис Тучин ответил:

    Можно посмотреть в сторону моделирования бизнес процессов, тогда подойдет язык BPEL.
    Можно посмотреть в сторону имитационного моделирования, тогда можно вспомнить о языке GPSS.

  27. 2
    Александр Васюченко ответил:

    А чего ООП не нравиться для такой задачи?

  28. 1
    Марина Гаврилина ответил:

    можно посмотреть в сторону функционального программирования. Хотя то, что ты описал можно и на сях легко написать.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.