ΠΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΎΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ·Π½Π°Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ΅ΠΎΡΠΈΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (IIT).
ΠΠΎΠ΄Π΅Π»Ρ ΡΠΎΠ·Π½Π°Π½ΠΈΡ:
cpp
#include <avr/random.h>
#include <avr/pgmspace.h>
#define NEURON_COUNT 16
#define SYNAPSE_DENSITY 30 // 30% ΡΠ²ΡΠ·Π΅ΠΉ
#define PHI_THRESHOLD 100 // ΠΠΎΡΠΎΠ³ ΡΠΎΠ·Π½Π°Π½ΠΈΡ
// Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π΅ΠΉΡΠΎΠ½Π°
struct Neuron {
int8_t potential;
int8_t threshold;
uint8_t refractory;
uint8_t fired;
uint8_t inputCount;
};
// Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠΈΠ½Π°ΠΏΡΠ°
struct Synapse {
uint8_t source;
uint8_t target;
int8_t weight;
};
Neuron neurons[NEURON_COUNT];
Synapse synapses[NEURON_COUNT * NEURON_COUNT];
uint8_t synapseCount = 0;
uint8_t consciousness = 0;
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠ·Π½Π°Π½ΠΈΡ
void initConsciousness() {
for (uint8_t i = 0; i < NEURON_COUNT; i++) {
neurons[i].potential = random(-50, 50);
neurons[i].threshold = 100;
neurons[i].refractory = 0;
neurons[i].fired = 0;
neurons[i].inputCount = 0;
}
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠ²ΡΠ·ΠΈ
for (uint8_t i = 0; i < NEURON_COUNT; i++) {
for (uint8_t j = 0; j < NEURON_COUNT; j++) {
if (i != j && random(100) < SYNAPSE_DENSITY) {
synapses[synapseCount].source = i;
synapses[synapseCount].target = j;
synapses[synapseCount].weight = random(-10, 11);
synapseCount++;
neurons[j].inputCount++;
}
}
}
}
// Π€ΡΠ½ΠΊΡΠΈΡ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ (ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ)
void integrateInformation() {
// ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (Phi)
uint16_t phi = 0;
for (uint8_t i = 0; i < NEURON_COUNT; i++) {
// Π‘ΡΠΌΠΌΠΈΡΡΠ΅ΠΌ Π²Ρ
ΠΎΠ΄Ρ
int16_t inputSum = 0;
for (uint8_t j = 0; j < synapseCount; j++) {
if (synapses[j].target == i && neurons[synapses[j].source].fired) {
inputSum += synapses[j].weight;
}
}
// ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»
neurons[i].potential += inputSum / 4;
// ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ²ΡΠ·Π΅ΠΉ)
phi += abs(inputSum) * neurons[i].inputCount;
}
// ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠΎΠ·Π½Π°Π½ΠΈΡ
consciousness = phi / 100;
if (consciousness > 255) consciousness = 255;
}
// Π‘ΠΏΠ°ΠΉΠΊΠΈ (ΡΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π°ΠΊΡΡ)
void fireNeurons() {
for (uint8_t i = 0; i < NEURON_COUNT; i++) {
// Π Π΅ΡΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎΡΡΡ
if (neurons[i].refractory > 0) {
neurons[i].refractory--;
continue;
}
// ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠ³
if (neurons[i].potential >= neurons[i].threshold) {
neurons[i].fired = 1;
neurons[i].potential = 0;
neurons[i].refractory = 5;
// ΠΠ»Π°ΡΡΠΈΡΠ½ΠΎΡΡΡ (ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΡΡ)
for (uint8_t j = 0; j < synapseCount; j++) {
if (synapses[j].target == i) {
// STDP-like ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅
if (neurons[synapses[j].source].fired) {
synapses[j].weight += 1;
} else {
synapses[j].weight -= 1;
}
if (synapses[j].weight > 127) synapses[j].weight = 127;
if (synapses[j].weight < -128) synapses[j].weight = -128;
}
}
} else {
neurons[i].fired = 0;
// ΠΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ΅ ΡΠ³Π°ΡΠ°Π½ΠΈΠ΅
neurons[i].potential = (neurons[i].potential * 7) / 8;
}
}
}
// Π‘Π΅Π½ΡΠΎΡΠ½ΡΠΉ Π²Ρ
ΠΎΠ΄ (Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅)
void sensoryInput(uint8_t* input) {
for (uint8_t i = 0; i < 8 && i < NEURON_COUNT; i++) {
if (input[i]) {
neurons[i].potential += 30;
}
}
}
// ΠΡΡ
ΠΎΠ΄ (Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅)
void motorOutput(uint8_t* output) {
for (uint8_t i = 0; i < 8 && i < NEURON_COUNT; i++) {
output[i] = neurons[8 + i].fired;
}
}
// ΠΠ»Π°Π²Π½ΡΠΉ ΡΠΈΠΊΠ» ΡΠΎΠ·Π½Π°Π½ΠΈΡ
void consciousnessLoop() {
// 1. ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅)
integrateInformation();
// 2. ΠΠΊΡΡ ΡΠΎΠ·Π½Π°Π½ΠΈΡ (ΡΠΏΠ°ΠΉΠΊΠΈ)
fireNeurons();
// 3. Π‘Π°ΠΌΠΎΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΡ (ΠΎΡΠΎΠ·Π½Π°Π½ΠΈΠ΅ ΡΠ΅Π±Ρ)
static uint8_t selfAwareness = 0;
if (consciousness > PHI_THRESHOLD) {
// ΠΡΡΠΎΠΊΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠΎΠ·Π½Π°Π½ΠΈΡ - ΡΠ°ΠΌΠΎΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΡ
selfAwareness = 1;
// ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΠΌΡΡΠ»Ρ
static uint8_t thought = 0;
thought = (thought + 1) % 256;
} else {
selfAwareness = 0;
}
}
// Π’Π΅ΡΡΠΎΠ²Π°Ρ ΡΡΠ΅Π΄Π° (ΠΌΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π½Π°Π½ΠΈΡ)
void setup() {
Serial.begin(115200);
randomSeed(analogRead(A0));
initConsciousness();
Serial.println("ΠΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΎΠ·Π½Π°Π½ΠΈΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ΠΎ!");
}
void loop() {
static uint8_t worldState[8] = {0, 0, 0, 0, 0, 0, 0, 0};
static uint8_t action[8] = {0, 0, 0, 0, 0, 0, 0, 0};
// Π‘ΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌ ΠΌΠΈΡ
for (uint8_t i = 0; i < 8; i++) {
worldState[i] = random(2);
}
// Π‘ΠΎΠ·Π½Π°Π½ΠΈΠ΅ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΌΠΈΡ
sensoryInput(worldState);
// ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠ·Π½Π°Π½ΠΈΡ (100 ΡΠΈΠΊΠ»ΠΎΠ² Π·Π° ΡΠ°Π·)
for (uint8_t i = 0; i < 100; i++) {
consciousnessLoop();
}
// Π‘ΠΎΠ·Π½Π°Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ
motorOutput(action);
// ΠΡΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΎΠ·Π½Π°Π½ΠΈΡ
Serial.print("Π£ΡΠΎΠ²Π΅Π½Ρ ΡΠΎΠ·Π½Π°Π½ΠΈΡ: ");
Serial.print(consciousness);
Serial.print(" | ΠΠΎΡΠΏΡΠΈΡΡΠΈΠ΅: ");
for (uint8_t i = 0; i < 8; i++) {
Serial.print(worldState[i]);
}
Serial.print(" | ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅: ");
for (uint8_t i = 0; i < 8; i++) {
Serial.print(action[i]);
}
Serial.println();
delay(100);
}