Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Wojciech Łukasik 2020-04-28 11:11:01 +02:00
commit d7606262d8
7 changed files with 452 additions and 23 deletions

View File

@ -1,2 +1,3 @@
Repozytorium projektu z sztucznej inteligencji, temat "Inteligentny wózek widłowy". Repozytorium projektu z sztucznej inteligencji, temat "Inteligentny wózek widłowy". <br>
Zespół: 444420, 444428, 444430

44
environment.md Normal file
View File

@ -0,0 +1,44 @@
# Raport 1
### Środowisko
Środowiskiem agenta jest plansza (mapa magazynu), która jest podzielona na pola. Każde pole może być puste lub zajęte.
Agent może się poruszać tylko po polach pustych. Na polach zajętych znajdują się regały, na których przechowywane jest towar. Regały są zaznaczone za pomocą funkcji `pokolorujRegaly()`
Plansza ma wymiar 11 kolumn indeksowanych od 0 do 11 i 7 wierszy indeksowanych od 0 do 6. Pola mogą być ponumerowane dzięki funkcji `ponumerujPola()`.
### Agent
Agent jest reprezentowany za pomocą klasy `Agent`.
Agent jest wyświetlany na planszy przy użyciu ikony wózka widłowego (`umiescAgenta()`).
Agent porusza się po dzięki metodzie `przemieszczenie()`, która najpierw usuwa agenta z planszy (funkcja: `usunAgenta()`) nasępnie przesuwa go metodami `right()`, `left()`,
`up()`, `down()` i umieszcza go na nowej pozycji (funkcja: `umiescAgenta()`). Droga agenta jest ustala funkcją `droga()`.Przykład drogi agenta https://youtu.be/RLe2ZN5SFLo.
### Reprezentacja wiedzy
Klasa `Field` - reprezentuje pola w magazynie. Posiada pola:
- `x` - współrzędna x
- `y` - współrzędna y
- `isEmpty` - określa czy pole jest puste, czy nie.
<br>
Klasa `Product` - reprezentuje poszczególne produkty znajdujące się w magazynie. Posiada pola:
- `name` - nazwa produktu
- `type` - rodzaj produktu
- `specs` - krótki opis produktu
- `price` - cena produktu
<br>
Klasa `Rack` - reprezentuje regały, które znajdują się w magazynie. Na jednym regale mogą znajdować się pordukty tego samego typu. Posiada pola:
- `noOfShelf` - liczbę półek danego regału
Metody:
- `addShelf()` - dodającą półkę do regału
- `isEmpty()` - zwracającą **true**, jeśli regał nie ma żadnych półek lub **false** w przeciwnym wypadku
<br>
Klasa `Shelf` - reprezentuje półkę, w regale. Na jednej półce mogą znajdować się produkty o tej samej specyfikacji. Posiada pola:
- `number` - numer półki
- `typOfProduct` - rodzaj produktu, jaki znajduję się na półce

View File

@ -0,0 +1,87 @@
export default class Agent{
constructor(positionX, positionY, turn){
this.positionX = positionX;
this.positionY = positionY;
this.turn = turn;
}
getParams(){
let params = {};
positionX = this.positionX;
positionY = this.positionY;
turn = this.turn;
params = {positionX, positionY, turn};
return params;
}
goForward(){
if(this.turn == 'Up'){
this.positionY += 1;
}
else if(this.turn == 'Down'){
this.positionY -= 1;
}
else if(this.turn == 'Left'){
this.positionX -= 1;
}
else if(this.turn == 'Right'){
this.positionX += 1;
}
}
turnLeft(){
if(this.turn == 'Up'){
this.turn = 'Left';
}
else if(this.turn == 'Down'){
this.turn = 'Right';
}
else if(this.turn == 'Left'){
this.turn = 'Down';
}
else if(this.turn == 'Right'){
this.turn = 'Up'
}
}
turnRight(){
if(this.turn == 'Up'){
this.turn = 'Right';
}
else if(this.turn == 'Down'){
this.turn = 'Left';
}
else if(this.turn == 'Left'){
this.turn = 'Up';
}
else if(this.turn == 'Right'){
this.turn = 'Down'
}
}
showAgent(){
console.log(this.turn)
if(this.turn === "Up"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Up.png')";
}
else if(this.turn === "Down"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Down.png')";
}
else if(this.turn === "Right"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Right.png')";
}
else if(this.turn === "Left"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Left.png')";
}
}
hideAgent(){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "";
}
}

View File

@ -0,0 +1,30 @@
import Field from './Field.js'
export function createBoard(rangeX, rangeY){
const board = [];
for(let y = 0; y < rangeY; y++){
const row = [];
for(let x = 0; x < rangeX; x++){
let field = new Field(x, y, false, false, 1);
row.push(field)
}
board.push(row)
}
return board
}
export function showBoard(board){
for(let y = board.length - 1; y >= 0 ; y--){
document.getElementById("board").innerHTML += "<div class='row' id='row-" + y + "'> </div>";
for(let x = 0; x < board[y].length; x++){
document.getElementById("row-" + y).innerHTML += "<div class='field' id=" + x + "-" + y + "> </div>"
}
}
}

View File

@ -0,0 +1,22 @@
export default class Field{
constructor(x, y, isShelf, isOccupiedByAgent, costOfTravel){
this.xField = x;
this.yField = y;
this.isShelf = isShelf;
this.isOccupiedByAgent = isOccupiedByAgent;
this.costOfTravel = costOfTravel;
}
getParams(){
let params = {};
xField = this.xField;
yField = this.yField;
isShelf = this.isShelf;
isOccupiedByAgent = this.isOccupiedByAgent;
costOfTravel = this.costOfTravel;
params = {xField, yField, isShelf, isOccupiedByAgent, costOfTravel}
return params;
}
}

View File

@ -0,0 +1,125 @@
// import Agent from './Agent.js'
// //Klasy
// class Field {
// constructor(x, y, isEmpty) {
// this.xField = x;
// this.yField = y;
// this.isFieldEmpty = isEmpty;
// }
// getCoordinates(){
// return this.xField + this.yField;
// }
// getStatus(){
// return this.isFieldEmpty;
// }
// }
// class Product {
// constructor(name, type, farcing, price) {
// this.name = name;
// this.type = type;
// this.farcing = farcing;
// this.price = price
// }
// }
// class Rack{
// constructor(noOfShelf, typOfProduct) {
// this.noOfShelf = noOfShelf;
// }
// addShelf(){
// this.noOfShelf = this.noOfShelf + 1;
// }
// isEmpty(){
// if (this.noOfShelf === 0){
// return true;
// }else {
// return false;
// }
// }
// }
// class Shelf {
// constructor(number) {
// this.number = number;
// }
// }
// //Objekty i zmienne
// var regaly = ['1-1', '1-3', '1-4', '1-6', '1-7', '1-9', '2-1', '2-9', '3-3', '3-4', '3-6', '3-7', '4-1', '4-9', '5-1', '5-3', '5-4', '5-6', '5-7', '5-9']
// const agent1 = new Agent(3, 0);
// //Funkcja uruchamiająca prace calego scriptu
// function start(){
// //ponumerujPola();
// pokolorujRegaly();
// umiescAgenta(agent1);
// droga(agent1);
// }
// //Funkcja kolorujaca miejsca na planszy gdzie znajduja sie regaly
// function pokolorujRegaly(){
// let x;
// for(x = 0; x < regaly.length; x++){
// document.getElementById(regaly[x]).className = 'regal';
// }
// }
// //Funkcja wyswietlajaca id pol
// function ponumerujPola(){
// let x,y
// for(x = 0; x < 7; x++){
// for(y = 0; y < 11; y++){
// id = x.toString() + "-" + y.toString();
// document.getElementById(id).innerHTML = id;
// }
// }
// }
// //Funkcja usuwająca agenta z pola, przed przemieszczeniem
// function usunAgenta(agent){
// document.getElementById(agent.getId()).style.backgroundImage = "none";
// }
// //Funckja wyswietlajaca agenta gdy ten zmieni polozenie
// function umiescAgenta(agent) {
// document.getElementById(agent.getId()).style.backgroundImage = "url('Agent.jpg')";
// }
// //Funkcja zmieniajaca polozenie agenta o 1 pole
// function przemieszczenie(side, time, agent){
// const lastPosition = agent.getId();
// setTimeout(function(){
// usunAgenta(agent)
// if(side == "left")
// agent.left();
// if(side == "right")
// agent.right();
// if(side == "up")
// agent.up();
// if(side == "down")
// agent.down();
// umiescAgenta(agent);
// }, time);
// }
// //Funkcja ktora ustala droge agenta do przebycia
// function droga(agent) {
// przemieszczenie("right", 1000, agent);
// przemieszczenie("right", 2000, agent);
// przemieszczenie("up", 3000, agent);
// przemieszczenie("right", 4000, agent);
// przemieszczenie("right", 5000, agent);
// przemieszczenie("right", 6000, agent);
// przemieszczenie("right", 7000, agent);
// przemieszczenie("right", 8000, agent);
// przemieszczenie("right", 9000, agent);
// }

View File

@ -1,27 +1,147 @@
import * as Board from './Board.js' //Klasy
import Agent from './Agent.js' class Agent{
constructor(positionX, positionY, turn){
this.positionX = positionX;
this.positionY = positionY;
this.turn = turn;
}
let board = Board.createBoard(10,10); getParams(){
Board.showBoard(board); let params = {};
positionX = this.positionX;
positionY = this.positionY;
turn = this.turn;
params = {positionX, positionY, turn};
return params;
}
goForward(){
if(this.turn == 'Up'){
this.positionY += 1;
}
else if(this.turn == 'Down'){
this.positionY -= 1;
}
else if(this.turn == 'Left'){
this.positionX -= 1;
}
else if(this.turn == 'Right'){
this.positionX += 1;
}
}
turnLeft(){
if(this.turn == 'Up'){
this.turn = 'Left';
}
else if(this.turn == 'Down'){
this.turn = 'Right';
}
else if(this.turn == 'Left'){
this.turn = 'Down';
}
else if(this.turn == 'Right'){
this.turn = 'Up'
}
}
turnRight(){
if(this.turn == 'Up'){
this.turn = 'Right';
}
else if(this.turn == 'Down'){
this.turn = 'Left';
}
else if(this.turn == 'Left'){
this.turn = 'Up';
}
else if(this.turn == 'Right'){
this.turn = 'Down'
}
}
showAgent(){
console.log(this.turn)
if(this.turn === "Up"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Up.png')";
}
else if(this.turn === "Down"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Down.png')";
}
else if(this.turn === "Right"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Right.png')";
}
else if(this.turn === "Left"){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "url('img/Left.png')";
}
}
hideAgent(){
document.getElementById(this.positionX + "-" + this.positionY).style.backgroundImage = "";
}
}
class Field{
constructor(x, y, isShelf, isOccupiedByAgent, costOfTravel){
this.xField = x;
this.yField = y;
this.isShelf = isShelf;
this.isOccupiedByAgent = isOccupiedByAgent;
this.costOfTravel = costOfTravel;
}
getParams(){
let params = {};
xField = this.xField;
yField = this.yField;
isShelf = this.isShelf;
isOccupiedByAgent = this.isOccupiedByAgent;
costOfTravel = this.costOfTravel;
params = {xField, yField, isShelf, isOccupiedByAgent, costOfTravel}
return params;
}
}
//funckcje
function createBoard(rangeX, rangeY){
const board = [];
for(let y = 0; y < rangeY; y++){
const row = [];
for(let x = 0; x < rangeX; x++){
let field = new Field(x, y, false, false, 1);
row.push(field)
}
board.push(row)
}
return board
}
function showBoard(board){
for(let y = board.length - 1; y >= 0 ; y--){
document.getElementById("board").innerHTML += "<div class='row' id='row-" + y + "'> </div>";
for(let x = 0; x < board[y].length; x++){
document.getElementById("row-" + y).innerHTML += "<div class='field' id=" + x + "-" + y + "> </div>"
}
}
}
let board = createBoard(10,10);
let agent = new Agent(0,0, 'Right'); let agent = new Agent(0,0, 'Right');
function start(){
showBoard(board);
agent.showAgent(); agent.showAgent();
}