Advertisement
Guest User

Email Jindřichu Prokopovi (cvičícímu ALG) o ALG HW 2

a guest
Oct 22nd, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. Zkusím vysvětlit rozdíl mezi tím, jak jsem rekurzivně postupoval já a
  2. jak ostatní:
  3.  
  4. "Můj" postup (chybný pro test09, ale zase rychlý pro pub09):
  5.  
  6. Pro každý experiment: dám ho nejvíc doleva do rozvrhu kam to jde a
  7. větvím pro ještě nepřidané. Když ho přidat nemůžu vůbec, tak v tomto
  8. místě nevětvím. Z každého větvení dostanu výsledek a vyberu nejlepší.
  9.  
  10. Jinými slovy, zkouším všechny permutace pořadí (tzn. všechny způsoby
  11. seřazení) experimentů, kde každá permutace jednoznačně odpovídá
  12. nějakému poskládání do rozvrhu v tomto pořadí tak, že každý přidávám na
  13. první možnou pozici nejvíc vlevo.
  14.  
  15. moje_funkce(rozvrh, experimenty_nepouzite) {
  16. for(experiment in experimenty_nepouzite) {
  17. if (vejde_se_kamkoliv_do_rozvrhu(experiment, rozvrh)) {
  18. # experiment pridavam do rozvrhu na PRVNI VOLNOU POZICI, tj. nejvic vlevo kam se cely vejde
  19. reseni = moje_funkce(rozvrh + experiment, experimenty_nepouzite - experiment);
  20.  
  21. if (reseni.lepsi_nez(nejlepsi_reseni)) nejlepsi_reseni = reseni;
  22. }
  23. }
  24.  
  25. return nejlepsi_reseni;
  26. }
  27.  
  28. ---------------
  29.  
  30. Postup kolegů (test09 řeší správně, ale zase pub09 trvá dlouho):
  31.  
  32. Vezmu *první* experiment, a pro každou jeho pozici v rozvrhu (včetně
  33. varianty "není v rozvrhu vůbec") větvím. Ve větvích stejným způsobem
  34. přidávám druhý experiment, atd. Z každého větvení dostanu výsledek a
  35. vyberu nejlepší.
  36.  
  37. global experimenty;
  38. moje_funkce(rozvrh, i) {
  39. podrozvrh = experimenty[i].rozvrh;
  40. while (podrozvrh != NULL) {
  41. if (vejde_se_do_rozvrhu(podrozvrh, rozvrh)) {
  42. # přidávám do rozvrhu na pozici určenou momentálním posunutím
  43. reseni = moje_funkce(rozvrh + podrozvrh, i + 1);
  44.  
  45. if (reseni.lepsi_nez(nejlepsi_reseni)) nejlepsi_reseni = reseni;
  46. }
  47. podrozvrh = podrozvrh.posunout(); # dejme tomu že přetečení přes povolený počet dní vrátí NULL
  48. }
  49.  
  50. # varianta, kdy i-tý experiment vynechám úplně - nepřidám do rozvrhu
  51. reseni = moje_funkce(rozvrh, i + 1);
  52.  
  53. if (reseni.lepsi_nez(nejlepsi_reseni)) nejlepsi_reseni = reseni;
  54.  
  55. return nejlepsi_reseni;
  56. }
  57.  
  58. ---------------
  59.  
  60. Pro test09 tedy asi musí platit, že nejlepší řešení obsahuje nějaké
  61. úplně prázdné místo, které by bylo při dosazování striktně zleva (tzn.
  62. 1. popsaným postupem) zaplněno.
  63.  
  64. Bohužel, 2. popsaný způsob funguje vždy, ale pub09 mu trvá velmi
  65. dlouho.
  66.  
  67. Snad je to srozumitelné.
  68.  
  69. Jan Neumann
  70.  
  71. Jindřich Prokop píše v Út 22. 10. 2019 v 14:38 +0200:
  72. > Dobrý den,
  73. >
  74. > děkuji za zprávu, koukal jsem v neděli na vaše řešení a na první
  75. > pohled se mi zdálo správné. V čem spočívala oprava?
  76. >
  77. > S pozdravem
  78. > Jindřich Prokop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement