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.
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;
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.
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
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.
1
2
3
4
5
6
7