mindcub3r programabil, robotul selector cubul Rubik, partea 1 din 2
- 28.06.15 02:01 •
- haqreu •
- • # 261299
- • Habrahabr
- 3 •
- 11411
- cum ar fi Forbes, doar mai bine.
Am decis să repet acest robot, în primul rând am vrut doar pentru a obține cubul asamblat și sarcina maximă - este de a configura robotul am nevoie de configurare (cub nu asamblate în mod necesar) și să-l pe cubul fizic. Permite-mi să obțineți un fel de a salva jocul, atunci când voi colecta cubul de mână, și mă pot întoarce la ea în orice moment (vă amintiți că nu vreau să se uite în finite algoritmi de asamblare sunt interesante pentru mine să învețe cum să se colecteze?) În momentul în care am scrie toate mișcările de pe hârtie pentru a fi în măsură să se rostogolească înapoi, și eu destul de obosit.
Așa că am adunat hardvarnogo o parte a robotului, desene de asamblare sunt mari. Descărcat software-ul, descărcat, cu trepidație cub pus pe platformă și grav rupt. Se pare că robotul cere oficial cubul Rubik, și am cumpărat unul care este folosit pentru a spidkubinga. El se confruntă cu alte culori (de exemplu, nu alb), iar robotul este rupt, acesta nu a putut să scaneze. Ei bine, am spus, zgâriat pe partea de jos a butoiului, a găsit zarurile oficiale, cu toate acestea, sub vârsta de douăzeci de ani. Cu zatortymi și pervertită de străin influențează autocolante de robot, de asemenea, nu a vrut să lucreze.
metoda utilizată
În lumea unui număr foarte mare de algoritmi, probabil, cel mai corect ar fi de a programa aceasta. Dar este necesar să se gândească, de a inventa pentru A * Accentuarea iterativ euristice, și eu sunt leneș. În plus, este necesar să se gândească cum să-l folosească pentru a obține configurația dorită, și eu sunt leneș. De aceea, voi folosi cel mai greu de cap și direct metoda: folosind înregistrarea Cube Explorer toată secvența de spire care colectează- marginea frontală inferioară
- colțul frontal din dreapta jos
- marginea din dreapta față
- în colțul frontal din dreapta sus
- marginea frontală superioară
cod ar arăta astfel:
În acest articol, am descrie un program detașat care colectează cub de la linia de comandă. Ca de obicei, tot codul am publica pe githabe. Exemple de configurații aleatoare ale cubului pot fi luate aici. acolo și validator soluțiilor noastre.
structura de date
Cube Fațetele va apela standardul: F - front, R - dreapta, B - spate, L - stânga, U - superior, D - partea inferioara. Aici sunt rotație standard:
Fiecare margine are două fețe adiacente, fiecare unghi are trei fețe alăturate. Pentru a reprezenta cub, folosesc două matrici de douăsprezece (numărul muchiilor) și opt (în funcție de numărul de colțuri) întregi. Deci, iată o serie de indici:
Există indicii se confruntă roșu, albastru - unghiuri indecși. Când vorbesc despre numărul trei coaste în matrice de nervuri, acest lucru înseamnă că eu vorbesc despre o coastă, care este asamblat cubul trebuie să fie pe fața superioară a stânga.
Fiecare dintre aripioarele poate fi într-una din cele douăzeci și patru de poziții, precum și fiecare colț vă puteți pune pe un douăzeci și patru locații diferite, în cub. Aici este un tabel cu dispozițiile:
cub Asamblate să fie reprezentat de o pereche de matrice, și margini și colțuri, respectiv. De exemplu, numărul nervură 4 în matrice trebuie să aibă o orientare 8.
Aici este reprezentarea unui cub:
margini și colțuri - sunt matrice în care sunt stocate datele, how_corners_move how_edges_move și descrie marginile index transformare matrici și colțurile să se rotească în jurul fiecăreia dintre cele șase fețe, dar funcția atomic_rotation () realizează efectiv rotirea uneia dintre fețe.
algoritmi cablat
Partea dificilă este de peste, acum partea plictisitoare a localității de pornire, deschideți Cube Explorer și mâna a scrie un număr de algoritmi pentru adunare.
Amintiți-vă că primul lucru pe care îl vom colecta marginea frontală inferioară? Cubul complet amestecat poate fi localizată pe oricare dintre cele 24 de locații posibile, astfel încât alg_DF_edge matrice oferă 24 de secvențe diferite, care va pune nervurii în loc. Numele celorlalte matricele sunt auto-explicative. apply_sequence () funcția împarte șirul în funcțiune atomică și cauzează atomic_rotation ().
colector direct
Direct colector arată codul de transfer pseudo direct acordat la început, în limbajul C ++:
Rețineți că rotate_entire_cube () este numit de fiecare dată de patru ori, astfel încât între ciclurile de cub nostru este întotdeauna orientat așa cum ar trebui, dar în interiorul buclei, trebuie să știm exact cum este orientat pentru a corecta rezultatul deciziei pe ecran.
Ia exemplul unui cub explodat aici și rulați programul:
Copiați de ieșire la un validator Web și a obține:
Deci, avem Solver, data viitoare va fi controlată în mod direct de un robot.
Kosiemby algoritm, de altfel, arată rău dacă am avea nevoie pentru a reduce numărul de mișcări, o voi programa. Cine nu a făcut, pentru că programare este un pic dificil, dar am timp nu prea mult.
haqreu rece, Multumesc pentru post. Cu toate acestea, cursul de 91 acest lucru este prea mult, chiar și pentru asamblarea automată. Am fost doar de lucru pe un proiect similar: wiswin.nl/FAC%20system%20Rubik%20cube%20solver.htm. Avem un pic mai complicat din punct de vedere al mecanicii, și a reușit totul în acest moment cu Raspberry Pi. În primul rând conceput Arduino, ci doar din cauza complexității muta algoritmul pe Raspberri.
Eu folosesc pentru a rezolva Kosiemby algoritmul de mai sus-menționat, care funcționează doar magic: o medie de 17-18 mișcări soluție. Cu toate acestea, nu am putut găsi o realizare normală, pe langa originalul în Java, așa că a trebuit să facem totul singur. Link-ul sunt două versiuni, una în Python pură, a doua în pură C. O versiune Python a fost lent (pe desktop câteva momente, dar raspberri sub PyPy funcționează până la un minut), și sishnaya - muște.
Amuzant sa întâmplat că lucrez la un proiect similar, și apoi o astfel de poziție apare - un suflet pereche :) Va trebui să termin, de asemenea, la bord de pe un articol)