
апсос-лабы-готовые / 1 / LR4
.docЛАБОРАТОРНАЯ РАБОТА №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.
Вывод: в ходе выполнения лабораторной работы мы научились выбирать критерии оценки конструкции технического объекта и реализовывать (программировать) алгоритм поиска оптимального варианта на дереве решений.