Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Komiwojager. Przetrzymywanie odwiedzonych miast w pamięci
Forum PHP.pl > Forum > Przedszkole
emillo91
Witam. Piszę program, który wyznacza najkrótszą drogę do wszystkich miast za pomocą algorytmu najbliższego sąsiada. Mój problem polega na tym, że nie wiem w jaki sposób kazać algorytmowi ignorować już odwiedzone miasta. Program, który już napisałem działa poprawnie do momentu aż napotka miasto które odwiedził a następnie się zapętla z poprzednim miastem. Wiem że muszę odwiedzone miasta trzymać w tablicach i z nich pobierać dane ale nie umiem sobie poradzić kiedy dane są pobierane z tablic w pętli while. Próbowałem też usuwać indeksy ze wszystkich tablic gdzie występuje nazwa odwiedzonego miasta (podczas każdego przejścia pętli) ale nie wiem jak wyznaczyć i usunąć indeks z tablicy typu $tablica[0] = array{....};( indeksy przy tablicach są mi potrzebne do wyznaczania kolejnego miasta z którego mają być pobierane dane).
Poniżej kod:
CODE
  1. <?php
  2. $miasto[0] = 'wroclaw';
  3. $miasto[1] = 'krakow';
  4. $miasto[2] = 'gdansk';
  5. $miasto[3] = 'poznan';
  6. $miasto[4] = 'lodz';
  7. $wybor[0] = array(
  8. 'krakow' => '150',
  9. 'gdansk' => '300',
  10. 'poznan' => '276',
  11. 'lodz' => '290'
  12. );
  13. $wybor[1] = array(
  14. 'wroclaw' => '150',
  15. 'gdansk' => '236',
  16. 'poznan' => '125',
  17. 'lodz' => '185',
  18. );
  19. $wybor[2] = array(
  20. 'wroclaw' => '300',
  21. 'krakow' => '236',
  22. 'poznan' => '100',
  23. 'lodz' => '150',
  24. );
  25. $wybor[3] = array(
  26. 'wroclaw' => '276',
  27. 'gdansk' => '100',
  28. 'krakow' => '125',
  29. 'lodz' => '130',
  30. );
  31. $wybor[4] = array(
  32. 'wroclaw' => '290',
  33. 'gdansk' => '150',
  34. 'krakow' => '185',
  35. 'poznan' => '130',
  36. );
  37.  
  38. $miasto_poczatek = 'wroclaw';
  39. for($a = 0; $a < sizeof($miasto); $a++){
  40.  
  41. if($miasto[$a] == $miasto_poczatek){
  42. $start = $a;
  43. }
  44. }
  45. echo 'Miasto startowe to:'.$miasto[$start].'<br>';
  46.  
  47. $zlicz = 0;
  48. $miasto_koniec[] = array();
  49.  
  50. asort ($wybor[$start]);
  51. reset ($wybor[$start]); // Funkcja ta powoduje powrót do pierwszego elementu tablicy
  52.  
  53. while (list ($klucz, $wartosc) = each ($wybor[$start])) {
  54.  
  55. $miasto_koniec[$zlicz] = $klucz;
  56.  
  57. $miasto_koncowe = $miasto_koniec[0];
  58. $zlicz++;
  59. }
  60. $zlicz = 0;
  61. for($b = 0; $b < sizeof($miasto); $b++){
  62.  
  63. $miasto[$b] = $miasto_koncowe;
  64. echo 'Kolejne miasto to:'.$miasto[$b].'<br>';
  65.  
  66. for($c = 0; $c < sizeof($miasto); $c++){
  67.  
  68. if(($miasto[$c] == $miasto[$b])){
  69.  
  70. asort ($wybor[$c]);
  71. reset ($wybor[$c]); // Funkcja ta powoduje powrót do pierwszego elementu tablicy
  72.  
  73. while (list ($klucz2, $wartosc2) = each ($wybor[$c])) {
  74.  
  75. $miasto_koniec[$zlicz] = $klucz2;
  76. $najmniejsze = $miasto_koniec[0];
  77. $zlicz++;
  78. }
  79. }
  80. $miasto_koncowe = $najmniejsze;
  81.  
  82. $zlicz = 0;
  83. }
  84. }
  85.  
  86.  
  87.  
  88.  
  89. ?>


Odnośnie odpowiedzi to chciałbym się dowiedzieć czy jest możliwe usuwanie indeksów z wybranych tablic w takiej postaci jak są tutaj przedstawione, czy muszę całkowicie przerobić kod?
Ewentualnie jakim warunkiem bądź funkcją mogę sprawdzić czy istnieje dany indeks w danej tablicy i wyświetlić numer indeksu.
Pyton_000
Grafy to dość skomplikowany temat.

Tu masz fajny artykuł z tym co i jak.
https://www.sitepoint.com/data-structures-4/
phpamator
Zrobiłbym to tak:
  1.  
  2. if (($key = array_search('wartosc', $array)) !== false) {
  3. unset($array[$key]);
  4. }
  5.  
  6. // albo
  7.  
  8. if(in_array($twoj_array, 'wartosc')){
  9. unset($array[$key]);
  10. }
  11.  
  12. //albo
  13.  
  14. if (in_array('wartosc', $array))
  15. {
  16. unset($array[array_search('wartosc',$array)]);
  17. }
  18.  


Ale ja jestem amator/newbie, czy usunięcie klucza wystarczy?
emillo91
chodzi o to żeby algorytm nie uznawał odwiedzonego miasta z najmniejszą odległością za miasto które musi odwiedzić. Jutro będę kombinował. Dzięki za pomoc i życzę udanego wieczoru wink.gif

Witam. Przepraszam że tak późno odpisuję ale wyleciało mi z głowy że miałem dać znać co mi wyszło z tym algorytmem. Odnośnie mojego problemu to musiałem stworzyć dodatkową tablicę w której przetrzymywałem odwiedzone miasta i do której algorytm odwoływał się za każdym razem gdy wybierał kolejne miasto do odwiedzenia. Poniżej kod gotowego algorytmu.
  1. <?php
  2. $miasto[0] = 'wroclaw';
  3. $miasto[1] = 'krakow';
  4. $miasto[2] = 'gdansk';
  5. $miasto[3] = 'poznan';
  6. $miasto[4] = 'lodz';
  7. $wybor[0] = array(
  8. 'krakow' => '150',
  9. 'gdansk' => '300',
  10. 'poznan' => '276',
  11. 'lodz' => '290'
  12. );
  13. $wybor[1] = array(
  14. 'wroclaw' => '150',
  15. 'gdansk' => '236',
  16. 'poznan' => '125',
  17. 'lodz' => '185',
  18. );
  19. $wybor[2] = array(
  20. 'wroclaw' => '300',
  21. 'krakow' => '236',
  22. 'poznan' => '100',
  23. 'lodz' => '150',
  24. );
  25. $wybor[3] = array(
  26. 'wroclaw' => '276',
  27. 'gdansk' => '100',
  28. 'krakow' => '125',
  29. 'lodz' => '130',
  30. );
  31. $wybor[4] = array(
  32. 'wroclaw' => '290',
  33. 'gdansk' => '150',
  34. 'krakow' => '185',
  35. 'poznan' => '130',
  36. );
  37.  
  38. $miasto_poczatek = 'poznan'; // inicjacja miasta startowego
  39.  
  40.  
  41. for($a = 0; $a < sizeof($miasto); $a++){
  42.  
  43. if($miasto[$a] == $miasto_poczatek){
  44. $start = $a;
  45. }
  46. }
  47.  
  48. $zlicz = 0;
  49. $zlicz2 = 0;
  50. $zlicz3 = 1;
  51.  
  52. $miasto_koniec[] = array();
  53. $niemamiast[] = array();
  54. $odwiedzone[] = array();
  55.  
  56. asort ($wybor[$start]);
  57. reset ($wybor[$start]); // Funkcja ta powoduje powrót do pierwszego elementu tablicy
  58.  
  59. while (list ($klucz, $wartosc) = each ($wybor[$start])) {
  60.  
  61. $miasto_koniec[$zlicz] = $klucz;
  62.  
  63. $miasto_koncowe = $miasto_koniec[0];
  64. $pomocnicza = $miasto_koniec[0];
  65. $zlicz++;
  66. }
  67. $zlicz = 0;
  68. for($b = 0; $b < sizeof($miasto); $b++){
  69.  
  70. $miasto[$b] = $miasto_koncowe; // inicjacja kolejnych miast
  71.  
  72. for($c = 0; $c < sizeof($miasto); $c++){
  73.  
  74. if(($miasto[$c] == $miasto[$b])){
  75. $odwiedzone[0] = $miasto_poczatek; // miasta
  76. $odwiedzone[1] = $pomocnicza; // nie włączone do poniższej pętli
  77. asort ($wybor[$c]);
  78. reset ($wybor[$c]); // Funkcja ta powoduje powrót do pierwszego elementu tablicy
  79.  
  80. while (list ($klucz2, $wartosc2) = each ($wybor[$c])) {
  81.  
  82. $miasto_koniec[$zlicz] = $klucz2;
  83. $zlicz++;
  84. }
  85. for($d = 0; $d < sizeof($miasto); $d++){
  86. if (!in_array($miasto_koniec[$d], $odwiedzone)) {
  87. $niemamiast[$zlicz2] = $miasto_koniec[$d];
  88. $zlicz2 += 1;
  89. }
  90. $nowypunkt = $niemamiast[0];
  91. }
  92. $odwiedzone[$zlicz3] = $nowypunkt;
  93. $zlicz3 += 1;
  94. $zlicz2 = 0;
  95. }
  96. $miasto_koncowe = $odwiedzone[$b+1];
  97. $zlicz = 0;
  98. }
  99.  
  100. }
  101. echo 'Odwiedzone miasta to: </br>';
  102. for($e = 0; $e < sizeof($miasto); $e++){
  103. if($e != 4){
  104. $znak = "->";
  105. }
  106. else{
  107. $znak = ".";
  108. }
  109. echo $odwiedzone[$e].$znak;
  110. }
  111.  
  112.  
  113.  
  114. ?>

Program działa poprawnie pod warunkiem że za miasto startowe nie wybierzemy pierwszego miasta z listy. Jeżeli miastem startowym w tym przypadku będzie Wrocław to algorytm weźmie kilka razy pod uwagę pierwszą tablicę. Wrzucam algorytm bo może komuś się przyda. Wydaje mi się że wystarczy usuwać tablice które zostały już odwiedzone ale nie jestem do końca pewien. phpamator dzięki za twoją pomoc, która rozwiązała mój problem ze sprawdzaniem czy dane miasto zostało odwiedzone. Temat do zamknięcia. Dziękuję smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.