AI на чем писать ???
От: adontz Грузия http://adontz.wordpress.com/
Дата: 29.03.02 01:32
Оценка:
Есть необходимоть написать искуственный интеллект
Есть желание написать на C / Pascal / Basic подобном языке программирования, а не мучать матрицы, ссписки и прочую муру
Есть необходимость использовать этот AI в программе на C++
Есть желание не вшивать в программу и не писать dll-ками а использовать какой нибудь скрипт, например те же Java и VB
Чё делать есть прога должна работать на 98/Me/NT/2K/XP (так что Windows Scripting Host накрылся)
Имеется ввиду именно логика а не обработка данных и предопределённое поведение так что SQL подобные языки с конструкциями
SELECT solution FROM expirience WHERE situation = currentsituation

не тянут
Ответы типа "А не написать ли тебе мужик компилятор/интепретатор такого хорошего языка ка Tufta++" не принимаются !!!
типа мне лень

Заранее спасибо
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: AI на чем писать ???
От: retalik www.airbandits.com/
Дата: 29.03.02 04:07
Оценка: 24 (2)
Здравствуйте adontz, Вы писали:

A>Есть необходимоть написать искуственный интеллект

A>Есть желание написать на C / Pascal / Basic подобном языке программирования, а не мучать матрицы, ссписки и прочую муру
A>Есть необходимость использовать этот AI в программе на C++
A>Есть желание не вшивать в программу и не писать dll-ками а использовать какой нибудь скрипт, например те же Java и VB
A>Чё делать есть прога должна работать на 98/Me/NT/2K/XP (так что Windows Scripting Host накрылся)
Почему накрылся? Распространяешь с прогой Scripting RunTime (~800 кил).
Да дело даже не в этом, хотя WSH — самый простой способ вызывать скрипты из программы. Подробнее здесь:
http://www.rsdn.ru/forum/message.asp?mid=39344
Автор: Gambler
Дата: 27.03.02


Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):

class CScriptSite: public IActiveScriptSite
{
    // IUnknown 
    STDMETHOD(QueryInterface)(REFIID iid,void** ppvObjOut)
    {
        *ppvObjOut = NULL;
        return E_NOINTERFACE;
    }
    ULONG __stdcall AddRef () { return 1; }
    ULONG __stdcall Release() { return 1; }

    // IActiveScriptSite 
    STDMETHOD(GetItemInfo)(LPCOLESTR,DWORD,
        IUnknown**,ITypeInfo**)           { return TYPE_E_ELEMENTNOTFOUND; }
    STDMETHOD(GetLCID)(LCID *plcid)       { return E_NOTIMPL; }
    STDMETHOD(GetDocVersionString)(BSTR*) { return E_NOTIMPL; }
    STDMETHOD(OnScriptTerminate)
        (const VARIANT*,const EXCEPINFO*) { return S_OK; }
    STDMETHOD(OnScriptError)
        (IActiveScriptError *pError)      { return S_OK; }
    STDMETHOD(OnStateChange)(SCRIPTSTATE) { return S_OK; }
    STDMETHOD(OnEnterScript)()            { return S_OK; }
    STDMETHOD(OnLeaveScript)()            { return S_OK; }    
};

HRESULT CallScript(BSTR ScrEngine, const char *script)
{
    CScriptSite ss;
    CComPtr<IActiveScriptParse> spASP;
    CComPtr<IActiveScript> spAS;
    HRESULT hr;
    if( FAILED(hr = spAS.CoCreateInstance(ScrEngine))) return hr;
    if( FAILED(hr = spAS ->SetScriptSite(&ss))) return hr;
    if( FAILED(hr = spAS ->QueryInterface(IID_IActiveScriptParse, (void**)&spASP))) return hr;
    if( FAILED(hr = spASP->InitNew())) return hr;
    if( FAILED(hr = spASP->ParseScriptText(CComBSTR(script),0,0,0,0,0,SCRIPTTEXT_ISVISIBLE,0,0))) return hr;
    if( FAILED(hr = spAS ->SetScriptState(SCRIPTSTATE_CONNECTED))) return hr;
    return S_OK;
}

Вызывается так:
char meg_of_ai_code[]="..."; //тут, собственно, программа
CallScript(CComBSTR("VBScript"), meg_of_ai_code);

А еще проще получится, если использовать Script Control, который идет с 6-й студией.

A>Имеется ввиду именно логика а не обработка данных и предопределённое поведение так что SQL подобные языки с конструкциями

A>
A>SELECT solution FROM expirience WHERE situation = currentsituation
A>

A>не тянут
A>Ответы типа "А не написать ли тебе мужик компилятор/интепретатор такого хорошего языка ка Tufta++" не принимаются !!!
A>типа мне лень
А чего же тогда в форуме "Алгоритмы" спрашиваешь? ActiveX, имхо, больше подойдет.
Ну, еще могу посоветовать какой-нить интертрепатор BASIC в исходниках (у меня самого в пыльных архивах штуки 2 валяется).

A>Заранее спасибо

PS: AI, часом, не для игрушки клепаешь?
Успехов,
Виталий.
Re[2]: AI на чем писать ???
От: adontz Грузия http://adontz.wordpress.com/
Дата: 29.03.02 04:21
Оценка:
Здравствуйте retalik, Вы писали:

R>Здравствуйте adontz, Вы писали:


R>Почему накрылся? Распространяешь с прогой Scripting RunTime (~800 кил).

А он freeware ? на сайте Microsoft скачивается ? Если так тогда хоть на Perl-ле пиши

R>http://www.rsdn.ru/forum/message.asp?mid=39344
Автор: Gambler
Дата: 27.03.02


R>Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):

Который IE если не затруднит ?
R>Вызывается так:
R>
R>char meg_of_ai_code[]="..."; //тут, собственно, программа
R>CallScript(CComBSTR("VBScript"), meg_of_ai_code); 
R>


Здесь как я понимаю вместо VBScript можно только JScript/JavaScript ?
Кстати как передать функции на скрипте параметры ? или только в скрипт вшивать ? Но тогда как их оттуда получить ? Должен же скрипт что-то делать !

R>А еще проще получится, если использовать Script Control, который идет с 6-й студией.

Не пользовался (первый раз слышу, может потому что у меня в инсталляции только C++ и InterDev ?) можно по-подробнее...

R>Ну, еще могу посоветовать какой-нить интертрепатор BASIC в исходниках (у меня самого в пыльных архивах штуки 2 валяется).


R>PS: AI, часом, не для игрушки клепаешь?


Ну а как же В цель !

Надо же хоть где-то ум проявить, если не работе то в игре точно!

Большое спасибо за быстрый ответ
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: AI на чем писать ???
От: retalik www.airbandits.com/
Дата: 29.03.02 05:19
Оценка: 48 (3)
Здравствуйте adontz, Вы писали:

R>>Почему накрылся? Распространяешь с прогой Scripting RunTime (~800 кил).

A>А он freeware ? на сайте Microsoft скачивается ? Если так тогда хоть на Perl-ле пиши
Угу. Но AI на Perl я себе слабо представляю

R>>Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):

A>Который IE если не затруднит ?
В котором скриптовый движок есть. AFAIR, 3.0 и новее.

R>>Вызывается так:

R>>
R>>char meg_of_ai_code[]="..."; //тут, собственно, программа
R>>CallScript(CComBSTR("VBScript"), meg_of_ai_code); 
R>>


A>Здесь как я понимаю вместо VBScript можно только JScript/JavaScript ?

Передается ProgId установленного в системе скриптового движка (например, "PerlScript", если он есть).

A>Кстати как передать функции на скрипте параметры ? или только в скрипт вшивать ? Но тогда как их оттуда получить ? Должен же скрипт что-то делать !

Ну, приведенный пример ничего этого не позволит — слишком обрезанная реализация IActiveScriptSite. IT предлагал вариант посильнее, позволяющий передать параметры и получить результат.
А вообще, прелесть в том, что в скриптовый движок можно передавать объекты — любые классы с реализацией IDispatch, и работать с ними из скрипта.

R>>А еще проще получится, если использовать Script Control, который идет с 6-й студией.

A>Не пользовался (первый раз слышу, может потому что у меня в инсталляции только C++ и InterDev ?) можно по-подробнее...
Поищи на машине msscript.ocx. Последнюю версию можно опять же скачать с MS for free.

Используется он очень просто, дока к нему есть в MSDN.
Вот, раскопал пример, где я производительность сравнивал с C++ — кодом:

#include <stdio.h>
#include <math.h>

#import "msscript.ocx"
using namespace MSScriptControl;

// два куска кода - на C++ и на скрипте
// Выражение должно вычисляться со значением 1
void runC()
{
    double s=0, sum=0, counter=0;
    for(double i=0;i<1;i+=0.000001){ 
        s=sqrt(pow(sin(i),2)+pow(cos(i),2)); //==1
        sum+=s; counter++;
    }
}

// А это на JScript. sin, cos, pow и sqrt сделаны глобальными (см. ниже)
char *statement=
"sum=counter=0;"
"for(i=0;i<1;i+=0.000001){ "
"s=sqrt(pow(sin(i),2)+pow(cos(i),2));"
"sum+=s; counter++;}";

main()
{
    CoInitialize(NULL);
    long t1=0, t2=0;
    try {
        IScriptControlPtr pScript;
        pScript.CreateInstance("ScriptControl");
        pScript->Timeout = -1; //не прерывать выполнение по таймауту
        pScript->Language="JScript";
        //так можно получить объект из скрипта:
        _variant_t Math = pScript->Eval("Math"); 
        //а так - сделать его методы глобальными:
        pScript->AddObject("MathMath", LPDISPATCH(Math), VARIANT_TRUE);
        long start = GetTickCount();
        pScript->ExecuteStatement(statement);
        t1 = GetTickCount()-start;
        printf("t1=%d ms\n", t1);
        start = GetTickCount();
        runC();
        t2 = GetTickCount()-start;
        printf("t2=%d ms\n", t2);
        //А правильно ли он считает?
        _bstr_t sum = pScript->Eval("sum");
        printf("sum=%s\n", (LPCTSTR)sum);

    }
    catch(_com_error &e)
    {
        MessageBox(0, e.Description(), "Error", MB_OK|MB_ICONHAND);
    }
    CoUninitialize();
    return 0;
}


У меня код на JScript выполняется 13 секунд (миллион итераций), сишный — .982 секунды.
Разница всего в 13 раз!

R>>PS: AI, часом, не для игрушки клепаешь?

A>Ну а как же В цель !
A>Надо же хоть где-то ум проявить, если не работе то в игре точно!
Вот тут мы и перешли от технологий к алгоритмам
Дело в том, что я не придумал, как реализовать многозадачность в скриптах. То есть, каждый объект, управляемый скриптом на AI, должен иметь собственный движок, выполняющийся в собственном потоке. А это жрет ресурсы (правда, не знаю, насколько).
Вот если бы можно было переключение реализовать (без сброса текущего состояния)...
Успехов,
Виталий.
Re[4]: AI на чем писать ???
От: adontz Грузия http://adontz.wordpress.com/
Дата: 29.03.02 07:28
Оценка:
Здравствуйте retalik, Вы писали:

R>Угу. Но AI на Perl я себе слабо представляю :)

Я тоже, это я так, к слову :shuffle:

R>В котором скриптовый движок есть. AFAIR, 3.0 и новее.

Ну это вполне приемлемо, с 98-й виндой 5-й поставляется, а мне 98-я как минимум

A>>Здесь как я понимаю вместо VBScript можно только JScript/JavaScript ?

R>Передается ProgId установленного в системе скриптового движка (например, "PerlScript", если он есть).
Ясно, но перл вряд ли будет установлен.... да и "AI на Perl я себе слабо представляю" copyright (c) retalik

A>>Кстати как передать функции на скрипте параметры ? или только в скрипт вшивать ? Но тогда как их оттуда получить ? Должен же скрипт что-то делать !

R>Ну, приведенный пример ничего этого не позволит — слишком обрезанная реализация IActiveScriptSite. IT предлагал вариант посильнее, позволяющий передать параметры и получить результат.
R>А вообще, прелесть в том, что в скриптовый движок можно передавать объекты — любые классы с реализацией IDispatch, и работать с ними из скрипта.
Но их для этого надо зарегистрировать или как ?
А, кстати, что если передать параметры в виде констант в самом коде ? Это быстее ? (если в курсе конечно)

R>>>А еще проще получится, если использовать Script Control, который идет с 6-й студией.

A>>Не пользовался (первый раз слышу, может потому что у меня в инсталляции только C++ и InterDev ?) можно по-подробнее...
R>Поищи на машине msscript.ocx. Последнюю версию можно опять же скачать с MS for free.
Нашёл, даже 3 штуки, правда слава богу одна та же версия 1.0.0.4615

R>Используется он очень просто, дока к нему есть в MSDN.

Буду читать

R>Вот, раскопал пример, где я производительность сравнивал с C++ — кодом:


R>
R>#include <stdio.h>
R>#include <math.h>

R>#import "msscript.ocx"
R>using namespace MSScriptControl;

R>// два куска кода - на C++ и на скрипте
R>// Выражение должно вычисляться со значением 1
R>void runC()
R>{
R>    double s=0, sum=0, counter=0;
R>    for(double i=0;i<1;i+=0.000001){ 
R>        s=sqrt(pow(sin(i),2)+pow(cos(i),2)); //==1
R>        sum+=s; counter++;
R>    }
R>}

R>// А это на JScript. sin, cos, pow и sqrt сделаны глобальными (см. ниже)
R>char *statement=
R>"sum=counter=0;"
R>"for(i=0;i<1;i+=0.000001){ "
R>"s=sqrt(pow(sin(i),2)+pow(cos(i),2));"
R>"sum+=s; counter++;}";

R>main()
R>{
R>    CoInitialize(NULL);
R>    long t1=0, t2=0;
R>    try {
R>        IScriptControlPtr pScript;
R>        pScript.CreateInstance("ScriptControl");
R>        pScript->Timeout = -1; //не прерывать выполнение по таймауту
R>        pScript->Language="JScript";
R>        //так можно получить объект из скрипта:
R>        _variant_t Math = pScript->Eval("Math"); 
R>        //а так - сделать его методы глобальными:
R>        pScript->AddObject("MathMath", LPDISPATCH(Math), VARIANT_TRUE);
R>        long start = GetTickCount();
R>        pScript->ExecuteStatement(statement);
R>        t1 = GetTickCount()-start;
R>        printf("t1=%d ms\n", t1);
R>        start = GetTickCount();
R>        runC();
R>        t2 = GetTickCount()-start;
R>        printf("t2=%d ms\n", t2);
R>        //А правильно ли он считает?
R>        _bstr_t sum = pScript->Eval("sum");
R>        printf("sum=%s\n", (LPCTSTR)sum);

R>    }
R>    catch(_com_error &e)
R>    {
R>        MessageBox(0, e.Description(), "Error", MB_OK|MB_ICONHAND);
R>    }
R>    CoUninitialize();
R>    return 0;
R>}
R>


Вот за это большое спасибо !!!

R>У меня код на JScript выполняется 13 секунд (миллион итераций), сишный — .982 секунды.

R>Разница всего в 13 раз!

Неплохо, интересно от смены языка это сильно изменится.

R>>>PS: AI, часом, не для игрушки клепаешь? :shuffle:

A>>Ну а как же :) В цель !
A>>Надо же хоть где-то ум проявить, если не работе то в игре точно!
R>Вот тут мы и перешли от технологий к алгоритмам :)
А говорили не в тот форум :))
R>Дело в том, что я не придумал, как реализовать многозадачность в скриптах. То есть, каждый объект, управляемый скриптом на AI, должен иметь собственный движок, выполняющийся в собственном потоке. А это жрет ресурсы (правда, не знаю, насколько).
R>Вот если бы можно было переключение реализовать (без сброса текущего состояния)...
Я поставил перед собой более сложную задачу
А именно, я хочу добиться (ну ясно конечно что ничего не выйдет но хочу вот пока) согласованности действий отдельных элементов одной команды. Т.е. чтоб они не на пролом шли а с тактическим расчётом
Для этого и одного потока хватит — генеральского
Только генерал башковитый нужен
А насчёт многозадачности... Ну так ведь и обычная многозадачность ето всего лишь частое переключение между потоками
Так что насоздавай кучу потоков и вызывай в них msscript (прикол если он не поддерживает многозадачность)

А вообще интересно, мне уже и не лень писать компилятор !
Может есть смысл писать код на си в виде одного cpp файла который содержит всего одну функцию с уже заранее предопределёнными параметрами и компилировать её каждый раз в dll, cl.exe+link.exe = 514 101 bytes так что не тяжело ! Да и на понятном языке написано

А есть ли ещё какие ScriptHosts ?
Есть ли такие в которых как в SQL можно создавать уже отпарсеные процедуры с параметрами ?

А вообще большое спасибо !

PS Я вас уже достал наверное, просто всё что я нашёл путного было для VB, а писать на VB 3D весьма странно
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: AI на чем писать ???
От: retalik www.airbandits.com/
Дата: 29.03.02 08:18
Оценка: 12 (1)
Здравствуйте adontz, Вы писали:

A>Ну это вполне приемлемо, с 98-й виндой 5-й поставляется, а мне 98-я как минимум

Я в свое время просто переносил jscript.dll и регистрировал на тех клиентских машинах, на которых не было IE.

R>>А вообще, прелесть в том, что в скриптовый движок можно передавать объекты — любые классы с реализацией IDispatch, и работать с ними из скрипта.

A>Но их для этого надо зарегистрировать или как ?
Если под "зарегистрировать" понимается "внести в пространство имен скрипта", то да.
Для этого их достаточно передать скрипту в виде параметров функций или вызвать IActiveScript::AddNamedItem (для Script Control все проще, достаточно вызвать AddObject, как в примере)

A>А, кстати, что если передать параметры в виде констант в самом коде ? Это быстее ? (если в курсе конечно)

Не знаю, но было бы любопытно оценить.

A>А вообще интересно, мне уже и не лень писать компилятор !

A>Может есть смысл писать код на си в виде одного cpp файла который содержит всего одну функцию с уже заранее предопределёнными параметрами и компилировать её каждый раз в dll, cl.exe+link.exe = 514 101 bytes так что не тяжело ! Да и на понятном языке написано
Если не надо динамически создавать/изменять логику AI, я бы вообще не усложнял задачу. Можно обычными COM-модулями обойтись.
А вот если "генерал" будет раздавать "команды" на JScript, это было бы круто
A>А есть ли ещё какие ScriptHosts ?
A>Есть ли такие в которых как в SQL можно создавать уже отпарсеные процедуры с параметрами ?
Есть, это надо копать интерфейсы IActiveScriptParse.

A>А вообще большое спасибо !

A>PS Я вас уже достал наверное, просто всё что я нашёл путного было для VB, а писать на VB 3D весьма странно
Почему же, на CodeGuru есть статья, где доказывается, что игры только на VB и надо писать
Успехов,
Виталий.
Re[2]: AI на чем писать ???
От: IT Россия linq2db.com
Дата: 03.05.02 02:27
Оценка:
Здравствуйте retalik, Вы писали:

R>Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):


А называл меня за это извращенцем
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: AI на чем писать ???
От: retalik www.airbandits.com/
Дата: 06.05.02 01:46
Оценка:
Здравствуйте IT, Вы писали:

R>>Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):

IT>А называл меня за это извращенцем
Ты меня с кем-то путаешь, я предлагал тебя за это гением назвать
Успехов,
Виталий.
Re[4]: AI на чем писать ???
От: IT Россия linq2db.com
Дата: 06.05.02 02:04
Оценка:
Здравствуйте retalik, Вы писали:

R>>>Вот пример, которому и WSH не нужен, достаточно только IE (оригинал привел Игорь Ткачёв, упростил я):

IT>>А называл меня за это извращенцем

R>Ты меня с кем-то путаешь, я предлагал тебя за это гением назвать


Значит в том контексте это звучало одинаково
Если нам не помогут, то мы тоже никого не пощадим.
Re: AI на чем писать ???
От: bkat  
Дата: 06.05.02 13:06
Оценка:
Здравствуйте adontz, Вы писали:

A>Есть необходимоть написать искуственный интеллект

A>Есть желание написать на C / Pascal / Basic подобном языке программирования, а не мучать матрицы, ссписки и прочую муру
A>Есть необходимость использовать этот AI в программе на C++
A>Есть желание не вшивать в программу и не писать dll-ками а использовать какой нибудь скрипт, например те же Java и VB
A>Чё делать есть прога должна работать на 98/Me/NT/2K/XP (так что Windows Scripting Host накрылся)
A>Имеется ввиду именно логика а не обработка данных и предопределённое поведение так что SQL подобные языки с конструкциями
A>
A>SELECT solution FROM expirience WHERE situation = currentsituation
A>

A>не тянут
A>Ответы типа "А не написать ли тебе мужик компилятор/интепретатор такого хорошего языка ка Tufta++" не принимаются !!!
A>типа мне лень

Позволю себе поехидничать :-)
А почему тут не обсуждается вопрос под Win или Linux лучше писать AI?
А может лучше для этого мышку беспроводную купить? Тоже ведь может помочь...

На мой взгляд, "на чем писать" — это вообще дело десятое и не только в AI.
Re: AI на чем писать ???
От: OlegO Россия http://www.mediachase.ru
Дата: 06.05.02 13:31
Оценка:
Здравствуйте adontz, Вы писали:

A>Есть необходимоть написать искуственный интеллект

A>Есть желание написать на C / Pascal / Basic подобном языке программирования, а не мучать матрицы, ссписки и прочую муру
A>Есть необходимость использовать этот AI в программе на C++
A>Есть желание не вшивать в программу и не писать dll-ками а использовать какой нибудь скрипт, например те же Java и VB
A>Чё делать есть прога должна работать на 98/Me/NT/2K/XP (так что Windows Scripting Host накрылся)
A>Имеется ввиду именно логика а не обработка данных и предопределённое поведение так что SQL подобные языки с конструкциями
A>
A>SELECT solution FROM expirience WHERE situation = currentsituation
A>

A>не тянут
A>Ответы типа "А не написать ли тебе мужик компилятор/интепретатор такого хорошего языка ка Tufta++" не принимаются !!!
A>типа мне лень

A>Заранее спасибо


Посмотри на сайтах для Гейм Девелоперов аля

http://www.gamedev.net/reference/list.asp?categoryid=18#62
С уважением, OlegO.
Re: AI на чем писать ???
От: flyker Россия  
Дата: 13.05.02 14:05
Оценка:
Здравствуйте adontz, Вы писали:

A>Есть необходимоть написать искуственный интеллект

A>Есть желание написать на C / Pascal / Basic подобном языке программирования, а не мучать матрицы, ссписки и прочую муру
A>Есть необходимость использовать этот AI в программе на C++
A>Есть желание не вшивать в программу и не писать dll-ками а использовать какой нибудь скрипт, например те же Java и VB
A>Чё делать есть прога должна работать на 98/Me/NT/2K/XP (так что Windows Scripting Host накрылся)
A>Имеется ввиду именно логика а не обработка данных и предопределённое поведение так что SQL подобные языки с конструкциями
A>
A>SELECT solution FROM expirience WHERE situation = currentsituation
A>

A>не тянут
A>Ответы типа "А не написать ли тебе мужик компилятор/интепретатор такого хорошего языка ка Tufta++" не принимаются !!!
A>типа мне лень

A>Заранее спасибо


Забей на скрипты, пиши перебором как в шахматах, вот это будет интеллект !
Все гениальное — просто
Re: AI на чем писать ???
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 14.05.02 08:43
Оценка:
Не знаю. Но по-моему все это есть в MATLAB. Собственный скриптовой язык, MATLAB to C++ compiler. Возможность подсоединять DLL-ки. Обширный математический аппарат. Плюс еще много всяких наворотов. Зачем придумывать что-то свое?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.