function [bestreihe,bestuewktmat,bestdist]=norepex2(anzahlelemente1,anzahlelemente2,signallaenge,wktstatus,whlstatus,whlspez,relmat,widmat,uewktoptstatus)

%   norepex2

%   This software is protected by german copyright and international treaties.             
%   Copyright 2004 Markus Junghöfer & Peter Peyk. All Rights Reserved.                     
%                                                                                          
%   THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE        
%   NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO,    
%   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE    
%   OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
%   TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT,       
%   INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE      
%   OR DOCUMENTATION.    


global uewktmat reihe bestreihe bestuewktmat bestdist
bestdiff=100;bestreihe=[];distmat=[];kriterium=20;bestdist=1000;punktzaehler=1;sternzaehler=1;


if nargin <9
    uewktoptstatus='n'; end
if nargin <8
    widmat=[]; end
if nargin <7 
    relmat=[]; end
if nargin <6
    whlspez='n'; end
if nargin <5
    whlstatus='0';end
if nargin <4
    wktstatus='j';end
if nargin <3
    signallaenge=[];
    wktstatus=input('Gleichverteilte Wahrscheinlichkeiten? (j/n)','s');
    whlstatus=input('Wiederholungen zulassen? (Anzahl bzw. "x" = beliebig)','s');
    whlspez=input('Besondere Wiederholungsoptionen? (j/n)','s');
    uewktoptstatus=input('Übergangswahrscheinlichkeiten optimieren? (j/n)','s');
    kriterium=input('Abweichungssumme der absoluten Häufigkeiten?');
    %Anzahl der Folgelemente (restanzahl) bestimmen
    while 1
    anzahlelemente1=input('anzahl verschiedener elemente in 1.Dimension?');
    if anzahlelemente1>1 
        break
    else 
        disp('Größer 1!!!');
    end
    end
    while 1
    anzahlelemente2=input('anzahl verschiedener elemente in 2.Dimension?');
    if anzahlelemente2>0 
        break
    else 
        disp('Größer 0!!!');
    end
    end
   
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                   %
% mit Wiederholung, nicht gleichverteilt                           %
%                                                                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if strcmp(wktstatus,'n') & (strcmp(whlstatus,'x')) & strcmp(whlspez,'j')

 
%Elementanzahl bestimmen  
anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
    restanzahl=(anzahlelemente2);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1);  
else
    restanzahl=(anzahlelemente1)*(anzahlelemente2);
end
 
%Rel. Häufigkeiten erfragen
%------------------------------------------------------------------------------------
if isempty(relmat)
wktmat=zeros(anzahlelemente1,1);
while 1
for g=1:anzahlelemente1
wkt=input(['Rel. Häufigkeit von Element ', num2str(g), ' aus 1.Dimension?']);
wktmat(g,1)=wkt;
end
if abs(sum(wktmat)-1)<0.05
    break
else
    disp('Rel. Häufigkeiten müssen in der Summe 1 ergeben!')
end
end
wkttotmat=wktmat;
for f=1:anzahlelemente2-1
    wkttotmat=[wkttotmat wktmat];
end
fprintf('\n');
disp('Folgende Elemente und Wahrscheinlichkeiten haben sie gewählt:');
fprintf('\n');
disp('Elemente:');
fprintf('\n');
disp(zaehlmat);
fprintf('\n');
disp('Wahrscheinlichkeiten:');
fprintf('\n');
disp(wkttotmat);
fprintf('\n');
ausschlussmat=[];
else
    wkttotmat=relmat;
    
end

%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


%Ausschluss erfragen
%------------------------------------------------------------------------------------
if isempty(widmat) 
r=1;
while 1 
ausschlussmat(r)=input('Welche Elemente duerfen sich nicht wiederholen? (0=abbruch)');
if ausschlussmat(r)==0
    break
end
r=r+1;
end
ausschlussmat(find(ausschlussmat==0))=[];
fprintf('\n');
disp(ausschlussmat);
fprintf('duerfen sich nicht wiederholen!\n\n');
else 
    ausschlussmat=widmat;
end




%optimierungsmatritzen erstellen   
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);


%Folgeelementmatrix bestimmen (pro Zeile alle möglichen Folgeelemente auf Zeilennummer)
%hier: %Ausschluss rausschmeissen
alternativenzeile=linspace(1,anzahlelemente,anzahlelemente);
alternativen=alternativenzeile;
for z=1:anzahlelemente-1
        alternativen=[alternativen;alternativenzeile];
end
ausschlussmatgroesse=length(ausschlussmat);
killindices=zeros(ausschlussmatgroesse,ausschlussmatgroesse);
for e=1:ausschlussmatgroesse
        for f=1:ausschlussmatgroesse
            killindices(e,f)=find(alternativen(ausschlussmat(e),:)==ausschlussmat(f));
        end
end
for z=1:ausschlussmatgroesse
    for y=1:ausschlussmatgroesse
        alternativen(ausschlussmat(z),killindices(z,y))=alternativen(z,y); 
    end
end



if isempty(signallaenge)
%signallaenge abfragen
disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
while 1
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
    end
end



%Opimieren für ÜWkt

while bestdist>kriterium

%Reihe mit choicemat und Folgematrix erstellen und anzahl prüfen bis anzahl gleichverteilt
intervall=(signallaenge/restanzahl);

while sum(idvec)<anzahlelemente
   
        %choicemat erstellen (Reihe mit Nummer des Folgeelements (choicematwert ist Spaltenindex der Folgematrix)
        choicemat=(randperm(signallaenge))'; 
        for w=1:anzahlelemente
                indices=and(choicemat>intervall*(w-1),choicemat<=intervall+intervall*(w-1));
                choicemat(indices,1)=w;
        end
         
        %anzahl überprüfen
        choicematsumvec=zeros(1,anzahlelemente-1);
        for n=1:anzahlelemente-1
            choicematsumvec(1,n)=sum(sum(choicemat==n));
        end

        %reihe schreiben
        reihe=zeros(1,signallaenge);
        reihe(1,1)=choicemat(1,1);
        for k=2:signallaenge
            reihe(1,k)=alternativen(reihe(1,k-1),choicemat(k,1));
        end

        %anzahl überprüfen
        for n=1:anzahlelemente
            sumvec(1,n)=sum(reihe==n);
                                
        end
        
        diff=sum(abs(sumvec-[40 40 40 20 20 20]));
        if diff<bestdiff
            bestdiff=diff;
            bestreihe=reihe;
        end
        
        if bestdiff==0
            idvec=anzahlelemente;
        end
%         fprintf('.');
%         punktzaehler=punktzaehler+1;
%         if punktzaehler>20
%             fprintf('\n');
%             punktzaehler=1;
%         end
        
end
reihe=reihe';
idvec=0;


%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for u=1:anzahlelemente
anzahlmat(:,u)=(u==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);
uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end

% %Ergebnisse anzeigen
% choicemat
% sumvec
% reihe

distmat=uewktmat-[6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 6.66 6.66 6.66;6.66 6.66 6.66 0 0 0;6.66 6.66 6.66 0 0 0;6.66 6.66 6.66 0 0 0];
dist=sum(sum(abs(distmat)));


if dist<bestdist
    bestdist=dist
    bestreihe=reihe;
    bestuewktmat=uewktmat
end

fprintf('*');
sternzaehler=sternzaehler+1;
if sternzaehler>20
    fprintf('\n');
    sternzaehler=1;
end

end
end