Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Komiwojager. Przetrzymywanie odwiedzonych miast w pamięci
emillo91
post
Post #1





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Grafy to dość skomplikowany temat.

Tu masz fajny artykuł z tym co i jak.
https://www.sitepoint.com/data-structures-4/

Ten post edytował Pyton_000 4.12.2016, 16:24:26
Go to the top of the page
+Quote Post
phpamator
post
Post #3





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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?

Ten post edytował PHPRexio 4.12.2016, 18:28:13
Go to the top of the page
+Quote Post
emillo91
post
Post #4





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:15