📄 minbool.m
字号:
function [result]=minimize(numbers, resulttype)
home
% Cuain-MacClaski method of boolean function minimization
% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% Andrey Popov Technical University - Sofia
% popov_andrey@abv.bg http://potopi.hit.bg
%
% USE:
% R=minimize(N,V)
% R - result matrix
% N - input arguments. N should be vector row with integers
% V - visualization type
% 1) 1=normal; -1=inverse; NaN=not used
% 2) 1=normal; -1=inverse; 0=not used
%
%
% EXAMPLE:
% R=minimize([5 13 14 26 30],1)
% R =
% 1 2 3 4 5
% -1 NaN 1 -1 1
% NaN 1 1 1 -1
% 1 1 NaN 1 -1
%
% Minimize ver. 1.2 release September 2002
disp(' ');
disp(' Cuain-MacClaski method or minimizing boolen function');
disp(' -------------------------------------------------------');
disp(' Andrey Popov Technical University - Sofia');
disp(' ');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Input data check
%-------------------------------------------------------
if (nargin==0)
disp(' No input data');disp(' ');
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
format compact;
numbers=round(abs(numbers));
[u,v]=size(numbers);
%
%--------------------------------------------------------------------------------
%
S=zeros(1,1);
i=1;
S(1,1)=numbers(1,1);
for g=1:v
p=0;
for k=1:i
if S(1,k)==numbers(1,g)
p=p+1;
end;
end;
if(p==0) %
S=[S numbers(1,g)];
i=i+1;
end;
end;
numbers=sort(S);
S=[];
v=i;
%
%----------------------------------------------------------------------------------
Maximum=max(numbers);
n=1;
while (Maximum>2^n-1)
n=n+1;
end;
%
%----------------------------------------------------------------------------------
W=zeros(v,n);
%
%----------------------------------------------------------------------------------
for i=1:v
k=numbers(i); %
for j=1:n
if k>=2^(n-j) %
k=k-2^(n-j); %
W(i,j)=1;
end;
end;
end;
%
%----------------------------------------------------------------------------------
G=zeros(v,n); %
G1=zeros(v,1);
broi=0; %
m=1;
while(m<=v)
for i=1:v
curb=0; %
for j=1:n
if( W(i,j)==1 ) %
curb=curb+1;
end;
end;
if( curb==broi ) %
G(m,:)=W(i,:);
G1(m,1)=numbers(i);
m=m+1;
W(i,:)=zeros(1,n);
end;
end;
broi=broi+1;
end;
W=[];
G=[G G1];
%
%----------------------------------------------------------------------------------
y=v; %
razsh=1; %
slepeni=1; %
F=G; %
while (slepeni~=0 & v>1)
F=[];
slepeni=0; %
M=zeros(v,1);
G=[G M]; %
m=0;
for i=1:v
if (G(i,1)==inf | G(i,1)==nan) %
else
suedineno=0; %
for j=(i+1):v %
k=0;
p=0;
if (G(j,1)==inf | G(j,1)==nan) %
%
else
for g=1:n % n
if G(i,g)~=G(j,g) %
k=k+1; %
p=g; %
end;
end;
if (k==1) %
L=G(i,1:(n+razsh)); %
L(1,p)=-1; %
L=[L G(j,(n+1):(n+razsh))]; %
F=[F;L];
m=m+1; %
slepeni=slepeni+1; %
suedineno=suedineno+1; %
G(i,n+razsh+1)=1; %
G(j,n+razsh+1)=1;
elseif (k==0) %
%
G(j,1)=inf;
end;
end;
end;%
if (suedineno==0 & G(i,n+razsh+1)==0)
%
%
L=G(i,1:(n+razsh)); %
for l=1:razsh
L=[L inf]; %
end;
F=[F;L];
m=m+1; %
end;
end;
end;%
if(slepeni==0) %
F=F(:,1:(n+razsh)); %
N=razsh;
else;
razsh=2*razsh;
end;
G=F;
v=m;
end;%
N=razsh;
G=[];
[l,y]=size(numbers);
E=zeros(v+2,y+3);
for i=1:y
E(1,i+3)=numbers(1,i);
end;
for i=1:v
E(i+2,1)=i;
end;
%----------------------------------------------------------------------------------
for g=1:v
p=0;
for j=(n+1):(n+N)
if (F(g,j)~=inf & F(g,j)~=nan)
for i=1:y
if E(1,i+3)==F(g,j)
E(g+2,i+3)=1; %
end;
end;
end;
end;
end;
%----------------------------------------------------------------------------------
otbeliazani=0;
for j=1:y % y
if E(2,j+3)~=1 %
p=0; %
w=0; %
for g=1:v
if E(g+2,j+3)==1 %
p=p+1;
w=g;
end;
end;
if(p==1) %
E(2,j+3)=1;
otbeliazani=otbeliazani+1;
E(w+2,3)=1; %
for h=1:y
if E(w+2,h+3)==1 %
%
if E(2,h+3)==0; %
E(2,h+3)=1; %
otbeliazani=otbeliazani+1;
end;
end;
end;
end;
end;
end;
%
%----------------------------------------------------------------------------------
while (otbeliazani<y)
for g=1:v
E(g+2,2)=0;
end;
for g=1:v
if E(g+2,3)==0
p=0; %
q=0; %
c=0; %
for j=1:y
if ( E(g+2,j+3)==1 & E(2,j+3)==0 ) %
%
p=p+1;
end;
end;
for k=1:n %
%
%
if ( F(g,k)<0 )
q=q+1;
elseif (F(g,k)==0)
c=c+1;
end;
end;
E(g+2,2)=p+q/(n+1)+c/(10*n); %
% 1)
% 2)
% 3)
end;
end;
maks=max(E(:,2));
g=1;
while( E(g+2,2)<maks )
g=g+1;
end;
E(g+2,3)=1;
for h=1:y
if E(g+2,h+3)==1
if E(2,h+3)==0; %
E(2,h+3)=1;
otbeliazani=otbeliazani+1;
end;
end;
end;
end;
%
%-----------------------------------------------------------------------------------
Z=[]; %
izhodni=0;
for g=1:v
if E(g+2,3)==1 %
Z=[Z;F(g,:)];
izhodni=izhodni+1;
end;
end;
%=====================================================================================
result=[];
if (nargin==2 & resulttype==2)
for i=1:izhodni % 1;-1;NaN
dat=[];
for j=1:n
if Z(i,j)==1
dat=[dat 1];
elseif Z(i,j)==0
dat=[dat -1];
else
dat=[dat 0];
end;
end;
result=[result;dat];
end;
result=[1:n;result];
disp(' ');
disp(' 1 - normal');
disp('-1 - inverted');
disp(' 0 - not used');
disp(' ');
else
for i=1:izhodni % 1;-1;NaN
dat=[];
for j=1:n
if Z(i,j)==1
dat=[dat 1];
elseif Z(i,j)==0
dat=[dat -1];
else
dat=[dat nan];
end;
end;
result=[result;dat];
end;
result=[1:n;result];
disp(' ');
disp(' 1 - normal');
disp('-1 - inverted');
disp('NaN - not used');
disp(' ');
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -