This shows you the differences between two versions of the page.
poo-ca-cd:teme:2025:8e211bfe-f6eb-467c-9e54-f8e6df4c1535:tema-1 [2025/10/04 01:38] ioana.tudorache2507 [Comenzi pentru mediu] |
poo-ca-cd:teme:2025:8e211bfe-f6eb-467c-9e54-f8e6df4c1535:tema-1 [2025/10/05 00:27] (current) ioana.tudorache2507 [Water] |
||
---|---|---|---|
Line 51: | Line 51: | ||
- __Mediul evoluează automat__ – fenomene naturale care se petrec fără intervenția robotului | - __Mediul evoluează automat__ – fenomene naturale care se petrec fără intervenția robotului | ||
+ | * calitatea aerului, a solului și a apei se modifică în timp (în aceasta ordine) | ||
* plantele își schimbă starea (pot crește și se pot ofili) | * plantele își schimbă starea (pot crește și se pot ofili) | ||
* animalele se deplasează și își schimbă starea (consumă plante sau apă ca să nu fie flămânde) | * animalele se deplasează și își schimbă starea (consumă plante sau apă ca să nu fie flămânde) | ||
- | * calitatea aerului, a apei și a solului se modifică în timp | ||
- __TerraBot ia decizii și acționează__ – sub controlul comenzilor primite: | - __TerraBot ia decizii și acționează__ – sub controlul comenzilor primite: | ||
* se deplasează pe hartă | * se deplasează pe hartă | ||
Line 76: | Line 76: | ||
Detaliile privind mișcările și acțiunile robotului, precum și schimbările automate ale mediului, sunt descrise în secțiunea [[https://ocw.cs.pub.ro/courses/poo-ca-cd/teme/2025/8e211bfe-f6eb-467c-9e54-f8e6df4c1535/tema-1#comenzi| Comenzi]] | Detaliile privind mișcările și acțiunile robotului, precum și schimbările automate ale mediului, sunt descrise în secțiunea [[https://ocw.cs.pub.ro/courses/poo-ca-cd/teme/2025/8e211bfe-f6eb-467c-9e54-f8e6df4c1535/tema-1#comenzi| Comenzi]] | ||
- | ==== Pașii unei simulări ==== | + | ==== Pașii unei simulări ==== |
+ | |||
+ | - Se înregistrează toate modificările mediului și poziția robotului | ||
+ | - Robotul scanează obiectul de pe celula curentă | ||
+ | * Dacă este o plantă, aceasta se adaugă în inventar | ||
+ | - Se descoperă un fact despre obiectul scanat | ||
+ | * Fact-ul descoperit prin scanare este stocat în baza de date a robotului | ||
+ | - Se primește comandă de tip `improve` pentru mediu | ||
+ | * Se efectuează doar dacă | ||
+ | * S-a învățat metoda respectivă de improvement | ||
+ | * Robotul are elementele necesare în inventar (acestea sunt enumerate tot în fact-ul învățat) | ||
+ | * //Hint: Practic e ca un fel de rețetă, trebuie să o cunoști și să ai ingredientele necesare ca să poți face improve.// | ||
+ | * Se actulizeaza noii parametrii pentru mediul de pe pătrățica/celula curentă | ||
+ | - Se primește comandă de tip `explore` | ||
+ | * Se calculează scorul de calitate pentru celulele adiacente (vezi mai jos cum se calculează) | ||
+ | * Robotul se deplasează pe celula cu cel mai bun scor | ||
+ | * Energia bateriei scade conform formule | ||
+ | - Se actualizează datele pentru hartă - se înregistrează toate modificările mediului și poziția robotului | ||
+ | * Intai se actualizeaza parametrii pt mediu - **air, soil, water (in aceasta ordine)** - si **apoi plantele si animalele (in aceasta ordine)** | ||
+ | |||
+ | |||
+ | Pentru interactiunile ce se fac automat la fiecare comanda, avem urmatoarele frecvente pentru cand au loc: | ||
+ | |||
+ | | **Interactiune** | **Frecventa** | | ||
+ | | Water → Soil | După 2 iterații | | ||
+ | | Water → Air | După 2 iterații | | ||
+ | | Water → Animal | După ce sursa de apă este scanată de robot (verificat la fiecare iterație) | | ||
+ | | Water → Plant | La fiecare iterație | | ||
+ | | Air → Animal | Când calitatea aerului devine toxică (verificat la fiecare iterație) | | ||
+ | | Soil → Plant | La fiecare iterație | | ||
+ | | Animal → Plant | După ce planta este scanată | | ||
+ | | Animal → Water | După ce sursa de apă este scanată de robot (verificat la fiecare iterație) | | ||
+ | | Animal → Soil | Când ajunge în starea well-fed (verificat la fiecare iterație) | | ||
+ | | Plant → Air | La fiecare iterație | | ||
<note important> **Observații și reguli importante** | <note important> **Observații și reguli importante** | ||
Line 92: | Line 126: | ||
===== Entități ===== | ===== Entități ===== | ||
+ | |||
+ | |||
+ | O entitate reprezinta ce alcatuieste si ce exista pe un patratel. Aceasta poate sa fie unul dintre cele 5 tipuri - Plant, Animal, Air, Water, Soil. Toate au un nume si o masa. Acestea interactioneaza intre ele si isi modifica statusul sau calitatea pe masura ce simularea avanseaza. | ||
+ | |||
+ | Pentru fiecare entitate, campul de mass reprezinta lucruri diferite: | ||
+ | * soil - greutatea totală a solului | ||
+ | * air - greutatea tuturor gazelor gasite in acel tip de aer | ||
+ | * water - greutatea apei lichide dintr-un rezervor (lac, rau, iaz) | ||
+ | * animal - greutatea animalului | ||
+ | * plant - biomasa plantei | ||
==== Plant ==== | ==== Plant ==== | ||
+ | Tipurile de plante sunt impartite in 5 categorii: | ||
+ | |||
+ | * FloweringPlants | ||
+ | * GymnospermsPlants | ||
+ | * Ferns | ||
+ | * Mosses | ||
+ | * Algae | ||
+ | |||
+ | |||
+ | In functie de tip si maturitate, fiecare planta va genera o anumita cantitatea de oxigen in aer: | ||
+ | * young - produce +0.2 O2 | ||
+ | * mature - produce +0.7 O2, ofera umbra plantelor vecine | ||
+ | * old - produce +0.4 O2 | ||
+ | |||
+ | | **Categorie** | **Oxigen** | | ||
+ | | FloweringPlants | 6.0 | | ||
+ | | GymnospermsPlants | 0 | | ||
+ | | Ferns | 0 | | ||
+ | | Mosses | 0.8 | | ||
+ | | Algae | 0.5 | | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | O planta creste atunci cand rata de crestere ajunge la 1, adunate din stimularea generate de apa si sol | ||
+ | * young -> mature | ||
+ | * mature -> old | ||
+ | * old -> death **(se sterge planta de pe patratica)** | ||
+ | </note> | ||
+ | |||
+ | |||
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | O planta are 2 posibile efecte: | ||
+ | * crește nivelul de oxigen din aer (interactioneaza cu aerul) | ||
+ | * oferă umbră plantelor vecine si scade temperatura aerului de pe acele celule cu 0.1 (interactioneaza cu planta) | ||
+ | \\ | ||
+ | === Calitate planta === | ||
+ | |||
+ | Calitatea unei plante este calculat in functie de cantitatea de oxigen generata. | ||
+ | |||
+ | * ''%%oxygenProduced = sum(oxigen_per_type + oxigen_per_status)%%'' | ||
+ | * ''%%plantQuality = (oxygenProduced / 2.5) * 100%%'' | ||
+ | |||
+ | \\ | ||
+ | === Posibilitatea de a bloca TerraBot === | ||
+ | |||
+ | |||
+ | Fiecare categorie de planta are un procentaj pentru cat de probabil este ca robotelul sa se agate in ele: | ||
+ | |||
+ | |||
+ | | **Tip** | **Posibilitate** | | ||
+ | | Flowering Plants (Angiosperms) | 90% | | ||
+ | | Gymnosperms | 60% | | ||
+ | | Ferns | 30% | | ||
+ | | Mosses | 40% | | ||
+ | | Algae | 20% | | ||
+ | |||
+ | \\ | ||
==== Animal ==== | ==== Animal ==== | ||
+ | |||
+ | Animalele se vor misca constant pe harta si vor manca plantele intalnite, ce le vor ajuta sa produca ingrasamant si sa imbunatateasca calitatea solului. | ||
+ | |||
+ | |||
+ | Un animal poate avea una din urmatoarele stari: | ||
+ | * hungry - daca nu mananca sau nu bea apa, nu va produce ingrasamant | ||
+ | * well-fed - va produce ingrasamant, se intampla dupa ce mananca o planta **sau** bea apa, daca exista | ||
+ | * sick - daca aerul devine toxic, nu produce ingrasamant | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === Reguli pentru status well-fed === | ||
+ | |||
+ | Un animal devine well-fed daca se indeplineste una din cele 2 conditii: | ||
+ | * mananca o planta | ||
+ | * bea apa | ||
+ | |||
+ | Daca se indeplineste doar o conditie, atunci se va produce cantitatea default de **0.5 ingrasamant**. | ||
+ | Daca se indeplinesc amandoua, atunci va fi un **bonus de +0.3 ingrasamant** de la apa. | ||
+ | |||
+ | |||
+ | <note important>Se vor efectua aceste actiuni doar daca exista pe patratica curenta si au fost scanate de robot anterior. | ||
+ | Se va scadea din cantitatea de apa de la sursa si se va creste masa animalului. | ||
+ | |||
+ | * waterToDrink = Math.min(animal_mass * intake_rate, intake_rate = 0.08, water_mass) | ||
+ | * animal_mass += waterToDrink + plant_mass | ||
+ | * water_mass -= waterToDrink | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | **Exceptie** -> **DOAR** pentru **Carnivores** si **Parasites** exista posibilitatea **sa manance / omoare un alt animal** atunci cand cauta sa se mute pe o alta casuta unde exista deja animal si va deveni **well-fed**. | ||
+ | |||
+ | * animal_mass += prey_mass | ||
+ | * **animalul mancat va disparea cu totul de pe harta** | ||
+ | </note> | ||
+ | |||
+ | \\ | ||
+ | === Miscarea pe harta === | ||
+ | |||
+ | * animalul se muta pe una din patratelele vecine | ||
+ | * alege patratica in functie de | ||
+ | * unde e planta | ||
+ | * unde e apa | ||
+ | * unde e apa mai buna | ||
+ | * **se va muta la fiecare 2 iteratii** (la 2 comenzi primite / 2 timestamp uri) | ||
+ | |||
+ | <note important> | ||
+ | Un animal **NU are voie sa se mute pe o patratica unde exista deja un animal**. Daca nu exista casuta vecina fara animal, atunci acesta va sta pe loc, **exceptie tipul de animale //Carnivores// si //Parasites//, care pot manca/ omori animalul existent.** | ||
+ | </note> | ||
+ | \\ | ||
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | Un animal poate face urmatoarele actiuni: | ||
+ | * să mănânce o plantă | ||
+ | * să bea apă | ||
+ | * să crească //organicMatter// pentru sol cu cantitatea de ingrăsămant produsă | ||
+ | |||
+ | |||
+ | Un animal va **manca planta de pe patratica curenta** odata ce **este scanata de robot**. Asta va determina **planta sa moara** si sa **se schimbe calitatea aerului**. Statusul pentru animal se va schimba in **well-fed** si **va produce ingrasamant**. | ||
+ | |||
+ | <note important> | ||
+ | Orice animal **produce 0.5 ingrasamant + eventuale stimulari** pentru crestearea cantitatii (exemplu: bea apa) | ||
+ | </note> | ||
+ | |||
+ | \\ | ||
+ | === Posibilitatea de a ataca TerraBot === | ||
+ | |||
+ | | **Tip** | **Posibilitate** | | ||
+ | | Herbivores | 85% | | ||
+ | | Carnivores | 30% | | ||
+ | | Omnivores | 60% | | ||
+ | | Detritivores | 90% | | ||
+ | | Parasites | 10% | | ||
+ | |||
+ | \\ | ||
==== Water ==== | ==== Water ==== | ||
+ | Apa este un element vital in ecosistem, ajutand toate aspectele mediului intr-un mod sau altul. | ||
+ | |||
+ | === Principalele caracteristici ale apei === | ||
+ | |||
+ | |||
+ | | Câmp | Descriere | Tip | | ||
+ | | salinity | Concentrația de sare a apei | double | | ||
+ | | pH | Aciditatea/alcalinitatea apei | double | | ||
+ | | temperature | Temperatura apei | double | | ||
+ | | purity | Nivelul de puritate al apei, în procente | double | | ||
+ | | turbidity | Nivelul de turbiditate al apei | int | | ||
+ | | contaminantIndex | Indice ce indică concentrația contaminanților | double | | ||
+ | | isFrozen | Indică dacă apa este înghețată | boolean | | ||
+ | |||
+ | |||
+ | == Interactiuni cu mediul == | ||
+ | |||
+ | Apa interactioneaza cu toate celelalte entitati: | ||
+ | * soil -> creste //moisture// pentru sol **cu 0.1 la 2 iteratii** | ||
+ | * air -> creste //humidity// pentru aerul **cu 0.1 la 2 iteratii** | ||
+ | * animal -> ajuta un animal sa produca **mai mult ingrasamant cu 0.3 unitati** | ||
+ | * se va scadea cantitatea bauta din //mass// dupa ce sursa de apa a fost scanata | ||
+ | * plant -> ajuta sa creasca o plantă cu 0.2 | ||
+ | |||
+ | == Calitate apa == | ||
+ | |||
+ | * normalizare factori | ||
+ | * ''%%purity_score = purity / 100%%'' | ||
+ | * ''%%pH_score = 1 - abs(pH - 7.5) / 7.5%%'' | ||
+ | * ''%%temp_score = 1 - abs(temperature - 17.5) / 17.5%%'' | ||
+ | * ''%%salinity_score = 1 - (salinity / 350)%%'' | ||
+ | * ''%%turbidity_score = 1 - (turbidity / 100)%%'' | ||
+ | * ''%%contaminant_score = 1 - (contaminantIndex / 100)%%'' | ||
+ | * ''%%frozen_score = isFrozen ? 0 : 1%%'' | ||
+ | * formula finala | ||
+ | * ''%%water_quality = (0.3 * purity_score + 0.2 * pH_score + 0.1 * temp_score + 0.15 * salinity_score + 0.1 * turbidity_score + 0.15 * contaminant_score + 0.2 * frozen_score) * 100%%'' | ||
+ | * interpretare | ||
+ | * 70–100% -> good | ||
+ | * 40–70% -> moderate | ||
+ | * <40% -> poor | ||
==== Soil ==== | ==== Soil ==== | ||
+ | |||
+ | Solul are rol de a ajuta plantele sa creasca. Acesta isi poate imbunatati calitatea daca absoarbe apa sau primeste ingrasamant. | ||
+ | |||
+ | Fiecare tip de sol are o componenta diferita, prin urmare o formula diferita pentru calcularea calitatii solului. | ||
+ | |||
+ | \\ | ||
+ | |||
+ | | **Câmp** | **Descriere** | **Tip** | | ||
+ | | fertility | Nivelul de fertilitate al solului | double | | ||
+ | | nitrogen | Conținutul de azot, în procente | double | | ||
+ | | waterRetention | Capacitatea de reținere a apei în sol | double | | ||
+ | | soilpH | Nivelul de aciditate/alcalinitate al solului | double | | ||
+ | | organicMatter | Conținutul de materie organică, în procente | double | | ||
+ | \\ | ||
+ | === Interactiuni cu mediul === | ||
+ | |||
+ | Apa interactioneaza doar cu plantele si sursa de apa: | ||
+ | * ajuta o planta sa creasca cu 0.3 la fiecare iteratie | ||
+ | * absoarbe 0.2 apa daca exista sursa de apa pe patratica la fiecare 3 iteratii | ||
+ | |||
+ | |||
+ | === Calitate sol === | ||
+ | |||
+ | Se ia in functie de tipul de sol: | ||
+ | * **ForestSoil** | ||
+ | * //double leafLitter// | ||
+ | * ''%%(nitrogen * 1.2) + (organicMatter * 2) + (waterRetention * 1.5) + (leafLitter * 0.3)%%'' | ||
+ | * **SwampSoil** | ||
+ | * //double waterLogging// | ||
+ | * ''%%(nitrogen * 1.1) + (organicMatter * 2.2) - (waterLogging * 5)%%'' | ||
+ | * ** DesertSoil** | ||
+ | * //double salinity// | ||
+ | * ''%%(nitrogen * 0.5) + (waterRetention * 0.3) - (salinity * 2)%%'' | ||
+ | * **GrasslandSoil** | ||
+ | * // double rootDensity// | ||
+ | * ''%%(nitrogen * 1.3) + (organicMatter * 1.5) + (rootDensity * 0.8)%%'' | ||
+ | * **TundraSoil** | ||
+ | * //double permafrostDepth// | ||
+ | * ''%%(nitrogen * 0.7) + (organicMatter * 0.5) - (permafrostDepth * 1.5) %%'' | ||
+ | * ''%%double normalizeScore = Math.max(0, Math.min(100, score))%%'' | ||
+ | * interpretare: | ||
+ | * 70–100% -> good | ||
+ | * 40–70% -> moderate | ||
+ | * <40% -> poor | ||
+ | \\ | ||
+ | |||
+ | === Posibilitatea de a bloca TerraBot === | ||
+ | |||
+ | | **Tip** | **Formula** | | ||
+ | | ForestSoil | ''%%(waterRetention*0.6 + leafLitter*0.4)/80 *100%%'' | | ||
+ | | SwampSoil | ''%%waterLogging * 10%%'' | | ||
+ | | DesertSoil | ''%%(100 - waterRetention + salinity)/100 *100%%'' | | ||
+ | | GrasslandSoil | ''%%((50 - rootDensity) + waterRetention*0.5)/75 *100%%'' | | ||
+ | | TundraSoil | ''%%(50 - permafrostDepth)/50 *100%%'' | | ||
+ | |||
+ | \\ | ||
==== Air ==== | ==== Air ==== | ||
+ | Aerul este necesar pentru ca animalele sa poata respira. Cand acesta devine prea toxic, animalele se imbolnavesc si devine un risc si pentru TerraBot. | ||
+ | |||
+ | | **Câmp** | **Descriere** | **Tip** | | ||
+ | | humidity | Umiditate relativă, în procente | double | | ||
+ | | temperature | Temperatură ambientală în °C | double | | ||
+ | | oxygenLevel | Concentrație de oxigen | double | | ||
+ | |||
+ | |||
+ | === Calitatea aerului === | ||
+ | |||
+ | |||
+ | Exista 5 tipuri de aer, iar fiecare are un camp specific care este utilizat in calcularea calitatii aerului: | ||
+ | * **aer tropical** -> double co2Level | ||
+ | * ''%%(oxygenLevel * 2) + (humidity * 0.5) - (co2Level * 0.01)%%'' | ||
+ | * **aer polar** -> double iceCrystalConcentration | ||
+ | * ''%%(oxygenLevel * 2) + (100 - Math.abs(temperature)) - (iceCrystalConcentration * 0.05)%%'' | ||
+ | * **aer temperat** -> double pollenLevel | ||
+ | * ''%%(oxygenLevel * 2) + (humidity * 0.7) - (pollenLevel * 0.1)%%'' | ||
+ | * **aer de desert** -> double salinity | ||
+ | * ''%%(nitrogen * 0.5) + (waterRetention * 0.3) - (salinity * 2)%%'' | ||
+ | * **aer montan** -> double altitude | ||
+ | * ''%%double oxygenFactor = oxygenLevel - (altitude / 1000 * 0.5)%%'' | ||
+ | * ''%%(oxygenFactor * 2) + (humidity * 0.6)%%'' | ||
+ | |||
+ | |||
+ | De asemenea, si umiditatea creste in cantitati diferite : | ||
+ | |||
+ | | **Tip de aer** | **Formula pentru umiditate** | | ||
+ | | aer tropical | ''%%humidity += amount * 0.6%%'' | | ||
+ | | aer polar | ''%%humidity += amount * 0.3%%'' | | ||
+ | | aer temperat | ''%%humidity += amount * 0.5%%'' | | ||
+ | | aer de desert | ''%%humidity += amount * 0.2%%'' | | ||
+ | | aer montan | ''%%humidity += amount * 0.7%%'' | | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === Schimbari meteo === | ||
+ | |||
+ | Dar putem avea si schimbari bruste de vreme, cu fenome meteo extreme, care va determina schimbarea calitatii aerului (cand se primeste comanda de changeWeather): | ||
+ | * aer tropical -> rainfall | ||
+ | * //double rainfall// | ||
+ | * ''%%normal_air_quality + (rainfall * 0.3)%%'' | ||
+ | * aer polar -> polarStorm | ||
+ | * //double windSpeed// | ||
+ | * ''%%normal_air_quality - (windSpeed * 0.2)%%'' | ||
+ | * aer temperat -> newSeason | ||
+ | * //String season// | ||
+ | * ''%%double seasonPenalty = season.equalsIgnoreCase("Spring") ? 15 : 0%%'' | ||
+ | * ''%%normal_air_quality - seasonPenalty%%'' | ||
+ | * aer de desert -> desertStorm | ||
+ | * //double windSpeed// | ||
+ | * ''%%windSpeed * (1 - waterRetention) + salinity * 0.5%%'' | ||
+ | * aer montan -> peopleHiking | ||
+ | * //int numberOfHikers// | ||
+ | * ''%%normal_air_quality - (numberOfHikers * 0.1)%%'' | ||
+ | |||
+ | |||
+ | === Posibilitatea de a afecta TerraBot === | ||
+ | |||
+ | Pentru a determina cat de mult afecteaza animalele sau TerraBot, trebuie calculata toxicitatea: | ||
+ | * //normalizare toxicitate O2//: ''%%double toxicityO2 = (1 - totalOxygen / optimalOxygen) * 100%%'' | ||
+ | * //normalizare scor caliltatea aerului//: ''%%double toxicityAQ = 100 * (1 - airQualityScore / maxScore)%%'' | ||
+ | * //formula finala//: ''%%double totalToxicity = Math.max(toxicityO2, toxicityAQ)%%'' | ||
+ | |||
+ | Valorile pentru maxScore pentru fiecare tip de aer | ||
+ | | Biome | MaxScore | | ||
+ | | Tropical | 82 | | ||
+ | | Polar | 142 | | ||
+ | | Temperate | 84 | | ||
+ | | Desert | 65 | | ||
+ | | Mountain | 78 | | ||
===== Comenzi ===== | ===== Comenzi ===== | ||
Line 152: | Line 496: | ||
* ''%%"Simulation has ended."%%'' | * ''%%"Simulation has ended."%%'' | ||
- | * ''%%"ERROR: Simulation already started. Cannot perform action"%%'' | + | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' |
== Input == | == Input == | ||
Line 197: | Line 541: | ||
* ''%%"The weather has changed."%%'' | * ''%%"The weather has changed."%%'' | ||
* ''%%"ERROR: The weather change does not affect the environment. Cannot perform action"%%'' | * ''%%"ERROR: The weather change does not affect the environment. Cannot perform action"%%'' | ||
- | * ''%%"ERROR: Simulation already started. Cannot perform action"%%'' | + | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' |
== Input == | == Input == | ||
Line 248: | Line 592: | ||
\\ | \\ | ||
==== Comenzi pentru TerraBot ==== | ==== Comenzi pentru TerraBot ==== | ||
+ | |||
+ | === moveRobot=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * robotul se va muta pe patratelul cu scorul de calitate cel mai bun | ||
+ | * nu se poate explora mai departe de dimensiunea maxima a matricei | ||
+ | * se verifica daca robotul are suficienta baterie pt a se putea muta | ||
+ | * se poate trece in timpul simularii prin aceeasi patratica | ||
+ | * consumul de baterie pentru mutare este raportat la scorul de calitate | ||
+ | |||
+ | <note important>Robotelul nu poate sa ramana pe patratica curenta. Daca acesta mai are suficienta baterie pentru a efectua mutarea, atunci trebuie sa aleaga neaparat una dintre patratelele vecine</note> | ||
+ | |||
+ | == Deplasare robot == | ||
+ | |||
+ | Se va duce pe patratelul cu scorul de calitate cel mai bun //(normalizat, de la 0 la 100, 100 find 0 scor la toate)// | ||
+ | * ordinea in care se verifica celulele: **sus, dreapta, jos, stanga** | ||
+ | * pentru calcularea scorului, se vor lua in considerare urmatoarele lucruri | ||
+ | * **PossibilityToGetStuckInSoil** | ||
+ | * pt fiecare categorie de sol, se ia procentul de a ramane blocat in el (sectiune Soil) | ||
+ | * **PossibilityToGetDamagedByAir** | ||
+ | * pt fiecare tip de aer, se iau valorile specifice si se inlocuiesc in formulele date (sectiune Air) | ||
+ | * **PossibilityToBeAttackedByAnimal** | ||
+ | * pt fiecare categorie de animale, se ia procentul de a fi atacat de ele (sectiune Animal) | ||
+ | * **PossibiltyToGetStuckInPlants** | ||
+ | * pt fiecare categorie de plante, se ia procentul de a ramane blocat in ele (sectiune Plant) | ||
+ | * **scorul final se calculeaza ca si medie aritmetica din cele 4 scori pentru fiecare posibilitate** | ||
+ | * i se va scadea din baterie conform procentului overall calculat dupa formula de mai jos | ||
+ | |||
+ | <note important> | ||
+ | Daca se obtine acelasi scor de calitate pentru una sau mai multe celule sau celula obtinuta este in afara hartii, atunci se alege prima din ordine in care s-au verificat celulele. | ||
+ | |||
+ | Se va verifica ca robotul are suficienta baterie pentru a efectua mutarea. | ||
+ | </note> | ||
+ | |||
+ | == Baterie robot== | ||
+ | |||
+ | Robotul poate sa ramana fara baterie inainte sa se mute pe alta patratica | ||
+ | * daca robotul nu mai are baterie **el nu se va deplasa pana cand nu se primeste comada rechargeBattery** pentru a-si incarca bateria, dar **restul pasilor se vor executa**, inclusiv cei de analiza si **functionalitatile automate** din spate | ||
+ | * bateria se va consuma pentru fiecare miscare a robotului pe alta celula | ||
+ | |||
+ | <note tip> | ||
+ | **Exemplu** | ||
+ | |||
+ | Scor total de calitate pasul trecut = 48% -> 10 * 48% = 4.8 -> rount_to_ceil(4.8) -> 5, deci se vor scadea 5 unitati din baterie | ||
+ | |||
+ | </note> | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The robot has successfully moved to position ${(coord_X, coord_Y)}."%%'' | ||
+ | * ''%%"ERROR: Robot still charging. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input moveRobot> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "moveRobot", | ||
+ | "timestamp": 2 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output moveRobot> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "moveRobot", | ||
+ | "message": "The robot has successfully moved to position (0,2)." | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | |||
+ | === rechargeBattery=== | ||
+ | |||
+ | * se pune pauza simularii curente in derulare pentru ca robotelul sa se incarce unde se afla in mod curent (are panouri solare 😎) | ||
+ | * se incarca numarul de puncte de energie primite la input (**1 punct de energie = 1min de incarcare**) | ||
+ | * exemplu: daca se da aceasta **comanda la timestamp 5** pentru **20 de puncte de energie**, atunci urmatoarea comanda care poate fi **efectuata va fi la timestamp 25** | ||
+ | |||
+ | <note important> | ||
+ | ** Nu se poate pune pauza daca o simulare tocmai s-a incheiat.** | ||
+ | |||
+ | Daca nu s-a terminat incarcarea, se va returna eroare ca robotelul este inca la incarcat pentru orice comanda pentru robot data in aceasta perioada. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The simulation was paused until charging is finished."%%'' | ||
+ | * ''%%"ERROR: Robot still charging. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input rechargeBattery> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "rechargeBattery", | ||
+ | "timeToCharge": 20, | ||
+ | "timestamp": 10 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output rechargeBattery> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "rechargeBattery", | ||
+ | "message": "The simulation was paused until charging is finished.", | ||
+ | "timestamp": 10 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === scanObject=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * scanează un obiect (plantă, animal, apa) și salvează rezultatul (se salveaza in baza de date si in inventar) | ||
+ | * se cauta in harta salvata pentru sectiunea curenta de teritoriu daca exista un obiect de tipul respectiv pt scanat (**nu este garantat ca se gaseste pe harta**) | ||
+ | * consuma **7 puncte energie** | ||
+ | |||
+ | Robotelul scaneaza obiectele de pe patratica curenta si determina tipul acestuia in functie de 3 parametrii: | ||
+ | * color | ||
+ | * smell | ||
+ | * sound | ||
+ | |||
+ | Combinatiile de parametrii pentru obiecte: | ||
+ | * none + none + none = water | ||
+ | * pink + sweet + none = plant | ||
+ | * brown + earthy + muuu = animal | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | Se va verifica in baza de date ca exista pe patratica acel tip de obiect. Daca da, se returneaza restul de detalii pentru el si robotul va salva in baza de date si in inventarul sau noul obiect gasit. Daca nu, se va returna eroare. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | **Un obiect incepe sa existe abia dupa ce a fost scanat**. Asadar, o planta/ animal vor incepe sa isi schimbe statusul doar dupa ce au fost scanate | ||
+ | |||
+ | Exemplu: un animal nu poate sa manance planta de pe patratica curenta pana aceasta nu a fost scanata. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The scanned object is ${type_of_entity}"%%'' | ||
+ | * ''%%"ERROR: Object not found. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input scanObject> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "none", | ||
+ | "smell": "none", | ||
+ | "sound": "none", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "pink", | ||
+ | "smell": "sweet", | ||
+ | "sound": "none", | ||
+ | "timestamp": 5 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "color": "brown", | ||
+ | "smell": "earthy", | ||
+ | "sound": "muu", | ||
+ | "timestamp": 6 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output scanObject> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is water.", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is a plant.", | ||
+ | "timestamp": 5 | ||
+ | }, | ||
+ | { | ||
+ | "command": "scanObject", | ||
+ | "message": "The scanned object is an animal.", | ||
+ | "timestamp": 6 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === learnFact=== | ||
+ | |||
+ | * **consuma energie** | ||
+ | * adauga un nou fapt stiintific sub un anumit subiect | ||
+ | * se primeste un subiect si componentele pentru acel subiect, mai multe detalii la comanda de //improveEnvironment// | ||
+ | * consuma **2 puncte energie** | ||
+ | |||
+ | <note tip> | ||
+ | Exemplu | ||
+ | |||
+ | Daca TerraBot a descoperit (scanat) o planta noua **RedAlgae** si se primeste comanda de //learnFact// ce include in **subiect** RedAlgae, va cauta in obiectele salvate daca exita aceasta planta. Daca da, va salva informatia data sub numele / subiectul acestei plante. | ||
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | **Nu se pot invata facts pana cand nu TerraBot nu a scanat acel obiect** | ||
+ | </note> | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The fact has been successfully saved in the database."%%'' | ||
+ | * ''%%"ERROR: Subject not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input learnFact> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "subject": "Method to plant RedAlgae", | ||
+ | "components": "RedAlgae", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "subject": "Characteristic of RedAlgae", | ||
+ | "components": "RedAlgae", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output learnFact> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "message": "The fact has been successfully saved in the database.", | ||
+ | "timestamp": 4 | ||
+ | }, | ||
+ | { | ||
+ | "command": "learnFact", | ||
+ | "message": "The fact has been successfully saved in the database.", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === improveEnvironment=== | ||
+ | * **consuma energie** | ||
+ | * robotul incearca sa imbunateasca **mediul de pe patratica curenta** pentru a putea face planeta locuibila | ||
+ | * consuma **10 puncte energie** | ||
+ | |||
+ | \\ | ||
+ | Putem avea 4 tipuri de improvement: | ||
+ | * **plantVegetation** | ||
+ | * ''%%+0.3 oxigen%%'' pentru aer fata de cantitatea curenta | ||
+ | * **fertilizeSoil** | ||
+ | * ''%%+0.3 organicMatter%%'' pentru soil | ||
+ | * **increaseHumidity** | ||
+ | * ''%%+0.2 humidity%%'' la aer | ||
+ | * **increaseMoisture** | ||
+ | * ''%%+0.2 waterRetention%%'' pentru apa | ||
+ | |||
+ | <note important> | ||
+ | Ca sa se efectueze comanda cu succes, trebuie sa fie indeplinite **2 conditii**: | ||
+ | * sa se stie metoda prin care se realizeaza improvement-ul | ||
+ | * trebuie sa existe salvat **un fact de "Method for X"** ca se poata face **improvementul X** | ||
+ | * robotul **sa aiba in inventar toate componentele** necesare pentru improvement | ||
+ | </note> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"The ${plant_name} was planted successfully."%%'' | ||
+ | * ''%%"The ${improved_entity} was successfully ${fertilized /increased } using ${component_name}"%%'' | ||
+ | * ''%%"ERROR: Subject not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Fact not yet saved. Cannot perform action"%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input improveEnvironment> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "plantVegetation", | ||
+ | "type": "Algae", | ||
+ | "name": "RedAlgae", | ||
+ | "timestamp": 6 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "fertilizeSoil", | ||
+ | "type": "Herbivores", | ||
+ | "name": "Cow", | ||
+ | "timestamp": 7 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "increaseHumidity", | ||
+ | "type": "river", | ||
+ | "name": "Blue River", | ||
+ | "timestamp": 8 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "improvementType": "increaseMoisture", | ||
+ | "type": "river", | ||
+ | "name": "Blue River", | ||
+ | "timestamp": 9 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output improveEnvironment> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The RedAlgae was planted successfully.", | ||
+ | "timestamp": 6 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The soil was successfully fertilized using Cow.", | ||
+ | "timestamp": 7 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The humidity was successfully increased using Blue River.", | ||
+ | "timestamp": 8 | ||
+ | }, | ||
+ | { | ||
+ | "command": "improveEnvironment", | ||
+ | "message": "The moisture was successfully increased using Blue River.", | ||
+ | "timestamp": 9 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
==== Comenzi de debug ==== | ==== Comenzi de debug ==== | ||
+ | ==== getEnergyStatus==== | ||
+ | |||
+ | * returnează energia curenta a TerraBot-ului | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"TerraBot has ${energy_points} energy points left."%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input getEnergyStatus> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "getEnergyStatus", | ||
+ | "timestamp": 8 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output getEnergyStatus> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "getEnergyStatus", | ||
+ | "message": "TerraBot has 189 energy points left.", | ||
+ | "timestamp": 8 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== printEnvConditions==== | ||
+ | |||
+ | |||
+ | * se printeaza pentru patratica curenta urmatoarele: | ||
+ | * tipul de planta, daca exista | ||
+ | * tipul de animal, daca exista | ||
+ | * tipul de sursa de apa, daca exista | ||
+ | * componenta solului | ||
+ | * componenta aerului | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printEnvConditions> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printEnvConditions", | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printEnvConditions> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printEnvConditions", | ||
+ | "output" : { | ||
+ | "soil": { | ||
+ | "type": "ForestSoil", | ||
+ | "nitrogen": 3.2, | ||
+ | "waterRetention": 0.55, | ||
+ | "soilpH": 6.8, | ||
+ | "organicMatter": 0.4, | ||
+ | "leafLitter": 0.3 | ||
+ | }, | ||
+ | "plant": { | ||
+ | "type": "Algae", | ||
+ | "name": "RedAlgae", | ||
+ | }, | ||
+ | "animal": { | ||
+ | "type": "Herbivores", | ||
+ | "name": "Cow" | ||
+ | }, | ||
+ | "water": { | ||
+ | "type": "lake", | ||
+ | "purity": 92.0, | ||
+ | "salinity": 0.5, | ||
+ | "turbidity": 4, | ||
+ | "contaminantIndex": 1.5, | ||
+ | "pH": 6.8, | ||
+ | "isFrozen": false, | ||
+ | }, | ||
+ | "air": { | ||
+ | "type": "Tropical Air", | ||
+ | "mass": 1500000.0, | ||
+ | "humidity": 85.0, | ||
+ | "temperature": 30.5, | ||
+ | "oxygenLevel": 21, | ||
+ | "co2Level": 400.0 | ||
+ | } | ||
+ | }, | ||
+ | "timestamp": 5 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | ==== printMap==== | ||
+ | |||
+ | * se printeaza pentru fiecare patratica de pe harta urmatoarele: | ||
+ | * nr total enitati de pe patratica (sum(plant, animal, water_source)) | ||
+ | * calitate aerului | ||
+ | * calitatea solului | ||
+ | |||
+ | Mesaje posibile pentru aceasta comanda: | ||
+ | |||
+ | * ''%%"Simulation has ended."%%'' | ||
+ | * ''%%"ERROR: Simulation not started. Cannot perform action"%%'' | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printMap> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printMap", | ||
+ | "timestamp": 23 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printMap> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printMap", | ||
+ | "output": [ | ||
+ | { | ||
+ | "section": [0,0], | ||
+ | "totalNrOfObjects": 1, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [0,1], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [0,2], | ||
+ | "totalNrOfObjects": 2, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,0], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "poor", | ||
+ | "soilQuality": "poor" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,1], | ||
+ | "totalNrOfObjects": 3, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [1,2], | ||
+ | "totalNrOfObjects": 1, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "poor" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,0], | ||
+ | "totalNrOfObjects": 2, | ||
+ | "airQuality": "good", | ||
+ | "soilQuality": "moderate" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,1], | ||
+ | "totalNrOfObjects": 3, | ||
+ | "airQuality": "moderate", | ||
+ | "soilQuality": "good" | ||
+ | }, | ||
+ | { | ||
+ | "section": [2,2], | ||
+ | "totalNrOfObjects": 0, | ||
+ | "airQuality": "poor", | ||
+ | "soilQuality": "poor" | ||
+ | } | ||
+ | ], | ||
+ | "timestamp": 23 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
+ | ==== printKnowledgeBase==== | ||
+ | |||
+ | * afiseaza pentru fiecare tip de entitate fact-urile invatate | ||
+ | * exemplu: s-a scanat si invatat despre RedAlgae, se printeaza toate facts despre RedAlgae | ||
+ | |||
+ | |||
+ | == Input == | ||
+ | |||
+ | <spoiler Click pentru input printKnowledgeBase> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printKnowledgeBase", | ||
+ | "timestamp": 17 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | <spoiler Click pentru output printKnowledgeBase> | ||
+ | <code json> | ||
+ | { | ||
+ | "command": "printKnowledgeBase", | ||
+ | "output" : [ | ||
+ | { | ||
+ | "topic": "red algae", | ||
+ | "facts": [ | ||
+ | { | ||
+ | "subject": "Method to plant red algae", | ||
+ | "components": "RedAlgae" | ||
+ | }, | ||
+ | { | ||
+ | "subject": "Characteristic of red algae", | ||
+ | "components": "RedAlgae" | ||
+ | } | ||
+ | ] | ||
+ | } | ||
+ | ], | ||
+ | "timestamp": 17 | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | \\ | ||
===== Exemplu simulare ===== | ===== Exemplu simulare ===== | ||