Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
07.06.2015
Размер:
117.25 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №4

Выполнил: ст. гр. ИТ 01-2 Кузнецов А.В.

Выбор варианта технического решения и его оценка, поиск оптимального варианта по дереву решений

Цель работы: научиться выбирать критерии оценки конструкции технического объекта и реализовывать (программировать) алгоритм поиска оптимального варианта на дереве решений.

Ход работы:

Таблица оценок

Критерий

качества

Вершина или

увелич.

вращающ.

момента

уменьш.

скорости вращ

КПД

стоимость

технологичность

1

2

3

4

5

синхр. электродвигатель

0

0

0,9

0,5

0,5

асинхр. электродвигатель

0

0

0,85

0,95

0,75

муфта

0

0

0,99

0,75

0,85

цепная передача

0

0,5

0,9

0,75

0,85

ременная передача

0

0,5

0,94

0,75

0,87

1-ноступенчатый редуктор

0,6

0,5

0,80

0,9

0,7

2-хступенчатый редуктор

0,7

0,7

0,90

0,8

0,65

3-хступенчатый редуктор

0,8

0,8

0,91

0,6

0,4

Окно программы:

Дерево решения с оценками вершин:

* - привод

o - элдвигатель

* - синхронный [ 0; 0; 0,9; 0,5; 0,5; ] Qi=1,355

* - асинхронный [ 0; 0; 0,85; 0,95; 0,75; ] Qi=1,8625

o - вх передача

* - муфта [ 0; 0; 0,99; 0,75; 0,85; ] Qi=1,8355

* - ременная перадача [ 0; 0,5; 0,94; 0,75; 0,85; ] Qi=2,1505

* - цепная передача [ 0; 0,5; 0,94; 0,75; 0,87; ] Qi=2,1615

o - редуктор

* - 1ступенчатый [ 0,6; 0,5; 0,8; 0,9; 0,7; ] Qi=2,555

* - 2ступенчатый [ 0,7; 0,7; 0,9; 0,8; 0,65; ] Qi=2,7225

* - 3ступенчатый [ 0,8; 0,8; 0,91; 0,6; 0,4; ] Qi=2,557

o - вых передача

Результат – вариант технического решения:

* - привод

o - элдвигатель

* - асинхронный [ 0; 0; 0,85; 0,95; 0,75; ] Qi=1,8625

o - вх передача

* - цепная передача [ 0; 0,5; 0,94; 0,75; 0,87; ] Qi=2,1615

o - редуктор

* - 2ступенчатый [ 0,7; 0,7; 0,9; 0,8; 0,65; ] Qi=2,7225

o - вых передача

Суммарная оценка варианта решения: Q=6,7465

Код программы:

unit uCriter;

{в этом модуле реализованы средства работы с критериями}

interface

uses SysUtils;

type TVes = array[0..4] of Real;

function Qi(m: byte; vesk, k: TVes): Real;

//функция вычисляет суммарную оценку вершины

function SetQiToCriterStr(st: ShortString): ShortString;

//добавляет к строке с оценками по критериям суммарную оценку

function GetQiFromCriterStr(st: ShortString): Real;

//возвращает значение суммарной оценки из строки с критериями

var a: TVes; //веса критериев

implementation

function Qi(m: byte; vesk, k: TVes): Real;

var j: byte;

sum: Real;

begin

sum:=0;

for j:=0 to m-1 do

begin

sum:=sum + vesk[j]*k[j];

end;

Result:=sum;

end;

function SetQiToCriterStr(st: ShortString): ShortString;

var i,n,k: Byte;

oc,s: ShortString;

o: TVes;

q: Real;

nottz: Boolean;

begin

n:=Pos('[',st);

if n<>0

then begin

n:=n+1; //учет пробела

k:=Pos(']',st);

oc:=Copy(st,n,(k-n));

//разбор строки внутри []

i:=0;

while Pos(';',oc)<>0 do

begin

n:=Pos(';',oc);

s:=Copy(oc,1,n-1);

o[i]:=StrToFloat(s);

oc:=Copy(oc,n+2,Length(oc));

i:=i+1;

end;

q:=Qi(i,a,o);

Result:=st+' Qi='+FloatToStr(q);

end

else Result:=st;

end;

function GetQiFromCriterStr(st: ShortString): Real;

var k: Byte;

begin

k:=Pos('Qi=',st);

if k<>0 then begin

st:=Copy(st,k+3,Length(st)-k);

Result:=StrToFloat(st);

end

else Result:=0;

end;

end.

unit uMain;

interface

uses

...

uVesKriter, uCriter, uOcenkiVersh;

type

TfrmMain = class(TForm)

...

private

{ Private declarations }

public

{ Public declarations }

procedure AddText(block: String);

function GetPowerOfTree(node: TTreeNode): Integer;

function IsAnd(node: TTreeNode): Boolean;

function IsOr(node: TTreeNode): Boolean;

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.AddText(block: String);

var parent: TTreeNode;

begin

parent:=frmMain.TreeView1.Selected;

frmMain.TreeView1.Items.AddChild(parent,block);

end;

function TfrmMain.IsAnd(node: TTreeNode): Boolean;

begin

if node.Text[1]='*'

then Result:=True

else Result:=False;

end;

function TfrmMain.IsOr(node: TTreeNode): Boolean;

begin

if node.Text[1]='o'

then Result:=True

else Result:=False;

end;

//подсчет мощности дерева решений

function TfrmMain.GetPowerOfTree(node: TTreeNode): Integer;

var child: TTreeNode;

i: Integer;

begin

if not(node.HasChildren)

then Result:=1

else begin

if IsOr(node)

then begin

child:=node.getFirstChild;

i:=GetPowerOfTree(child);

while (node.GetNextChild(child) <> nil) do

begin

child:=node.GetNextChild(child);

i:=i+GetPowerOfTree(child);

end;

Result:=i;

end;

if IsAnd(node)

then begin

child:=node.getFirstChild;

i:=GetPowerOfTree(child);

while (node.GetNextChild(child) <> nil) do

begin

child:=node.GetNextChild(child);

i:=i*GetPowerOfTree(child);

end;

Result:=i;

end;

end;

end;

procedure TfrmMain.bbtnAddClick(Sender: TObject);

var st: String;

begin

st:='';

if rbtnAnd.Checked

then st:='* - ';

if rbtnOr.Checked

then st:='o - ';

st:=st+edBlock.Text;

AddText(st);

edBlock.Clear;

edBlock.SetFocus;

end;

procedure TfrmMain.bbtnClearClick(Sender: TObject);

begin

TreeView1.Items.Clear;

end;

procedure TfrmMain.bbtnDeleteClick(Sender: TObject);

var node: TTreeNode;

begin

node:=TreeView1.Selected;

TreeView1.Items.Delete(node);

end;

procedure TfrmMain.bbtnSaveClick(Sender: TObject);

var fname: TFileName;

begin

if SaveDialog1.Execute

then begin

fname:=SaveDialog1.FileName;

TreeView1.SaveToFile(fname);

end;

end;

procedure TfrmMain.bbtnOpenClick(Sender: TObject);

var fname: TFileName;

begin

if OpenDialog1.Execute

then begin

fname:=OpenDialog1.FileName;

TreeView1.LoadFromFile(fname);

TreeView1.FullExpand;

end;

end;

procedure TfrmMain.mnuFileExitClick(Sender: TObject);

begin

frmMain.Close;

end;

procedure TfrmMain.mnuHelpAboutClick(Sender: TObject);

begin

MessageDlg('Построение И/ИЛИ-дерева'+#13#10+'ДГМА ИТ 00-3'+

#13#10+'Постушной А.Н.',mtInformation,[mbOk],0);

end;

procedure TfrmMain.bbtnPowerClick(Sender: TObject);

var node: TTreeNode;

begin

if (TreeView1.Selected)<>nil

then begin

node:=TreeView1.Selected;

lblPower.Caption:='P = '+IntToStr(GetPowerOfTree(node));

end

else MessageDlg('Выберите одну из вершин дерева!',mtError,[mbOk],0);

end;

procedure TfrmMain.mnuCriterVesClick(Sender: TObject);

var i: Byte;

begin

if frmVesKriter.ShowModal=mrOk then

for i:=1 to 5 do

begin

uCriter.a[i-1] := StrToFloat(uVesKriter.frmVesKriter.vlstedCriter.Cells[1,i]);

end;

end;

procedure TfrmMain.FormCreate(Sender: TObject);

begin

DecimalSeparator:=',';

end;

procedure TfrmMain.bbtnAddVesClick(Sender: TObject);

// добавление оценок вершин

var node: TTreeNode;

i: Byte;

begin

if IsAnd(TreeView1.Selected) then

begin

if frmOcenkiVersh.ShowModal=mrOk

then begin

node:=TreeView1.Selected;

node.Text:=node.Text+' [ ';

for i:=1 to 5 do

node.Text:=node.Text +

uOcenkiVersh.frmOcenkiVersh.vlstedOcenki.Cells[1,i] +

'; ';

node.Text:=node.Text+']';

end

end

else MessageDlg('Выберите вершину ИЛИ!',mtError,[mbOk],0);

end;

procedure TfrmMain.bbtnCalcClick(Sender: TObject);

var i: Word;

begin

i:=1;

with TreeView1 do

begin

while i<=Items.Count-1 do

begin

if (Items.Item[i].HasChildren=false)

then begin

Items.Item[i].Text:=SetQiToCriterStr(Items.Item[i].Text);

end;

i:=i+1;

end;

end;

end;

procedure TfrmMain.bbtnOptimalClick(Sender: TObject);

var i: Word;

max,q: Real;

lastNode, child, node: TTreeNode;

begin

i:=1;

with TreeView1 do

begin

while i<=Items.Count-1 do

begin

child:=Items.Item[i].getFirstChild;

if (Items.Item[i].HasChildren)and(child.HasChildren=false)

then begin

node:=Items.Item[i];

max:=GetQiFromCriterStr(node.getFirstChild.Text);

child:=node.getFirstChild; lastNode:=child;

while (node.GetNextChild(child) <> nil) do

begin

child:=node.GetNextChild(child);

q:=GetQiFromCriterStr(child.Text);

if q>max

then begin max:=q; lastNode.Delete; lastNode:=child; end

else child.Delete;

end;

end;

i:=i+1;

end;

end;

end;

procedure TfrmMain.bbtnOcenkaVarClick(Sender: TObject);

var i: Word;

sum, q: Real;

begin

i:=1; sum:=0;

with TreeView1 do

begin

while i<=Items.Count-1 do

begin

if (Items.Item[i].HasChildren=false)

then begin

q:=GetQiFromCriterStr(Items.Item[i].Text);

sum:=sum+q;

end;

i:=i+1;

end;

end;

lblVar.Caption:='Q = '+FloatToStr(sum);

end;

end.

Вывод: в ходе выполнения лабораторной работы мы научились выбирать критерии оценки конструкции технического объекта и реализовывать (программировать) алгоритм поиска оптимального варианта на дереве решений.

Соседние файлы в папке 1