Rabu, 16 April 2014

Finite State Machine

21.14 Posted by Unknown No comments

Apa itu Finite State Machine?



Finite state machines (FSM) merupakan teknik pemodelan khusus untuk logika rangkaiansekuensial. Pemodelan ini sangat membantu dalam perancangan sistem terutama jenis tertentuyang tugasnya membentuk urutan yang jelas (misalnya pengendali digital). Kita memulai bab inidengan meninjau konsep-konsep fundamental yang berkaitan dengan FSM.

Desain dan Implementasi Finite State Machine

Bayangkan situasi berikut: kita memiliki robot cerdas berbentuk anjing sebut saja Dog. Dog dapat melakukan atraksi seperti bermain bola, berguling-guling, makan dan tidur. Tiap atraksi dijalankan dengan menggunakan cartridge-cartridge berisi program yang dicolok ke sebuah slot dalam body Dog.

Cartridge ini mewakili state. Tanpa cartdridge, Dog hanyalah sebuah patung yang tidak bisa apa-apa. Kemampuan utama selain memproses cartridge dan menjalankan aksi yang diprogram di dalam cartridge (memproses input dan menghasilkan output berupa aksi) adalah kemampuan untuk mengganti cartridge dengan cartridge lain (menghasilkan transisi state ke state lain). Doog juga memiliki sensor untuk memantau level baterai. Jika level baterai turun, Dog akan mengubah cartridge yang sedang berada dalam slot.

Object-oriented finite state machine yang kita buat akan mirip dengan sistem cartridge di atas. Obyek state (TAIAction) dapat berisi perintah untuk melakukan aksi atau melakukan transisi ke obyek state lain. Untuk mengeksekusi perintah, obyek state akan dilengkapi metode ExecuteAction. Karena obyek state adalah obyek dasar, apa yang dikerjakan didalam ExecuteAction sepenuhnya menjadi tanggung jawab kelas turunan obyek state. Oleh karena itu ExecuteAction harus berupa metode virtual agar dapat di-override oleh kelas turunannya.

State juga memiliki metode yang akan dieksekusi ketika akan terjadi perubahan state yakni ketika hendak memasukan state yakni EnterAction dan ketika hendak keluar dari state yakni ExitAction. Kegunaan EnterAction dan ExitAction adalah sebagai berikut: bayangkan anda sedang membuat program game seperti WarCraft. Anda ingin karakter prajurit yang sedang berperang akan meneriakkan "Hore" ketika terjadi perubahan dari state berperang menjadi state stand by ketika musuh yang dihadapi telah kalah. Kode aksi teriakan "Hore" bisa diletakkan di dalam ExitAction state berperang atau EnterAction state stand by.
Jadi framework kita akan menjadi seperti dibawah ini:
 TAIAction=class(TObject)
  private
  public
    procedure EnterAction(entity:TAIEntity);virtual;
    procedure ExecuteAction(entity:TAIEntity);virtual;
    procedure ExitAction(entity:TAIEntity);virtual;
  end;

State-state dieksekusi oleh karakter dalam game yang selanjutnya kita sebut entity (TAIEntity). Entity menyimpan state dimana dia sedang berada. Jika state ini diubah, maka ExitAction state lama dieksekusi, kemudian state yang baru disimpan dan metode EnterAction state baru dieksekusi.

Entity juga memiliki property untuk menyimpan state sebelumnya. Kita membutuhkannya untuk contoh berikut: di game Warcraft, pekerja yang sedang menambang emas, ketika emas yang diambil sudah cukup akan meletakkan emas kedalam lumbung, kemudian akan kembali lagi ke tempat penambangan untuk melanjutkan pekerjaan menambang. Di sini terjadi transisi state dari state menambang menjadi state meletakkan emas. Setelah state meletakkan emas dieksekusi, state dikembalikan ke state sebelumnya (state menambang) dan mengeksekusi state tersebut.

Dengan memiliki kemampuan menyimpan state sebelumnya, proses reverse ke state sebelumnya jadi mudah.
TAIAction=class;
type TAIEntity=class(TObject)
  private
    FPreviousAction: TAIAction;
    FCurrentAction: TAIAction;
    procedure SetCurrentAction(const Value: TAIAction);
    procedure SetPreviousAction(const Value: TAIAction);
  public
    procedure Update;
  published
    property CurrentAction:TAIAction read FCurrentAction write SetCurrentAction;
    property PreviousAction:TAIAction read FPreviousAction write SetPreviousAction;
  end;
Entity memiliki metode Update. Di metode ini, ExecuteAction state akan dieksekusi. Metode ini dimaksudkan untuk eksekusi ExcuteAction yang aman untuk menghindari access violation karena CurrentAction mungkin saja nil. Ok berikut ini adalah implementasi lengkap kodenya
{-------------------------------
Implementasi Finite State Machine
menggunakan object-oriented
programming
--------------------------------
(c) 2006 Zamrony P Juhara
website: http://www.juhara.com
mail: 
 zamronyp@juhara.comThis e-mail address is being protected from spambots, you need JavaScript enabled to view it
 
-------------------------------}
unit u_ai;
 
interface
uses classes,sysutils;
 
type
  TAIAction=class;
 
  TAIEntity=class(TObject)
  private
    FPreviousAction: TAIAction;
    FCurrentAction: TAIAction;
    procedure SetCurrentAction(const Value: TAIAction);
    procedure SetPreviousAction(const Value: TAIAction);
  public
    procedure Update;
  published
    property CurrentAction:TAIAction read FCurrentAction write SetCurrentAction;
    property PreviousAction:TAIAction read FPreviousAction write SetPreviousAction;
  end;
 
  TAIAction=class(TObject)
  private
  public
    procedure EnterAction(entity:TAIEntity);virtual;
    procedure ExecuteAction(entity:TAIEntity);virtual;
    procedure ExitAction(entity:TAIEntity);virtual;
  end;
 
implementation
 
{ TAIEntity }
 
procedure TAIEntity.SetCurrentAction(const Value: TAIAction);
begin
  //run ExitAction aksi lama sebelum berpindah ke aksi baru
  if FCurrentAction<>nil then
    FCurrentAction.ExitAction(self);
 
  //set aksi baru
  FCurrentAction := Value;
 
  //run EnterAction aksi baru
  if FCurrentAction<>nil then
    FCurrentAction.EnterAction(self);
end;
 
procedure TAIEntity.SetPreviousAction(const Value: TAIAction);
begin
  FPreviousAction := Value;
end;
 
procedure TAIEntity.Update;
begin
  if FCurrentAction<>nil then
     FCurrentAction.ExecuteAction(self);
end;
 
{ TAIAction }
 
procedure TAIAction.EnterAction(entity: TAIEntity);
begin
  //do nothing
end;
 
procedure TAIAction.ExecuteAction(entity: TAIEntity);
begin
  //do nothing
end;
 
procedure TAIAction.ExitAction(entity: TAIEntity);
begin
  //do nothing
end;
 
end.

0 komentar:

Posting Komentar