Wojskowa Akademia Techniczna w Warszawie
Systemy Eksperckie
Zadanie laboratoryjne z przedmiotu Systemy Eksperckie
Autor: Prowadzący:
kpr. pchor. Piotr JAKUBOWSKI dr inż. Roman Wantoch - Rekowski
Grupa: I8C1S1
Id: 43564
Rok akademicki: 2011/2012
Zadanie:
Zaprojektować i zaimplementować algorytm heurystyczny (najpierw najlepszy) ustawiający na szachownicy nXn polowej n hetmanów tak aby nie atakowały się wzajemnie. W rozwiązaniu należy zaproponować własną modyfikację heurystycznej funkcji oceny wierzchołków. Hetmany należy ustawić w kolejnych wierszach począwszy od pierwszego.
Problem n hetmanów jest przykładowym zadaniem ustawieniu n hetmanów na szachownicy n*n . Program liczy położenie dla każdego hetmana na szachownicy wartość funkcji oceny, stawia hetmana na polu o największej wartości funkcji i przechodzi do kolejnej kolumny wylicza wartość funkcji, wybiera położenie i dostawia kolejnego hetmana. Itp. Aż do końca podanej wartości n szachownicy.
Analityczna postać zaproponowanej funkcji heurystycznej.
F(w) = dl_tablicy_hetmanow*3000 + (x*n + | (ns/2 – y)| + (x*n + x*200+ (|ns/3 - y |))
Ekran główny
Symulacja dla n = 9. Program wykonany w Javie. Użytkownik podaje liczbę wymiaru szachownicy po czym zatwierdza, szachownica zmienia wygląd po czym po naciśnięciu przycisku symulacja. Hetmany ustawiane są na szachownicy. Użytkownik ma do wyboru zmianę koloru szachownicy oraz wyboru koloru hetmanów.
Fragment kodu żródłowego
Private int funcja (int n, int m, int p){
int wartosc = 0;
for (int y = 0; y < n; y++ ){
for (int x = 0; x< n ; X++){
int pozycja = a.charAt(x) + m.charAt(y);
if (m.pole(pozycja)! = -1) {
wartosc+ =x*n+ Math.abs(ns/2-y);
}
If (p.pole(pozycja)!=-1){
wartosc+= x*n + x* 200 + Math.abs(ns/3 - y)
}
}
}
return wartość +p.length *3000;
}
-------------------------------------------------------------------------------------
Rysowanie szachownicy
private void paintSzachownica(Graphics g) {
g.setColor(new Color(0, 102, 102));
g.fillRect(0, 0, 400, 400);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if ((i + j) % 2 == 0) {
// g.setColor(kolor1);
g.drawImage(image1, i*X, j*X, X, X, this);
} else {
// g.setColor(kolor2);
g.drawImage(image2, i*X, j*X, X, X, this);
}
// g.fillRect(i * X, j * X, X, X);
}
}
---------------------------------------------------------------------------------------
public void symuluj() {
watek = new Thread(this);
watek.start();
flaga = true;
----------------------------------------------------------------------------------------