Sunteți pe pagina 1din 18

UNIVERSITATEA TEHNICĂ „GHEORGHE ASACHI” din IAȘI

FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE


DOMENIUL: Ingineria Sistemelor
SPECIALIZAREA: Automatică și Informatică Aplicată

REZOLVAREA CUBULUI RUBIK CU AJUTORUL UNUI ROBOT


CONSTRUIT CU LEGO MINDSTORM EV3
LUCRARE DE DIPLOMĂ

Coordonator stiințific , Autor,


Șef lucr.dr.ing. Cristina Budaciu Săvuc Răzvan Ionuț

1
Cuprins

Capitolul 1. Introducere.................................................................................................. 3
Capitolul 2.Implementarea unui robot pentru rezolvarea cubului rubik folosind
kit-ul Lego Mindstorm Ev3 .............................................................................................4
2.1 Kitul LEGO MINDSTORMS Ev3. Elemente constructive........................4
2.2 Implementarea robotului Lego........................................................... 7
2.3 Comunicația dintre utilizator si robot folosind mediul de lucru Matlab .....10
2.4 Comunicația prin conexiune USB, Bluetooth sau Wi-fi ........................10
2.5 Toolbox-ul Lego Mindstorms EV3 utilizat în implementare ....................11
Capitolul 3. Reguli pentru rezolvarea cubului Rubik .................................................12
3.1 Concepte si abordări de bază.............Error: Reference source not found2
3.2 Implementarea unui algortim utilizând EV3.....Error: Reference source not
found15
Capitolul 4. Concluzii și direcții viitoare de cercetare...............................................15
Bibliografie.....................................................................................................................16
ANEXĂ ...................................................................... Error: Reference source not found6

2
Capitolul 1. Introducere

Robotica este un domeniu relativ modern - cu termenul de robotică înființat


în anii 1940 de către Isaac Asimov - care se dezvoltă în mod consecvent pentru a
găsi noi aplicații și soluții la diverse probleme de pe tot globul. Robotica s-a
dovedit în mod natural a fi foarte reușită atunci când a produs soluții la probleme
matematice și procese de automatizare cu diverse aplicații.

Scopul acestui proiect este de a dezvolta un algoritm software pentru a


rezolva un cub Rubik folosind un robot LEGO. Un cub Rubik standard 3x3x3 va fi
utilizat pentru proiect, pe langă robotul LEGO Mindstorm EV3. Odată ce proiectul
s-a încheiat, cubul Rubik ar trebui rezolvat cu succes de robotul Mindstorm EV3
dintr-o stare de pornire la întamplare. Proiectul are numeroși factori în care poate
fi măsurat succesul acestuia; inițial și cel mai important, rezolvarea cu succes a
cubului Rubik. Odată rezolvată, calitatea soluției depinde de cât de eficient
robotul rezolvă cubul Rubik, atât eficiența în ceea ce privește timpul necesar
(minute / secunde), cât și numărul de mișcări mecanice cerute de succesiunea de
algoritmi care se execută. Mai mult, acest lucru pune sub semnul întrebării care
este metoda cea mai potrivită pentru găsirea echilibrului dintre eficiența soluției și
complexitatea implementării. Așa cum s-a afirmat, scopul general al proiectului
este de a folosi un robot LEGO pentru a rezolva cubul Rubik din orice stare
inițială la întamplare, bazându-se pe calitatea soluției la timpul necesar.
Cubul Rubik este un joc problemă de tip puzzle inventat în 1974 [1] de
către sculptorul și profesorul de arhitectură maghiar Ernő Rubik.
Numit inițial „Cubul Magic” de către inventatorul său, Ernő Rubik, a fost redenumit
„Cubul lui Rubik” de compania Ideal Toys în 1980[1] și a câștigat premiul special
"Cel mai bun joc problemă" la Jocul Anului în Germania. Este cea mai bine
vândută jucărie din lume, cu peste 300.000.000 de cuburi vândute în lume până
în 2005.[2]
Pe un cub Rubik fiecare dintre cele șase fețe este acoperită cu 9 etichete
colorate într-una din șase culori (în mod tradițional alb, galben, portocaliu, roșu,

3
albastru și verde). Un mecanism de pivoți permite rotirea independentă a fiecărei
fețe astfel încât culorile se vor amesteca. Pentru rezolvarea jucăriei, fiecare față
trebuie adusă la o singură culoare.

Capitolul 2.Implementarea unui robot pentru rezolvarea


cubului rubik folosind kit-ul Lego Mindstorm Ev3

2.1 Kitul LEGO MINDSTORMS Ev3. Elemente constructive

Echipamentul utilizat pentru construirea roborului este LEGO Mindstorms


EV3 Education Home Set. Aceasta este adresat în principal elevilor și studenților,
dar și utilizatorilor mai profesioniști.

Componente ale setului

Brick-ul programabil:

Figura 1
Computer cu sistem Linux bazat pe procesor ARM tactat la frecvența de
300MHz. Memoria calculatorului este formată din memorii Flash de 16 megabyte,
care pot fi extinse datorită portului de card microSDHC și memoriei de operare de
memorie RAM de 64 MB. În cub există patru porturi de intrare pentru conectarea
cu senzori și 4 porturi de ieșire pentru reactoare.
Pentru comunicare computerul extern este prevăzut cu porturi USB și Mini-USB
și cu tehnologia Bluetooth wireless și, opțional, cu Wi-Fi, prin intermediul unui
adaptor suplimentar. Toate acestea sunt furnizate de panoul de interacțiune cu

4
utilizatorul, pe care sunt 6 butoane programabile, LED-uri colorate, un difuzor și
afișaje LCD cu o rezoluție de 178x128 pixeli.

Cele 2 servomotoare mari

Figura 2
Servomotoarele mari sunt motoare inteligente puternice.Acestea permit
programarea acțiunilor robotice precise și puternice. Fiecare are un senzor de
rotaţie integrat cu rezoluţie de 1 grad pentru un control precis. Servomotoarele
sunt optimizate pentru a fi baza de acţionare a roboţilor tăi. Prin utilizarea blocului
de programare Move Steering (dirijarea mișcării) sau Move Tank (rezervorul de
mișcări) în software-ul EV3, cele 2 servomotoare vor coordona acţiunea simultan.
Servomotoarele funcţionează la 160–170 rpm, cu un cuplu de funcţionare de 20
Ncm şi un cuplu de antrenare de 40 Ncm (mai lente, dar mai puternice).

Servomotorul mediu

Figura 3
Păstrează precizia, renunţând la o parte din putere în favoarea dimensiunii
compacte și reacţiei mai rapide
Și servomotorul mediu include un Rotation Sensor (senzor de rotaţie) integrat (cu
rezoluţie de 1 grad), dar este mai mic și mai ușor decât un servomotor mare.
Asta înseamnă că poate reacţiona mai rapid decât servomotorul mare.
Motorul mediu funcţionează la 240–250 rpm, cu un cuplu de funcţionare de 8
Ncm şi un cuplu de antrenare de 12 Ncm (mai rapid, dar mai puţin puternic).

5
Senzorul de culoare

Figura 4
Recunoaşte şapte culori diferite şi măsoară intensitatea luminii.
Color Sensor este un senzor digital care poate detecta culoarea sau intensitatea
luminii care pătrunde prin fereastra mică de pe faţa senzorului. Acest senzor
poate fi utilizat în trei moduri diferite: Color Mode (mod de culoare), Reflected
Light Intensity Mode (modul de intensitate a luminii reflectate), şi Ambient Light
Intensity Mode (modul de intensitate a luminii mediului înconjurător)

Senzorul giroscopic

Figura 5
Măsoară mișcarea de rotație a robotului și schimbările în orientarea sa.
Poate măsura o viteză de rotație între -440 grade / secundă și +440 grade /
secundă. Poate, de asemenea, pentru valori de viteză unghiulară, să calculeze
poziția unghiulară a unui robot.
Rata de reîmprospătare pentru senzorul giroscopic pentru robotul Lego
Mindstorms EV3 este de 1 kHz.

6
Senzorul de infraroșii

Figura 6

Detectează obiecte și poate urmări și găsi emiţătorul de infraroşii de la


distanţă.
Infrared Sensor este un senzor digital care poate detecta lumina infraroşie
reflectată de pe obiectele solide. Poate detecta și semnalele de lumină infraroșie
trimise de la Remote Infrared Beacon.
Senzorul de infraroşii poate fi utilizat în trei moduri diferite: Proximity
Mode (modul de proximitate), Beacon Mode (modul emiţător) şi Remote Mode
(modul telecomandă).

2.2 Implementarea robotului Lego


O sarcină importantă a fost găsirea și selectarea design-ului adecvat al
robotului. Cel mai bun proiect a fost Mindcub3r, creat de David Gilday [3]. Criteriul de
selecție a fost robustețea structurii și posibilitatea de a construi robotul folosind
elemente numai din setul EV3.

7
Figura 7: Robotul privit din față

Sistemele mobile au fost numite :

Spinner
Scop: să asigure un loc de depozitare a cubului, permițând în același timp
manipularea cubului atât în ceea ce privește mișcările de rotație, cât și cele de
bază.
Motorul atașat permite o schimbare a orientării orizontale (așa cum se vede în
figura 23), pe lângă barierele laterale care ajută brațul rotativ în timpul schimbării
orientării verticale (așa cum se vede în figura 22). În timpul mișcărilor de bază,
suportul rotește un singur strat în timp ce brațul rotativ este utilizat pentru a
menține straturile rămase în poziție.

Figura 8: Vedere laterală – Rotația verticală a cubului cu ajutorul Spinner-ului

Figura 9: Vedere laterală – Rotația orizontală a cubului cu ajutorul Spinner-ului

8
Braț de rotație

Scop: să ofere funcționalitate în timpul manipulării stării cubului Rubik și


orientării verticale.
Motorul atașat acționează ca un punct central în care brațul se rotește în jurul
acestuia, permițându-i să se blocheze pe cub (în același mod văzut în Figura:
24). În acest moment, mișcările de bază pot fi realizate prin rotirea suportului în
timp ce brațul deține cele două straturi de sus.

Figura 10: Vizualizarea de sus a Spinner-ului

Construcția rezultată a componentei brațului de rotație este afișată în


imaginile de mai jos (Figura 25 și Figura 26). Brațul urmează structura
imaginilor văzute în figura 24.

Figura 11: Brațul de rotație: Figura 12: Brațul de rotație:


vedere laterala vedere de sus

9
Camera

Scop: Scanarea fețelor cubului.


Scanarea are loc prin mișcarea platformei rotative. În acest fel, culorile unei fețe a
cubului rubik sunt recunoscute.Culoarea parții central a unei fețe este recunoscută
de platform care nu se rotește

Figura 13: Camera

2.3 Comunicația dintre utilizator si robot folosind mediul de lucru


Matlab

În ceea ce privește comunicarea dintre brick-ul EV3 și utilizatori, există o


mulțime de toolbox-uri software cum ar fi C, C++, Java, ROBOTC, Labview etc. În
acest studiu, utilizatorul poate comunica cu robotul folosind toolbox-ul MATLAB,
Lego Mindstorms EV3. Kitul Lego Mindstorms EV3 este o platformă care poate fi
găsită în multe laboratoare academice, atât pentru scopuri educaționale, cât și
pentru studii de cercetare. În prezent, platforma Lego Mindstorms este susținută de
Mathworks prin mediul de simulare Simulink.
Mathworks oferă suport pentru Mindstorms EV3, incluzând pachetul
Simulink și toolbox-ul MatLab pentru scrierea scriptului. Toolbox-ul, care facilitează
scrierea codului, conține funcții MATLAB pentru interacțiunea cu robotul; transmisia
de date se poate face folosind conexiuni USB, Bluetooth sau Wi-fi. Avantajul
principal este dat de posibilitatea de a implementa algoritmi de complexitate ridicată,
iar principalul dezavantaj este dat de apariția întârzierilor în transmiterea datelor
utilizând conexiunea Bluetooth sau Wi-fi. Simulink este un mediu folosit pentru
simularea și proiectarea sistemlor dinamice și încorporate.

2.4 Comunicația prin conexiune USB, Bluetooth sau Wi-fi

Conexiunile Bluetooth,USB și Wi-fi sunt utilizate pentru încărcarea și


descărcarea datelor între calculator și EV3. Utilizând funcțiile Bluetooth, vă puteți
conecta dispozitivul EV3 la alte dispozitive Bluetooth, cum ar fi telefoanele mobile,
computerele și alte unități EV3.
Atunci când se conectează dispozitivul EV3 la un calculator prin intermediul unui
cablu USB, o pictocramă va fi afișată, iar aceasta va dispărea în momentul în care
cablul USB va fi deconectat. Există două stări în care acesta se poate afla: cablul

10
USB a fost conectat corespunzător sau cablul USB a fost conectat, dar nu
funcționează corect.
În ceea ce priveşte conexiunea Bluetooth, există trei stări în care acesta se poate
afla:Bluetooth-ul este deschis, dar brick-ul NXT nu este vizibil pentru alte dispozitive
Bluetooth; Bluetooth este deschis și brick-ul NXT este vizibil pentru alte dispozitive
Bluetooth; Bluetooth este deschis și brick-ul NXT este conectat la alt dispozitiv
Bluetooth.
Conexiunea prin Wi-fi este mai eficientă decât cea prin bluetooth și are o rază de
acțiune mai mare, însă utilizeaza mai multă putere și este nevoie de un router
wireless pentru a putea realiza această conexiune.
Odată ce conexiunea Bluetooth sau Wi-fi este setată, aceasta poată fi folosită pentru
următoarele caracteristici: descărcarea programelor din calculator fără folosirea
cablului USB, trimiterea programelor de pe alte dispozive decât propriul calculator,
inclusiv de la propriul EV3, trimiterea programelor la variate dispozitive EV3.

2.5 Toolbox-ul Lego Mindstorms EV3 utilizat în implementare

Mathworks pune la dispoziţie suport software atât în Simulink (Simulink


Support Package pentru Lego Mindstorms EV3 [4]) cât şi Matlab (Matlab Support
Package pentru Lego Mindstorms EV3 [5]) pentru comunicaţia cu brick-ul EV3.
Ambele pot fi descărcate și folosite gratuit.

Suportul pentru Simulink permite programarea și executarea de algoritmi pe robotul


Lego Mindstorm EV3. Pachetul de suport include o bibliotecă de blocuri Simulink
pentru configurarea și accesarea senzorilor și interfețelor de comunicare ale
robotului.
Este posibilă dezvoltarea de algoritmi în Simulink, simularea lor pentru a verifica
dacă funcționează cum trebuie și descărcarea algoritmului complet pentru execuția
autonomă pe dispozitiv (prin conexiune USB, Bluetooth sau Wi-fi). Este posibil,de
asemenea, să se regleze parametrii din modelul Simulink în timp ce algoritmul
rulează pe brick-ul EV3.

Suportul pentru Matlab permite controlul robotului lego. Pachetul de suport oferă
funcții MATLAB pentru a controla motoarele și interfața cu senzorii de intrare
hardware și capacitățile de ieșire.
Se pot efectua următoarele sarcini direct din MATLAB:
- controlarea motoarelor
- citirea intensității culorilor și a luminii
- măsurarea distanței și a proximității
- obținerea unghiului de rotație
- scriere de text pentru afișajul LCD brick
- realizarea de semnale sonore și redarea lor pe difuzorul EV3

11
Capitolul 3. Reguli pentru rezolvarea cubului Rubik

3.1 Concepte și abordări de bază

În ciuda confuziei inițiale pe care a creat-o cubul Rubik, pot fi găsite


anumite concepte care ajută la dezvoltarea unei soluții pentru puzzle-ul
matematic. Înțelegerea conceptelor de bază este esențială pentru a asigura
finalizarea proiectului. Cifrele de mai jos reflectă modul în care ar apărea cubul
dacă forma 3D ar fost desfăcută , precum și o metodă de etichetare a fiecărei
fețe pentru a susține și simplifica dezvoltarea secvențelor de algoritmi.

Figura 14: Cub desfăcut: Culori Figura 15: Cub desfăcut: Fețe

Datorită designului cubului Rubik, există doar o anumită cantitate de


mișcări care pot fi implementate. Fiecare din aceste fețe afișate în figura de mai
sus poate avea trei mișcări diferite aplicate, o mișcare cu 90° în sensul acelor de
ceasornic, o mișcare cu 90° în sens invers acelor de ceasornic, și o mișcare de
180° în ambele direcții. Cifrele de mai jos reflectă modul în care ar apărea cubul
dacă forma 3D ar fost desfăcută, precum și o metodă de etichetare a fiecărei fețe
pentru a simplifica dezvoltarea secvențelor de algoritmi.

12
Lista mișcărilor cubului rubik
Față Notație Notație Rotație dublă
în sens invers
în sensul acelor acelor de
de ceasornic ceasornic
Front F F’ F2
Back B B’ B2
Up U U’ U2
Down D D’ D2
Right R R’ R2
Left L L’ L2

Pentru a clarifica că există trei tipuri diferite de blocuri care cuprind cubul,
blocurile centrale de pe fiecare față au o singură culoare și rămân într-o
poziție fixă și, prin urmare, nu sunt manipulate de nici una dintre mișcările
cubului menționate mai sus. Pe un Cub Rubik's standard de 3x3x3, există opt
bucăți de margine care constau în două culori în plus față de cele patru piese
de colț care sunt compuse din trei culori.

Figura16: Blocuri centrale Figura 17: Blocuri laterale Figura 18: Blocuri de colț

În plus, un bloc poate fi descris atât în ceea ce privește poziția, cât și


orientarea. Poziția unui bloc descrie locația blocului pe cub, în timp ce orientarea
unui bloc descrie cum sunt aliniate culorile sale si dacă sunt sau nu sunt aliniate
corect cu fețele relevante.

13
Figura 19: Orientarea blocului de colt Figura 20: Orientarea blocului lateral

Mai mult, deoarece robotul va trebui să implementeze pași suplimentari în


ceea ce privește manipularea simplă a orientării întregului cub, aceste mișcări
trebuie, de asemenea, să fie etichetate.
Imaginile de mai jos ilustrează diferența dintre manipularea orientării întregului
cub orizontal sau vertical.

Figura 21: Orientare pre-verticală Figura 22: Orientare post-verticală

Figura 23: Orientare pre-orizontală Figura 24: Orientare post-oriznotală


3.2 Implementarea unui algoritm utilizând EV3

De-a lungul anilor a apărut o multitudine de algoritmi de rezolvare a cubului


rubik, de la cei mai simpli, până la cei mai complicați. Aceștia diferă prin gradul de
dificultate, unii algoritmi putând fi aplicați de persoane care nu au mai folosit
niciodată un cub rubik, iar unii algoritmi putând fi aplicați doar de persoane ce
posedă o experiență îndelungată cu cubul rubik. Algoritmii diferă și prin timpul
necesar rezolvării cubului, cei mai simpli necitând un timp mai îndelungat (peste 5-
10 minute), în timp ce alți algoritmi necesită mai puțin de 1-2 minute pentru
rezolvarea cubului.
După ce am facut unele cercetări, am ajuns la concluzia ca cel mai indicat si eficient
algoritm pe care îl pot aplica in acest proiect este algoritmul “Thistlewaite 45” , numit
după matematicianul care l-a creat, Morwen Thistlewaite [6]. Acest algoritm necesită
un număr maxim de 45 de mutări necesare rezolvării cubului rubik, și un număr
mediu de 31 de mutări.
Algoritmul Thislewaite 45 este relativ complex. T45 rezultă din ideea împărțirii
procesului de rezolvare în procese mai mici. Algoritmul introduce ideea că la fiecare
etapă există un număr de blocuri care nu pot fi mutate / manipulate, reducând
numărul de mișcări care pot fi implementate în fiecare etapă. Modificările rămase
pentru fiecare etapă pot fi apoi evaluate în ceea ce privește mișcările necesare,
implementând soluția care necesită cele mai puține mișcări. Procedând astfel,
numărul total de mișcări necesare pentru rezolvarea cubului este redus.
Algoritmul este împărțit în 4 părți, după cum se observă in algoritmul implementat în
Matlab, prezent în ANEXĂ.

Capitolul 4. Concluzii și direcții viitoare de cercetare

În această primă parte a proiectului am vorbit în general despre cubul


rubik, istoria acestuia, diferite reguli și mișcări de bază pentru rezolvarea acestuia,
cât și despre despre construcția robotului cu kit-ul Lego Mindstorm EV3, elemente
componente ale acestuia, caracteristici ale elementelor componente, cum se face
comunicația robotului cu utilizatorul, limbajul de programare utilizat de robot pentru
rezolvarea cubului și algoritmul ales pentru rezolvare.
În semestrul 2 urmează să finalizez algoritmul pentru scanarea cubului de către
robot, să vorbesc în detaliu despre cum se realizeză exact scanarea, timpul mediu
necesar robotului pentru scanare, cât si despre succesiunea pașilor pe care robotul
îi va executa pentru a rezolva un cub Rubik care a fost deja scanat și variabilele sale
au fost stocate, timpul necesar robotului pentru rezolvarea cubului utilizând acest
algoritm. Mă gândesc, de asemenea, să mai implementez și un alt algoritm și să fac
diferențe între cei 2 algoritmi.
În legătură cu un termen limită pentru activitățile pe care mi le propun, mi-aș dori ca
pană la vacanța de Paște, proiectul să fie finalizat sau într-o fază finală.
Bibliografie

[1] https://eu.rubiks.com/

[2] Marshall Ray „Squaring up to the Rubchallenge”

[3] Gilday, D. (2015). Mindcub3r for lego mindstorms ev3


http:// mindcuber.com

[4] LEGO MINDSTORMS EV3 Support from Simulink


https://www.mathworks.com/hardware-support/lego-mindstorms-ev3-simulink.html

[5] LEGO MINDSTORMS EV3 Support from MATLAB


https://www.mathworks.com/hardware-support/lego-mindstorms-ev3-matlab.html

[6] https://en.wikipedia.org/wiki/Morwen_Thistlethwaite

ANEXĂ
% Rezolvarea cubului utilizand algoritmul T45

P = load('Prunes');
P1 = P.P1;
P2 = P.P2;
P3 = P.P3;
P4 = P.P4;

sol = [];

E = GetEdges(R);
C = GetCorners(R);

%Etapa 1 : rezolvarea marginilor


moves = {'L' ,'R' ,'F' ,'B' ,'U' ,'D';...
'L2' ,'R2' ,'F2' ,'B2' ,'U2' ,'D2';...
'L''','R''','F''','B''','U''','D'''};

n = State2Ind(E(2,:))+1;
N = P1(n);

while N>0
for i=1:18
E2 = TwistEdges(E,moves{i});
n = State2Ind(E2(2,:))+1;
M = P1(n);
if M<N
N = M;
E = E2;
C = TwistCorners(C,moves{i});
sol = [sol moves(i)];
break
end
end
end

%Etapa 2: mutarea marginilor din mijloc in stratul intermediar


% si orientarea colturilor
moves = {'L' ,'R' ,'F' ,'B' ,'U2';...
'L2' ,'R2' ,'F2' ,'B2' ,'D2';...
'L''','R''','F''','B''','00'};

Clist = P.ClistP2;
Elist = P.ElistP2;

F = E(1,:);
F = double(F>=9);
Cind = State2Ind(C(2,:));
Eind = State2Ind(F);

n = Clist==Cind;
m = Elist==Eind;

N = P2(n,m);

while N>0
for i=1:14
C2 = TwistCorners(C,moves{i});
E2 = TwistEdges(E,moves{i});
F2 = E2(1,:);
F2 = double(F2>=9);
Cind = State2Ind(C2(2,:));
Eind = State2Ind(F2(1,:));
n = Clist==Cind;
m = Elist==Eind;
M = P2(n,m);
if M<N
N = M;
C = C2;
E = E2;
sol = [sol moves(i)];
break
end
end
end

%Etapa 3 : plasarea colturilor in tetradele lor


moves = {'L' ,'L''','L2',...
'R' ,'R''','R2',...
'F2','B2','U2','D2'};

Clist = P.ClistP3;
Elist = P.ElistP3;

F = ceil(E(1,1:8)/4)-1;

Cind = State2Ind(C(1,:));
Eind = State2Ind(F,2);

n = find(Clist==Cind);
m = find(Elist==Eind);
N = P3(n,m);

while N>0
for i=1:10
C2 = TwistCorners(C,moves{i});
E2 = TwistEdges(E,moves{i});
F = ceil(E2(1,1:8)/4)-1;
Cind = State2Ind(C2(1,:));
Eind = State2Ind(F,2);
n = Clist==Cind;
m = Elist==Eind;
M = P3(n,m);
if M<N
N = M;
C = C2;
E = E2;
sol = [sol moves(i)];
break
end
end
end

%Rezolvarea cubului prin permutarile colturilor si a marginilor


moves = {'L2','R2','F2','B2','U2','D2'};

Clist = P.ClistP4;
Elist = P.ElistP4;

Cind = State2Ind(C(1,:));
Eind = State2Ind(E(1,:));

n = Clist==Cind;
m = Elist==Eind;
N = P4(n,m);

while N>0
for i=1:6
C2 = TwistCorners(C,moves{i});
E2 = TwistEdges(E,moves{i});
Cind = State2Ind(C2(1,:));
Eind = State2Ind(E2(1,:));
n = Clist==Cind;
m = Elist==Eind;
M = P4(n,m);
if M<N
N = M;
C = C2;
E = E2;
sol = [sol moves(i)];
break
end
end
end

sol = rubopt(sol);

S-ar putea să vă placă și