How to optimize the code?
Ältere Kommentare anzeigen
Hi Guys,
I developed a code that generates and displays all the possibilities of a game on a graph. Below, I'm sending the error-free code. The issue arises when the game has a large number of pieces, significantly increasing the quantity of possibilities. The question is: How can I optimize the code for better efficiency?
In the code, the variable "NBE," declared in the second line, ranges from 1 to 10. For options 1, 2, 3, 4, 5, it functions adequately. However, starting from 6 and onwards, the code fails to compile.
%% Variables Iniciales n^2+2n n=numero de fichas.
NBE= 4;% Número Bloques Equipo
EstadoInicial=[1:NBE 0 NBE+1:2*NBE];
GrafoEscalera=[EstadoInicial 0]; MatrizMatlab=[];
EstadosPendientes = 1;
%% Generar Grafo
while (EstadosPendientes ~= 0)
CEC=GrafoEscalera(:,end); % Ultima posición (Si ha sido visitado o no)
PosicionEstadoConCero=find(CEC==0); % Encuentra 0s en la Matriz
if isempty(PosicionEstadoConCero)
EstadosPendientes = 1;
break;
end
[NuevaCopiaEC] = GrafoEscalera(PosicionEstadoConCero(1,1),1:end-1);
for P=1:4
if P==1 % Accion 1 Mover 1 casilla a derecha
NuevaCEC=NuevaCopiaEC;
[MMatriz] = mover(NuevaCEC, 1);
[MatrizMatlab] = NodosVertices(NuevaCEC, MMatriz, MatrizMatlab);
[GrafoEscalera] = NuevoGrafo(MMatriz, GrafoEscalera);
elseif P==2 % Accion 2 Mover 1 casilla a izquierda
NuevaCEC=NuevaCopiaEC;
[MMatriz] = mover(NuevaCEC, 2);
[MatrizMatlab] = NodosVertices(NuevaCEC, MMatriz, MatrizMatlab);
[GrafoEscalera] = NuevoGrafo(MMatriz, GrafoEscalera);
elseif P==3 % Accion 3 Saltar 1 casilla a derecha
NuevaCEC=NuevaCopiaEC;
[SMatriz] = saltar(NuevaCEC, 1, NBE);
[MatrizMatlab] = NodosVertices(NuevaCEC, SMatriz, MatrizMatlab);
[GrafoEscalera] = NuevoGrafo(SMatriz, GrafoEscalera);
elseif P==4 % Accion 4 Saltar 1 casilla a izquierda
NuevaCEC=NuevaCopiaEC;
[SMatriz] = saltar(NuevaCEC, 2, NBE);
[MatrizMatlab] = NodosVertices(NuevaCEC, SMatriz, MatrizMatlab);
[GrafoEscalera] = NuevoGrafo(SMatriz, GrafoEscalera);
end
end
GrafoEscalera(PosicionEstadoConCero(1,1),end)=1;
end
%% Hallar la Frecuencia
%% Generar Grafo
[s,t] = IDNodos(GrafoEscalera, MatrizMatlab);
% MatrizA=[ID' num2str(Matriz1(:,1:end-1))];sourceTarget=[Matriz2 Matriz3];
G = graph(s,t);
h = plot(G,'Layout','force','WeightEffect','direct');
hold on
%% Funciones
% Levantar
function [MMatriz] = mover(MatrizB, lado)
idx=find(MatrizB==0);
[~,B]=size(MatrizB);
if lado==1 && idx < B && idx > 1% Derecha
Bloque=MatrizB(idx-1);
MatrizB(idx-1)=0;
MatrizB(idx)=Bloque;
elseif lado==2 && idx < B % Izquierda
Bloque=MatrizB(idx+1);
MatrizB(idx+1)=0;
MatrizB(idx)=Bloque;
end
MMatriz=MatrizB;
end
function [SMatriz] = saltar(MatrizB, lado, NB)
idx=find(MatrizB==0);
[~,B]=size(MatrizB);
MA=(1:NB);MB=(NB+1:NB*2);
if lado==1 && idx>2 % Derecha
Bloque=MatrizB(idx-2);
BloqueDeSalto=MatrizB(idx-1);
% En que grupo esta Bloque y BloqueDeSalta
if (ismember(Bloque,MA) && ismember(BloqueDeSalto,MB)) || (ismember(Bloque,MB) && ismember(BloqueDeSalto,MA))
MatrizB(idx-2)=0;
MatrizB(idx)=Bloque;
end
elseif lado==2 && idx < B-2% Izquierda
Bloque=MatrizB(idx+2);
BloqueDeSalto=MatrizB(idx+1);
if (ismember(Bloque,MA) && ismember(BloqueDeSalto,MB)) || (ismember(Bloque,MB) && ismember(BloqueDeSalto,MA))
MatrizB(idx+2)=0;
MatrizB(idx)=Bloque;
end
end
SMatriz=MatrizB;
end
function [MatrizMatlab] = NodosVertices(Matriz1, Matriz2, MatrizMatlab)
[A,~]=size(MatrizMatlab);Comparar=1;
if isequal(Matriz1, Matriz2)
Comparar=0;
else
Matriz3 = [Matriz1 Matriz2];
Matriz4 = [Matriz2 Matriz1];
for j=1:A
if isequal(Matriz3, MatrizMatlab(j,:)) || isequal(Matriz4, MatrizMatlab(j,:))
Comparar=0;
end
end
if Comparar==0
MatrizMatlab=MatrizMatlab;
elseif Comparar==1
MatrizMatlab = cat(1,MatrizMatlab,Matriz3);
end
end
end
function [GrafoEscalera] = NuevoGrafo(Matriz1, Matriz2)
[A,~]=size(Matriz2);
Comparar=1;
Matrizi=[Matriz1 0];
for j=1:A
if isequal(Matriz1, Matriz2(j,1:end-1))
Comparar=0;
end
end
if Comparar==0
GrafoEscalera=Matriz2;
elseif Comparar==1
GrafoEscalera=cat(1,Matriz2,Matrizi);
end
end
function [s,t] = IDNodos(Matriz1, Matriz2)
[A,~]=size(Matriz1);
[B,C]=size(Matriz2);
s=[];t=[];
for i=1:A
Nodo = Matriz1(i,1:end-1);
for j=1:B
if isequal(Nodo, Matriz2(j,1:C/2))
s(j,1) = i;
end
if isequal(Nodo, Matriz2(j,C/2+1:C))
t(j,1) = i;
end
end
end
end
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Just for fun finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!