=== Техническое задание для агента v0.1 ===
Агента первой версии предполагается сделать настолько простым, что для его создания будет достаточно технологий, предложенных в рамках проекта и на данный момент полностью готовых к реализации.
== Интерфейс агента ==
Агент существует в среде с дискретным временем. Каждый такт времени он получает из среды состояние своих рецепторов, затем вычисляет собственную реакцию и возвращает состояние своих эффекторов. Программное взаимодействие со средой осуществляется по средствам интерфейса:
// Универсальный интерфейс интеллекта агента v0.1
class IIntelligenceInterface01 {
public:
typedef std::vector TIoDataContainer; // Контейнер данных эффекторов и рецепторов
// Прожить 1 такт времени, [in] receptors - состояние рецепторов, [out] effectors - состояние эффекторов
virtual void TimeStep( const TIoDataContainer& receptors, TIoDataContainer& effectors ) = 0;
};
== Параметры агента ==
У агента имеется фиксированные (неизменные в течении жизни) количества эффекторов и рецепторов, которые задаются средой при создании агента. Каждый рецептор и эффектор может находится любом состоянии в диапазоне [0, MaxVal] где MaxVal - фиксированное в течении жизни число, индивидуальное для каждого рецептора и эффектора. Количества состояний задаются средой при создании агента. В качестве конкретных MaxVal не рекомендуется брать числа больше 10. **Рецептор с индексом 0 является оптимизируемым** поэтому агент будет действовать так, чтобы значения этого рецептора были максимальны.
== Реализация агента ==
// Реализация интеллекта агента v0.1
class CIntelligenceV01 : public IIntelligenceInterface01 {
public:
typedef std::vector TIoLimitsContainer; // Контейнер данных о допустимых диапазонах IO данных
// receptorsLimits - количества состояний для каждого рецептора,
// effectorsLimits - количества состояний для каждого эффектора
CIntelligenceV01( const TIoLimitsContainer& receptorsLimits, const TIoLimitsContainer& effectorsLimits );
// IIntelligenceInterface01
virtual void TimeStep( const TIoDataContainer& receptors, TIoDataContainer& effectors );
private:
const TIoLimitsContainer receptorsLimits;
const TIoLimitsContainer effectorsLimits;
typedef std::vector TDistributionType; // Тип для статистических распределений
typedef std::vector TDistributionsContainer; // Контейнет из статистических распределений
// Кластер статистической модели мира
struct CCluster {
CCluster( int receptorsCount, int effectorsCount );
TDistributionsContainer ReceptorsStatistics;
TDistributionsContainer EffectorsStatistics;
TDistributionType ContextStatistics;
TDistributionType::value_type Weight;
TDistributionType::value_type Expectation;
};
typedef std::vector TClustersContainer;
TClustersContainer worldModel;
TDistributionType context;
TIoDataContainer prevStepEffectors;
// Описание кандидата нового состояния эффектора
struct CEffectorVariant {
CEffectorVariant( TDistributionType::value_type likelihood, int testedStateIndex,
TIoDataContainer::value_type variant );
const TDistributionType::value_type Likelihood;
const int TestedStateIndex;
const TIoDataContainer::value_type Variant;
};
// Компаратор кандидатов
struct CEffectorVariantComparer : public std::binary_function {
bool operator()( const CEffectorVariant& left, const CEffectorVariant& right ) const;
};
// Массив приоритетных очередей
typedef std::vector< std::priority_queue,
CEffectorVariantComparer> > TVariantQueuesContainer;
// Описание протестированного состояния эффектора
typedef std::vector< std::vector > TVariantsContainer;
class CEffectorsTestedState {
public:
CEffectorsTestedState( const TIoDataContainer& effectors );
// Породить новую комбинацию
CEffectorsTestedState( CEffectorsTestedState& baseState,
int effectorIndex, TIoDataContainer::value_type newVariant );
const TIoDataContainer& Effectors() const { return effectors; }
const TVariantsContainer& TestedVariants() const { return testedVariants; }
private:
TVariantsContainer testedVariants; // протестированные комбинации
TIoDataContainer effectors; // состояние эффекторов
};
typedef std::vector TTestedStatesContainer;
void calculateNextStepContext( const TIoDataContainer& receptors, TDistributionType& adArchive ) const;
void updateStatistics( const TIoDataContainer& receptors, const TDistributionType& adArchive );
void findBestReaction( const TDistributionType& adArchive, TIoDataContainer& effectors ) const;
};