![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 18.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Zaczynam się uczyć tego języka i zastanawia mnie pewna sprawa: Poprzez formularz chciałbym aby wywołało mi tablicę podobną do szachów i na danym polu umieścić punkt lub cokolwiek innego. i zasada jego działania chciałbym aby była podobna do skoczka w szachach. By pokazało miejsca na które on może skoczyć. Jak to zrobić? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Tabela (szachownica) to tylko sposób prezentacji danych. Zanim zaczniesz ją generować musisz ustalić statusy dla pól. Szachownica w Twoim systemie to tablica ( 8x8 ). Stawiasz skoczka na pierwszym polu
Teraz wystarczy zmienić wartości 8 innych pól. Tyle jest (w idealnym przypadku) możliwości przesunięcia skoczka (ale normalnie większość wypadnie poza szachownicą).
Oczywiście powinieneś sprawdzać czy dane pole na szachownicy istnieje i czy jest wolne itd, ale to taki zarys idei. Z taką tablica bez problemu narysujesz stosowną tabelkę (2 pętelki).
Taki pseudo kod, formatowanie do dupy, ale pisałem to bezpośrednio na forum (tab nie działa tak jakbym chciał). Pozdrawiam! -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Wyślę, że wygodniejsza byłaby notacja liczbowa
![]() ![]() ![]() ![]() EDIT: Gwoli ścisłości wyjaśnię dlaczego plansza jest 12x12 a nie 8x8... W sytuacji gdyby była 8x8 operacje "poruszania się" powodowały by "rolowanie się" planszy. Czyli skok z pola na obrzeżu jednym, który normalnie wyszedł by poza planszę sprawiłby pojawienie się piona na przeciwległej krawędzi. Stąd nadmiarowe pola po bokach, które zawsze "złapią" wyjście skoczka poza planszę gry. Dlatego moja podpowiedzią dla Ciebie jest.... Nie definiuj pól jako takich ale zakoduj ruch i samą szachownicę w sposób przeze mnie opisany lub podobny. A sposób graficznego rzutowania danych (w postaci tablicy jednowymiarowej) na płaszczyznę to już banał w porównaniu do algorytmu i można to na wiele sposobów rozwiązać. Ten post edytował thek 19.10.2009, 14:46:44 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Nie zgłębiałem nigdy tematu (napisałem podobny program, tj szukanie drogi dla skoczka, x lat temu w Turbo Pascalu, ale były to algorytmy czysto rekurencyjne). Rozwiązanie, które podajesz wcale nie wydaje mi się najlepsze. Może są jakieś zalety jeżeli chodzi o optymalizację. Normalnie jednak szachownica jest dwuwymiarowa i tyle samo wymiarowa powinna być tablica, która ją reprezentuje - jest to bardziej intuicyjne. Co do sposobów implementacji to oczywiście nie chodzi o to, zeby dodawać i odejmować coś bezpośrednio w kodzie. Każda klasa figury powinna mieć tablicę możliwych ruchów i jedna prosta metoda może zwracać tabelę pól. Jednak to detal. Pozdrawiam! -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To może wyjaśnię dlaczego takie podejście zastosowałem. Algorytm genetyczny polega na wybraniu dwóch osobników, "złamaniu" ich w tym samym miejscu (lub kilku miejscach) i wymiana pomiędzy nimi odpowiednich fragmentów. Na starcie losowo więc wypełniamy cały 64-polowy chromosom liczbami od 1 do 8 co tworzy "ścieżkę przejścia". Zastosowanie "kodowania polami" sprawiłoby, że na złamaniu po wymianie genomu w dużym stopniu skok byłby niemożliwy do wykonania wedle zasad. Zakodowanie ruchami sprawia, że dla algorytmu nieistotna jest pozycja końcowa ruchu, ale sam ruch, czyli po wymianie materiału ścieżka jest możliwa do prześledzenia. Może być lepsza, może być gorsza, ale na pewno możliwa do sprawdzenia. Po etapie wymiany materiału genetycznego może nastąpić mutacja (z pewnym prawdopodobieństwem), czyli niekontrolowana zmiana jakiejś pozycji w chromosomie. To przy kodowaniu ruchami też nie jest problemem
![]() ![]() Jako bonus dodam, że jest dział AI, który nazywa się "programowanie genetyczne" i działa na identycznej zasadzie ![]() A wracając do zakodowania tablicy jako dwuwymiarowej, to uważam to za przerost formy nad treścią. To dokładnie to samo co jednowymiarowa z indeksami modulo 8 ![]() Ostatecznie uważam, że tak naprawdę zależy to od tego, czemu ma służyć rozwiązanie problemu. Może się okazać, że Twoje podejście będzie w określonym przypadku skuteczniejsze, ale dla problemu skoczka, uwierz, że algorytmy bez specjalnych modyfikacji potrafią utknąć na wspomnianym przypadku. Znajdą drogę przez 63 pola i dalej będą liczyły bez efektu. Można nawet próbować tak modyfikować algorytm, by obliczał on sam pewne parametry na podstawie zdefiniowanej wielkości planszy. Ale może nie rozgrzebujmy problemu skoczka szachowego, bo to pewnie nie z nim się mierzy autor. Ale jesli tak, to myślę, że w necie znajdzie nie tylko podpowiedzi, ale gotowy kod, jeśli tylko pogrzebie pod "knight tour" w google ![]() Gdy zaś mowa o szachach jako całości to można już przemyśleć wariant dwuwymiarowy, bo kilka problemów on rozwiązuje w przystępniejszy sposób, ale tylko dla kogoś kto ma problem z "widzeniem" ruchu przy zwykłym dodawaniu i odejmowaniu. Dla reszty użycie jedno- lub dwuwymiarowej formie to tylko inna notacja i nic więcej. Jak już wspomniałem, zwykłe modulo 8 z 1-wymiarowej robi 2-wymiarową, a mnożenie wiersza razy 8 i dodawanie drugiego indeksu zrobi działanie odwrotne. To tylko notacja i nic więcej ![]() Ten post edytował thek 19.10.2009, 23:52:12 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 18.06.2009 Ostrzeżenie: (0%) ![]() ![]() |
hehe to może ja się wetknę do tej dyskusji i skonkretyzuję co chcę zrobić
![]() Chcę aby z poziomu formularza wpisany został numer pola na którym potem pojawi się "skoczek" i pokażą się na tej szachownicy również miejsca zaznaczone w dowolny sposób do których może się ruszyć... i chodzi mi tylko o jego jeden ruch na dowolnie przeze mnie wybranym polu. Tylko o takie coś proszę nie zagłębiajcie się w tematykę alogrytmów genetycznych hehe bo takie coś mam teraz na studiach z matmy i nie jest to wcale takie łatwe nawet jak dla mnie ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Sposobów na to masz wiele... Zrobić tablicę 2-wymiarową i sparsujesz literę w formularzu na indeks, a liczbę z formularza zmniejszysz o 1 i w ten sposób uzyskasz współrzędne start. Sparsować całość z formularza na indeks 1-wymiarowej tablicy. Zrobić na starcie nie formularz ale obrazek gdzie klikasz pokazując to miejsce, a wybór między 1- a 2-wymiarowym zapisem startu masz dowolny. Jak widzisz to niektóre z propozycji na określenie pola startowego.
Co do ruchów możliwych to znów zależy od notacji szachownicy. Jeśli masz tylko 1 ruch pokazać, to 2-wymiarowa jest lepszym rozwiązaniem, bo prościej pokazać możliwe pola na ruch. Wystarczy wybrać wszystkie kombinacje indeksów tablicowych z zakresu: (+/-3, +/-1) oraz (+/-1, +/-3), gdzie wyniki muszą być w przedziale (0,7). Przykład: Na początek sprecyzujmy, że litery to kolumny od lewej do prawej, a wiersze to liczby od dołu do góry rosnące, czyli punkt (0, 0) to lewy dolny róg (taki jest zapis szachowy i tego się trzymam). Pole: B5 to start, co daje nam w macierzy pole o współrzędnych (1,4) Możliwości: +3,-1 -> (4, 3) +3,+1 -> (4, 5) -3,-1 -> (-2, 3) -3, +1 -> (-2, 5) +1,-3 -> (2, 1) +1,+3 -> (2, 7) -1,-3 -> (0, 1) -1,+3 -> (0, 7) Teraz eliminujemy wszystkie mające choć jedną współrzędną spoza zakresu <0,7> Wylatują więc propozycja 3 i 4, a pozostałe są w zakresie. Pozostaje Ci już tylko zwizualizować wynik. Sądzę, że najprościej poprzez zrobienie DIV z szachownicą jako background i wobec niego pozycjonować obrazki majace pokazywać obrazek skoczka oraz możliwych jego posunięć. Jak? Temu DIV nadaj position:relative a wewnątrz niego pozycjonuj img z obrazkami ![]() ![]() EDIT: Bym zapomniał... Pozycjonowanie na stronie masz zawsze od lewego górnego rogu, a nie lewego dolnego jak w szachach, więc musisz wyniki nieco skonwertować, ale to już banał i powinieneś sobie poradzić. A poza tym mój pomysł to jedna z wielu możliwych wersji rozwiązania tego problemu, jak sam możesz przeczytać. Więc nie musisz go tak implementować jak napisałem, ale zrobić po swojemu. Ten post edytował thek 20.10.2009, 21:50:43 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
@dutagamo, to co chcesz zrobić jest opisane w moim pierwszym poście.
@thek, twierdzisz, że algorytm rekurencyjny (przy rozsądnej ilości pól) jest w stanie "utknąć"? Są problemy przy optymalizacji. Może się zdarzyć, że dwa pola zostaną puste (bez możliwości wskoczenia na nie) na zasadzie wzajemnej adoracji. Jednak jest to ewidentny błąd programisty. Sam algorytm (w najprostszej postaci- jedna funkcja) zawsze znajdzie rozwiązanie (o ile takie istnieje), kwestia czasu (niestety). Co do algorytmów genetycznych to strasznie zainteresowało mnie Twoje rozwiązanie problemu. Troszkę się tym (w wonym czasie) pobawię ![]() ![]() Pozdrawiam! -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
@ayeo: tak. Są sytuacje, że algorytmy utykają, także genetyczne. U mnie testem było właśnie znalezienie rozwiązania dla startu z pola c3 lub c4 na standardowej 64-polowej szachownicy, ale nie pamiętam już którego dokładnie, bo robiłem jakieś 4-5 lat temu ów algorytm. Pewnie w necie by się znalazło jakie to dokładnie
![]() ![]() ![]() Tak dodatkowo dodam, że akurat w algorytmach genetycznych wcale nie ma przymusu znalezienia dokładnego rozwiązania. Jako algorytmy stosowane w optymalizacji podają one najczęściej wyniki "oszacowane" i wiele zależy od parametrów wejściowych algorytmu. Stąd właśnie sugerowałem do problemu skoczka większą ilośc osobników i duży % zaistnienia mutacji. Bez tego ów algorytm byłby długotrwały i nie podawałby rozwiązań w ciągu kilku sekund. EDIT: Warunkiem stop jest zazwyczaj funkcja oceny. Można by ją ustawić nie na liczbę 64, ale 62 lub 63. Nie da to rozwiązania całkowitego, ale jak wspomniałem, genetyczny algorytm nie ma obowiązku szukać rozwiązań ostatecznych. To programista wskazuje w funkcji oceny o jaką dokładność mu chodzi ![]() A co do samych algorytmów genetycznych, to uważam to za jeden z najciekawszych działów sztucznej inteligencji. To, IMHO, znacznie fajniejsze niż sieci neuronowe czy logika rozmyta, choć sieci rozmyto-neuronowe mają tę ciekawostkę, że dobrze zaprogramowane nawet całkiem dobrze działają. Mogę tylko dodać, że miałem okazję być uczony przez specjalistów polskich w tej dziedzinie i może dlatego złapałem więcej wiedzy o funkcjonowaniu AI, a spośród tego algorytmy genetyczne uznałem za najbardziej interesujące. Ten post edytował thek 21.10.2009, 08:30:22 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Samo zagadnienie SSN (rozpoznawanie kodów pocztowych ![]() ![]() ![]() Pozdrawiam i życzę miłego dnia! -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 07:23 |