Автор работы: Пользователь скрыл имя, 02 Апреля 2011 в 23:36, курсовая работа
Целью данной курсовой работы является рассмотрение применения методов распространения ограничений при поиске допустимых решений.
Курсовая работа состоит из двух частей.
В первое части рассмотрены теоретические аспекты задачи распространения ограничений, а также общие сведения об интервальной арифметике.
ВВЕДЕНИЕ 3
1 ОБЩИЕ СВЕДЕНИЯ ОБ ИНТЕРВАЛЬНОЙ АРИФМЕТИКЕ 4
1.1 Интервальная арифметика. Интервальные числа 4
1.2 Стандартная интервальная арифметика 5
1.3 Интервальная арифметика с нестандартными вычитанием и делением 6
1.4 Теоретические аспекты методов распространения ограничений 7
2 МЕТОДЫ РАСПРОСТРАНЕНИЯ ОГРАНИЧЕНИЙ 9
2.1 Алгоритм Indigo 9
2.2 Реализация на ЭВМ алгоритма Indigo 12
2.3 Алгоритм Incremental Hierarchical Constraint Solver (IHCS) 14
ЗАКЛЮЧЕНИЕ 17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 18
ПРОЛОЖЕНИЕ А. Текст программы на Delphi 19
Procedure ShowSteps;
var NewString : string;
i : integer;
IsNew : boolean;
begin
IsNew:=True;
t:=GetPVariable(V);
NewString:=t.VarName
+ ': [' + FloatToStr(t.LBound) + '; '
+ FloatToStr(t.RBound) + ']';
for i:=0 to Form1.ListBox1.Count-1 do
if Form1.ListBox1.Items.Strings[
begin
IsNew:=False;
break;
end;
if IsNew then
Form1.ListBox1.Items.Append(
end;
begin
if (CType = 'l') or (CType = 'm') then
Result:=
else
if Prior <> 'w' then
Result:=TightenBoundsForEqual(
else
Result:=
ShowSteps;
end;
Function TConstraint.IsElemInVars(Elem : string) : boolean;
var temp : boolean;
i : integer;
begin
temp:=False;
for i:=0 to VarCount-1 do
if Variables[i] = Elem then
begin
temp:=true;
break;
end;
Result:=temp;
end;
Procedure TVariable.SetBounds(pLBound, pRBound : extended);
begin
LBound:=pLBound;
RBound:=pRBound;
end;
constructor TVariable.Create(pName : string; pLBound, pRBound : extended);
begin
VarName:=pName;
LBound:=pLBound;
RBound:=pRBound;
end;
destructor TVariable.Free;
begin
end;
Procedure GetConstraintList(FileName : string; var List : TConstraintList);
var i : integer;
s : string;
begin
List.Count:=Form1.Memo1.Lines.
SetLength(List.List,List.
for i:=0 to List.Count-1 do
begin
s:=Form1.Memo1.Lines.Strings[
List.List[i]:=TConstraint.
end;
end;
Procedure GetVariablesList(CList : TConstraintList; var VarList : TVariableList);
var i,j : integer;
Function IsNewVar : boolean;
var k : integer;
temp : boolean;
begin
temp:=true;
for k:=0 to VarList.Count-1 do
if VarList.List[k].VarName = CList.List[i].Variables[j] then
temp:=False;
Result:=temp;
end;
begin
VarList.Count:=CList.List[0].
SetLength(VarList.List,
for i:=0 to VarList.Count - 1 do
VarList.List[i]:=TVariable.
LInfinity,RInfinity);
for i:=1 to CList.Count-1 do
for j:=0 to CList.List[i].VarCount-1 do
if IsNewVar then
begin
inc(VarList.Count);
SetLength(VarList.List,
VarList.List[VarList.Count-1]:
Variable.Create(CList.List[i].
end;
end;
Procedure TightenBounds(cn : TConstraint; var Queue : TQueueOfC;
var TightVariables : TSetOfV; var ActiveConstraints : TSetOfC);
var i,j : integer;
TightenFlag : boolean;
v : string;
begin
for i:=0 to cn.VarCount-1 do
if not TightVariables.IsElemIn(cn.
begin
v:=cn.Variables[i];
TightenFlag:=cn.
TightVariables.Add(
if TightenFlag then
for j:=0 to ConstraintList.Count-1 do
begin
if ConstraintList.List[j].
if (ActiveConstraints.IsElemIn(
and (not Queue.IsElemIn(ConstraintList.
Queue.Add(ConstraintList.List[
end;
end;
end;
Procedure CheckConstraints(cn : TConstraint; var ActiveConstraints : TSetOfC);
var i : integer;
temp : boolean;
v : TVariable;
begin
temp:=False; // не все переменные имеют уникальные значения
for i:=0 to cn.VarCount-1 do
begin
v:=GetPVariable(cn.Variables[
if v.LBound <> v.RBound then
temp:=True;
end;
if temp then
ActiveConstraints.Add(cn)
else
ActiveConstraints.Delete(cn);
if cn.VarCount = 1 then
ActiveConstraints.Delete(cn);
end;
procedure TForm1.Button1Click(Sender: TObject);
var Queue : TQueueOfC; // очередь ограничений
ActiveConstraints : TSetOfC; // активное множество ограничений
TightVariables : TSetOfV; //
cn : TConstraint;
i : integer;
Procedure ShowDecision;
var i : integer;
begin
for i:=0 to VariableList.Count-1 do
Form2.ListBox2.Items.Append(
+ FloatToStr(VariableList.List[
end;
begin
ListBox1.Clear;
Form2.Show;
Form2.ListBox2.Clear;
GetConstraintList('Data.txt',
GetVariablesList(
ActiveConstraints:=TSetOfC.
for i:=0 to ConstraintList.Count-1 do
begin
TightVariables:=TSetOfV.
Queue:=TQueueOfC.Create;
Queue.Add(ConstraintList.List[
while not Queue.IsEmpty do
begin
cn:=Queue.Front;
TightenBounds(cn,Queue,
CheckConstraints(cn,
Queue.Dequeue;
end;
end;
ShowDecision;
end;
end.
{=============================
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
GroupBox2: TGroupBox;
ListBox2: TListBox;
private { Private declarations }
public { Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
end.
{=============================
unit MyFunctions;
interface
type
TSArray = array of string;
Procedure GetLeftAndRightParts(var Constraint : string;
var LPart, RPart: string; var Prior, CType: char);
Procedure GetVarList(Constraint : string; var Variables : TSArray;
implementation
// ВЫРЕЗАЕМ
ЛЕВУЮ И ПРАВУЮ ЧАСТЬ В
Procedure GetLeftAndRightParts(var Constraint : string;
var LPart, RPart: string; var Prior, CType: char);
var i : integer;
begin
Prior:=Constraint[1]; // приоритет
Delete(Constraint,1,2);
i:=pos('<=',Constraint);
if i>0 then
begin
CType:='l';
LPart:=Copy(Constraint,1,i-1);
RPart:=Copy(Constraint,i+2,
end
else
begin
i:=pos('>=',Constraint);
if i>0 then
begin
CType:='m';
LPart:=Copy(Constraint,1,i-1);
RPart:=Copy(Constraint,i+2,
end
else
begin
i:=pos('=',Constraint);
CType:='e';
LPart:=Copy(Constraint,1,i-1);
RPart:=Copy(Constraint,i+1,
end;
end;
end;
// ПОЛУЧАЕМ СПИСОК ПЕРЕМЕННЫХ
Procedure GetVarList(Constraint : string; var Variables : TSArray;
var NumbersSet : set of char;
s : string;
LengthS, i, j : integer;
begin
NumbersSet:=['0'..'9','<','=',
VarCount:=0;
s:=Constraint + '+';
lengthS:=length(s);
i:=1;
while i<lengthS do
begin
while (s[i] in NumbersSet) and (i<lengthS) do
inc(i);
j:=i;
while (not(s[i] in NumbersSet)) and (i<lengthS) do
inc(i);
if i > j then
begin
inc(VarCount);
SetLength(Variables,VarCount);
Variables[VarCount-1]:=Copy(s,
end;
end;
SVar:='';
for i:=0 to VarCount-1 do
SVar:=SVar + ',' + Variables[i];
Delete(SVar,1,1);
end;
end.
{=============================
unit CSet;
interface
uses Unit1;
type
TSetOfC = class
Count : integer;
Constraints : array of TConstraint;
constructor Create;
destructor Free;
procedure Add(Elem : TConstraint);
function IsElemIn(Elem : TConstraint) : boolean;
procedure Delete(cn : TConstraint);
end;
implementation
Constructor TSetOfC.Create;
begin
Count:=0;
end;
Destructor TSetOfC.Free;
begin
Count:=0;
Constraints:=nil;
end;
Procedure TSetOfC.Add(Elem : TConstraint);
begin
inc(Count);
SetLength(Constraints,Count);
Constraints[Count-1]:=Elem;
end;
Function TSetOfC.IsElemIn(Elem : TConstraint) : boolean;
var i : integer;
temp : boolean;
Информация о работе Применение методов распространения ограничений при поиске допустимых решений