DECLARATION SECTION Subtours_Declaration
PARAMETER:
identifier : MaxCounter ;
PARAMETER:
identifier : Counter ;
SET:
identifier : KnotenSubsets ;
SET:
identifier : KnotenSubSet
subset of : KnotenSubsets ;
PARAMETER:
identifier : KnotenInKnotenSubset ;
PARAMETER:
identifier : ElementCheck ;
PARAMETER:
identifier : LeftToConvert ;
ENDSECTION ;
PROCEDURE
identifier : Subtours
body :
MaxCounter := Power(2, card(Knoten))-1;
Counter := 1;
while counter < MaxCounter do
SetElementAdd( KnotenSubsets, KnotenSubSet, FormatString( "%i",
Counter ) );
ElementCheck := card(Knoten);
LeftToConvert := Counter;
while ElementCheck > 0 do
ElementCheck -= 1;
if power( 2, ElementCheck ) <= LeftToConvert then
KnotenInKnotenSubset( KnotenSubsets, element( Knoten,
ElementCheck+1 ) ) := 1;
LeftToConvert -= power( 2, ElementCheck )
endif;
endwhile;
Counter += 1;
endwhile;
DECLARATION SECTION Subtours_Declaration
PARAMETER:
identifier : MaxCounter ;
PARAMETER:
identifier : Counter ;
SET:
identifier : KnotenSubSets
index domain : Iss
subset of : Knoten ;
SET:
identifier : KnotenSubSet
subset of : Knoten
index : Iss ;
PARAMETER:
identifier : KnotenInKnotenSubset
index domain : (Iss,i)
range : binary ;
PARAMETER:
identifier : ElementCheck ;
PARAMETER:
identifier : LeftToConvert ;
ENDSECTION ;
PROCEDURE
identifier : Subtours
body :
MaxCounter := Power(2, card(Knoten))-1;
Counter := 1;
while counter < MaxCounter do
SetElementAdd( KnotenSubSets, KnotenSubSet, FormatString( "%i",
Counter ) );
ElementCheck := card(Knoten);
LeftToConvert := Counter;
while ElementCheck > 0 do
ElementCheck -= 1;
if power( 2, ElementCheck ) <= LeftToConvert then
KnotenInKnotenSubset( KnotenSubSets, element( Knoten,
ElementCheck+1 ) ) := 1;
LeftToConvert -= power( 2, ElementCheck )
endif;
endwhile;
Counter += 1;
endwhile;
ENDPROCEDURE ; DECLARATION SECTION Subtours_Declaration
PARAMETER:
identifier : MaxCounter ;
PARAMETER:
identifier : Counter ;
SET:
identifier : KnotenSubSets
index : kss
parameter : KnotenSubSet ;
PARAMETER:
identifier : KnotenInKnotenSubset
index domain : (kss,i)
range : binary ;
PARAMETER:
identifier : ElementCheck ;
PARAMETER:
identifier : LeftToConvert ;
ENDSECTION ;
PROCEDURE
identifier : Subtours
body :
MaxCounter := Power(2, card(Knoten))-1;
Counter := 1;
while counter < MaxCounter do
SetElementAdd( KnotenSubSets, KnotenSubSet, FormatString( "%i",
Counter ) );
ElementCheck := card(Knoten);
LeftToConvert := Counter;
while ElementCheck > 0 do
ElementCheck -= 1;
if power( 2, ElementCheck ) <= LeftToConvert then
KnotenInKnotenSubset( KnotenSubSet, element( Knoten, CONSTRAINT:
identifier : EliminiereSubtour2
index domain : (K,d,i,j) | Subtour2Aktiv
text : "Subtour Eliminierung in einer Zeile"
definition : subtour_counter(j,K,d) >= subtour_counter(i,K,d) + 1 - 50*(1-Transport(i,j,d,K)) ;