function [bestplusreihe,bestabweichung,bestplusequalvec,bestplusanzahlmat,bestplusdist,bestplusuewktmat,erfolglos]=norepplus(inputreihemat,types,anzahl,kritsum,toleranz)
%   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.                                                                      

bestplusdist=[];
bestplusuewktmat=[];
bestabweichung=10000;
bestplusreihe=[];
bestplusequalvec=[];
bestplusanzahlmat=[];
                
                
plusreihe=[];

%Parameter

while 1
	laenge=length(inputreihemat);
	if rem(laenge,anzahl)~=0
   	disp(['Signallänge nicht durch Elementanzahl teilbar!']);
	else break
	end  
end
   

%file und mat bereitstellen
%[savefilename,savefilepath]=uiputfile('*.txt','zielfile:');
%savefile=[savefilepath,savefilename];
%savefilehandle=fopen(savefile,'wt');
reihemat=zeros(laenge,1);
negeyemat=-eye(anzahl)+ones(anzahl);
bestdist=100;
protype=0;
rundenzaehler=1;
erfolglos=0;

while erfolglos==0
   	equalvec=zeros(1,anzahl);
   	helpmat=ones(anzahl);
   	while and(or(sum(equalvec)<anzahl,protype==0),rundenzaehler<100)
			reihemat(1,1)=round(rand*anzahl);
			for k=2:laenge
   			    while 1
     		 	    reihemat(k,1)=floor(rand*anzahl);
      			    if reihemat(k,1)~=reihemat(k-1,1)
        		 	    break
      			    end
   			    end
			end
            
			%elementanzahl pruefen
			anzahlmat=zeros(laenge,anzahl);
			for k=1:anzahl
   			    anzahlmat(:,k)=((k-1)==reihemat(:,1));
			end	
			anzahlvec=sum(anzahlmat);
			equalvec=(anzahlvec(1)==anzahlvec);
                     
            %elementanzahl pro inputtype pruefen
            proanzahlmat=zeros(laenge,types,anzahl);
            
            typindices=zeros(laenge/types,types);
            for q=1:types
                typindices(:,q)=find(inputreihemat==q-1);
            end
            anzahlindicessumvec=zeros(1,anzahl);
            anzahlindices=zeros(laenge/anzahl,anzahl);
            for r=1:anzahl
                help2mat=find(reihemat(typindices(:,r))==(r-1));
                anzahlindicessumvec(1,r)=length(help2mat);
                for v=1:length(help2mat)
                    anzahlindices(v,r)=help2mat(v,1);
                end
            end
            
           
            anzahlindicessum=sum(anzahlindicessumvec);
            abweichung=abs(anzahlindicessum-laenge);
            if abweichung<bestabweichung
                bestabweichung=abweichung
                bestplusreihe=reihemat;
                bestplusequalvec=equalvec;
                bestplusanzahlmat=anzahlmat;
            end
                
            if abs(anzahlindicessum-laenge)<toleranz
                anzahlindicessum
                protype=1;
                pause
            end
            rundenzaehler=rundenzaehler+1;
         
            if rundenzaehler>99
                erfolglos=1; 
            end
	end
  
	    %Uebergangswahrscheinlichkeiten
	    uewktmat=zeros(anzahl);
	    for l=1:(laenge-1)
   		    for m=1:anzahl
      		    for n=1:anzahl
         		    if and(bestplusanzahlmat(l,m)==1,bestplusanzahlmat(l,m)==bestplusanzahlmat(l+1,n))
            	    	uewktmat(m,n)=uewktmat(m,n)+1;
         	    	end
      	    	end
   		    end
    	end
    	uewktmat;

   	    helpmat=uewktmat/negeyemat;
   	    helpmat=helpmat*(1/helpmat(1,1));
   	    distmat=helpmat-eye(anzahl);
    	dist=sum(sum(abs(distmat)));
    	if dist<bestdist
          	bestplusdist=dist;
          	bestplusuewktmat=uewktmat;
   	    end
	    if abs(bestdist)<kritsum
   	        break
	    end
    
end

return

