Программирование - это просто
Advertisement
Главная arrow Искусственный интеллект arrow Создаем экспертную систему arrow Разрабатываем экспертную систему. Урок 5. Улучшаем интерфейс нашей экспертной системы.
25.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Разрабатываем экспертную систему. Урок 5. Улучшаем интерфейс нашей экспертной системы. Печать E-mail
Автор megabax   
01.05.2011 г.
unit AIObj

Разрабатываем экспертную систему. Урок 5. Улучшаем интерфейс нашей экспертной системы.

Все статьи по данной теме

Исходники к уроку можно скачать здесь.

Сегодня мы немножко доработаем интерфейс нашей самообучающейся программы. Откроем проект предыдущего урока. Удалим компонент mmPrintFiled -он нам больше не понадобится. Положим на форму некоторые компоненты, согласно приведенной ниже таблицы:

Компонент Имя (свойство Name) Назначение
TEdit edVars Редактирование значение переменной vars
TStringGrid sgValues Для редактирования значений массивов
TEdit edOutcome1 Для редактирования исхода 1
TEdit edOutcome2 Для редактирования исхода 2

Положим так же на форму метки, что бы сделать поясняющие надписи, см. скриншот*: 

Разрабатываем экспертную систему. Урок 5. Улучшаем интерфейс нашей экспертной системы.

Ну, и перепишем код нашей программы, вот как он будет теперь выглядеть:

unit ESUnit;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Inputform, Spin, Grids;

 

type

  TfrmExpertSystem = class(TForm)

    btnStart: TButton;

    Label1: TLabel;

    sgValues: TStringGrid;

    Label2: TLabel;

    edOutcome1: TEdit;

    Label3: TLabel;

    edOutcome2: TEdit;

    edVars: TEdit;

    Label4: TLabel;

    procedure btnStartClick(Sender: TObject);

    procedure sgValuesSetEditText(Sender: TObject; ACol, ARow: Integer;

      const Value: String);

    procedure FormCreate(Sender: TObject);

    procedure edOutcome1Change(Sender: TObject);

    procedure edOutcome2Change(Sender: TObject);

    procedure edVarsChange(Sender: TObject);

  private

    { Private declarations }

    vars:integer;

    svars:array of string;

    values:array of integer;

    rules:array of integer;

    outcome1,outcome2:string;

    procedure ShowGrid;

  public

    { Public declarations }

    procedure print(AStr:string);

    function Input:string;

  end;

 

var

  frmExpertSystem: TfrmExpertSystem;

 

implementation

 

procedure TfrmExpertSystem.print(AStr:string);

begin

 

end;

 

function TfrmExpertSystem.Input:string;

var frm:TfrmInput;

begin

  frm:=TfrmInput.Create(self);

  frm.ShowModal;

  Result:=frm.edInput.Text;

end;

 

 

{$R *.dfm}

 

function YNBoolToInt(s:string):Integer;

begin

  if UpperCase(s)='Y' then result:=1 else result:=0;

end;

 

function IntToYNBool(s:integer):string;

begin

  if s>=1 then result:='Y' else result:='N';

end;

 

procedure TfrmExpertSystem.btnStartClick(Sender: TObject);

var  s:string;

    decision:integer;

    i:integer;

begin

 

   //поиск решения

   decision:=0;

   for i:=Low(values)to High(values) do

   begin

      decision:=decision+values[i]*rules[i];

   end;

 

   //сообщить пользователю результат решения

   if decision>0 then

     s:='Возможный исход '+outcome1

   else

     s:='Возможный исход '+outcome2;

   s:=s+'. Это верно?';

 

 

   if messageDlg(s,mtConfirmation,[mbYes,mbNo],0)=mrNo then

   begin

      //корректировка правил

      if decision>0 then

         for i:=Low(rules) to High(Rules) do Rules[i]:=rules[i]-Values[i]

      else

         for i:=Low(rules) to High(Rules) do Rules[i]:=rules[i]+Values[i];

   end;

 

   ShowGrid;

 

end;

 

procedure TfrmExpertSystem.sgValuesSetEditText(Sender: TObject; ACol,

  ARow: Integer; const Value: String);

begin

   case ACol of

     1:svars[ARow-1]:=Value;

     2:values[ARow-1]:=YNBoolToInt(Value);

     3:rules[ARow-1]:=StrToInt(Value);

   end;

end;

 

procedure TfrmExpertSystem.FormCreate(Sender: TObject);

begin

  sgValues.Cells[1,0]:='Утверждение';

  sgValues.Cells[2,0]:='Есть';

  sgValues.Cells[3,0]:='Правило';

 

    sgValues.ColWidths[0]:=25;

  sgValues.ColWidths[1]:=300;

 

   edVarsChange(nil);

end;

 

procedure TfrmExpertSystem.ShowGrid;

var i:integer;

begin

  for i:=Low(svars) to high(svars) do

  begin

     sgValues.Cells[1,i+1]:=svars[i];

     sgValues.Cells[2,i+1]:=IntToYNBool(values[i]);

     sgValues.Cells[3,i+1]:=IntToStr(rules[i]);

  end;

end;

 

procedure TfrmExpertSystem.edOutcome1Change(Sender: TObject);

begin

  outcome1:=edOutcome1.Text;

end;

 

procedure TfrmExpertSystem.edOutcome2Change(Sender: TObject);

begin

  outcome2:=edOutcome2.Text;

end;

 

procedure TfrmExpertSystem.edVarsChange(Sender: TObject);

var LastVars, i:integer;

begin

 

   LastVars:=Vars;

 

   //Установим новое количество

   vars:=StrToInt(edVars.Text);

   SetLength(values,vars);

   SetLength(rules,vars);

   SetLength(svars,vars);

 

     //реинциализация массива

   if Vars>LastVars then for i:=vars to LastVars-1 do

   begin

      values[i]:=0;

      rules[i]:=0;

   end;

 

   sgValues.RowCount:=vars+1;

 

   ShowGrid;

end;  

 

end.

Обратите внимание, что метод TfrmExpertSystem.sgValuesSetEditText является обработчиком события OnSetEditText компонента sgValues, методы TfrmExpertSystem.edOutcome1Change и TfrmExpertSystem.edOutcome2Change являются обработчиками события OnChange компонентов edOutcome1 и edOutcome2 соответственно, а метод edVarsChange - это  обработчик OnChange объекта edVars. 

А теперь скомпилируем программу и протестируем ее:

Разрабатываем экспертную систему. Урок 5. Улучшаем интерфейс нашей экспертной системы.

Как видим, интерфейс стал более удобным, при чем программа показывает нам даже сформированные правила.


Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями программного продукта "Turbo Delphi", авторское право на который принадлежит "Borland Software Corporation".


Исходники к уроку можно скачать здесь.

Все статьи по данной теме

Последнее обновление ( 22.10.2011 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги