Sztuczna inteligencja

PROJEKT I

Ernest Rogowski

Temat: Zbudować inteligentny system sortowania przesyłek pocztowych. Wykorzystać grafy lub drzewa.

Wykonanie projektu

1. Wczytywanie przykładowych danych

Po uruchomieniu programu pokazuje się tylko jeden przycisk „Wczytaj dane”.

Po kliknięciu na niego pojawiają się pozostałe przyciski, a co najważniejsze to tablic wczytują się przykładowe dane. W zamyśle miałem aby te dane były odczytywane z osobnego pliku (gdzie byłyby trzymane dane po skończeniu pracy z programem), jednak nie powiodło się to wiec program wczytuje dane zapisane w kodzie, m.in.:

topis[0]:='Polska';

tbrat[0]:=1;

tsyn[0]:=2;

topis[1]:='Świat';

tbrat[1]:=0;

tsyn[1]:=6;

topis[2]:='Mazowieckie';

tbrat[2]:=3;

tsyn[2]:=9;

topis[3]:='Malopolskie';

tbrat[3]:=4;

tsyn[3]:=11;

topis[4]:='Łódzkie';

tbrat[4]:=5;

tsyn[4]:=13;

Kliknięcie tego przycisku powoduje również pokazanie na formatce pozostałych przycisków:

Button1.Visible:=True;

Edit1.Visible:=True;

Button3.Visible:=True;

Edit2.Visible:=True;

Button4.Visible:=True;

oraz wyświetlenie pierwszych lokalizacji przesyłkowych na formie:

Repeat

tab[j]:=i;

Label2.Caption:=Label2.Caption + IntToStr(j)+ '. ' + topis[i]+#13;

i:=tbrat[i];

inc(j);

Until (i = 0);

2. Wybieranie lokalizacji z przedstawionych

Kolejnym przyciskiem jest przycisk „START” wraz z pustym polem.

0x01 graphic

W pole to wpisujemy wartość liczbową jednej z lokalizacji przedstawionych obok i klikamy „START”- powoduje to, że przechodzimy w głąb tej lokalizacji i wyświetlone zostają jej „podlokalizacje”.

W swoim projekcie posłużyłem się trzema tablicami do w których zapisywane są dane lokalizacji oraz jedną pomocniczą do zapamiętywania aktualnie wyświetlanych pozycji:

- topis: array of string; // zapamiętuje nazwy lokalizacji

- tbrat: array of integer; // zapamiętuje numer brata lokalizacji

- tsyn: array of integer; // zapamiętuje syna lokalizacji

- tab : array of integer;

0x08 graphic
0x01 graphic

W przykładzie pokazanym powyżej wartości tablic tbrat i tsyn byłyby następujące:

tbrat[1]=2; tbrat[2]=0; tbrat[3]=4; tbrat[4]=5; tbrat[5]=0 …

tsyn[1]=3; tsyn[2]=6; tsyn[3]=0; tsyn[4]=0; tsyn[5]=0 …

Jeżeli po przejściu wszystkich kolejnych etapów lokalizacji dojdziemy do końca mamy dwie możliwości:

- dodać kolejną lokalizację

- przejść do początku, co oznacza w praktyce przypisanie przesyłce lokalizacji końcowej

3. Nowa przesyłka

Przycisk „Nowa przesyłka” powoduje wyświetlenie pierwszej grupy lokalizacji. Możliwe jest to w dowolnym miejscu naszego drzewa (np. nastąpi pomyłka możemy przejść do początku a przesyłka nie będzie zaadresowana). Przycisku tego należy użyć również po usunięciu jakiegoś elementu z listy lokalizacji.

Oto fragment kodu:

tab[1]:=0;

x:=1;

i:=0;

j:=1;

Repeat

tab[j]:=i;

Label2.Caption:=Label2.Caption + IntToStr(j)+ '. ' + topis[i]+#13;

i:=tbrat[i];

inc(j);

Until (i = 0);

x:=j-1;

4. Dodawanie nowych lokalizacji

Przycisk „Dodaj lokalizacje” wraz z oknem obok niego służą do dodawania nowych lokalizacji dla przesyłek.

0x01 graphic

W puste okno wystarczy wpisać nazwę nowej lokalizacji oraz kliknąć na „Dodaj lokalizacje”.

Z opcji tej możemy korzystać w dowolnym momencie, a nowa lokalizacja zostanie automatycznie dodana do jako „brat” do ostatniego elementu z pośród aktualnie wyświetlonych. Nowa lokalizacja pojawi się obrazu na ekranie, dzięki czemu możliwe jest jej wybranie natychmiast po dodaniu, co oczywiście spowoduje że trafimy do miejsca gdzie nie ma dalszych lokalizacji (co robić w takich sytuacjach wspomniałem w punkcie 2.).

Oto fragment kodu źródłowego:

topis[i]:=Edit2.Text;

if Label2.Caption='' then begin

tsyn[tab[x]]:=i;

Label2.Caption:='1. '+ topis[i];

end else begin

tbrat[tab[x]]:=i;

Label2.Caption:=Label2.Caption + IntToStr(x+1)+ '. ' + topis[i]+#13;

Edit2.Text:='';

Inc(x);

tab[x]:=i;

5. Usuwanie lokalizacji

Do usuwania lokalizacji służą następujące komponenty

0x01 graphic

Po wpisaniu w puste pole numeru jednej z wyświetlonych lokalizacji i kliknięciu przycisku „Usuń lokalizacje” nastąpi jaj usunięcie. Jak widać mamy do wyboru dwie opcje co zrobić z „potomkami” lokalizacji którą usuwamy.

Po usunięciu którejkolwiek z lokalizacji (jak już wspominałem wcześniej) należy użyć przycisku „Nowa przesyłka”.

Case RadioGroup1.ItemIndex of

//--------------usun potomkow--------------------------//

0: begin

j:=tsyn[i];

k:=-1;

Repeat

Inc(k);

Until (tsyn[k]=i)or(tbrat[k]=i);

if tbrat[k]=i then tbrat[k]:=tbrat[i];

if tsyn[k]=i then tsyn[k]:=tbrat[i];

while tbrat[j]<>0 do begin

topis[i]:='';

tbrat[i]:=0;

tsyn[i]:=0;

i:=j;

j:=tbrat[j];

end;

topis[i]:='';

tbrat[i]:=0;

tsyn[i]:=0;

end;

6. Pokazywanie już zaadresowanych przesyłek

Opcja służy jako podgląd przesyłek które już zaadresowaliśmy (z którymi doszliśmy do lokalizacji końcowej). Przesyłki wyświetlają się z kolejnymi numerami i nazwą lokalizacji końcowej.

0x01 graphic

1

2

3

4

5

6

7