Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.13 KB | None | 0 0
  1. (ns ts.travelling-salesman)
  2. (def numcities 20)
  3. ;go definira vkupniot broj na gradovi
  4. ;***treba da isprobate so razlicen broj na gradovi***,
  5. ;no vnimavajte kako toa ke se dorazi na ostanatiot del od skriptata
  6.  
  7. (defn citylist
  8. ([n] (citylist [] n))
  9. ([res n]
  10. (cond
  11. (zero? n) (vec (reverse res))
  12. :else (recur (conj res (keyword (str (char (+ (int \A) (dec n)))))) (dec n)))))
  13. ;funkcija koja vraka lista od n posledovatelni karakteri pocnuvajki od "A"
  14.  
  15. (def cities (citylist numcities))
  16. ;definicija na var koj ke se koristi kako lista na iminja na gradovite vo problemot
  17.  
  18. (defn coord-list
  19. ([] (coord-list {} cities))
  20. ([result keys]
  21. (cond
  22. (empty? keys) result
  23. :else (recur (assoc result (first keys) (vector-of :int (rand 1000) (rand 1000))) (rest keys))))
  24. )
  25. ;funkcija koja za vlezna lista od karakteri generira mapa (hash) taka sto
  26. ;sekoj karakter se zema za kluc vo mapata
  27. ;kon sekoj kluc se pridruzuva vektor so dva elementi [x y] koi treba da odgovaraat na koordinati na klucot
  28. ;koordinatite se postavuvaat kako slucajni broevi vo opsegot pomegu 0 i 999
  29. ;***vo ramki na ovaa funkcija probajte da go menuvate opsegot od koj se izbiraat koordinatite***
  30.  
  31. (def coordinates (coord-list))
  32. ;definicija na var koj se koristi kako mapa za site gradovi vo problemot pridruzeni so nivnite koordinati
  33.  
  34. (defn square [x] (* x x))
  35. ;funkcija koja presmetuva kvadrat na vlezen broj
  36.  
  37. (defn distance [city1 city2]
  38. (let [c1 (city1 coordinates)
  39. c2 (city2 coordinates)]
  40. (Math/sqrt
  41. (+ (square (- (first c1) (first c2)))
  42. (square (- (second c1) (second c2)))
  43. )
  44. )
  45. ))
  46. ;funkcija koja presmetuva rastojanie pomegu dva grada
  47. ;kako vlez gi prima klucevite na gradovite od mapata kade gi cuvame
  48.  
  49. (defn rand-position [v]
  50. (int (rand (count v))))
  51. ;funkcija koja za vlezen vektor ke vi vrati slucajna pozicija vo ramki na vektorot
  52. ;vnimavajte ja vraka pozicijata, a ne elementot na taa pozicija
  53.  
  54. (defn routelength
  55. ([r] (routelength r (distance (first r) (nth r (dec (count r))))))
  56. ([r total] (cond (= (count r) 1) total :else (recur (rest r) (+ total (distance (first r) (nth r 1))))))
  57. )
  58. ;funkcija koja treba da presmeta dolzina na nekoj redosled na izminuvanje na gradovite
  59. ;redosledot treba da bide vektor vo koj sekoj element ke pretstavuva kluc od eden od gradovite
  60. ;ne zaboravajte deka vo vkupnata dolzina treba da go zemete vo predvid i vrakanjeto kon posledniot grad (rastojanie od posledniot element vo vektorot do prviot)
  61. ;funkcijata treba da ima eden argument - vektor za patekata
  62. ;realizirajte ja so tail rekurzija
  63.  
  64. (defn remove-subvec [v f t] (into [] (concat (subvec v 0 f) (subvec v t))))
  65.  
  66. (defn insert [n p l] (let [a (subvec l 0 p) b (subvec l p)] (into [] (concat a n b))))
  67.  
  68. (defn displacement [v]
  69. (let [a (rand-position v) b (rand-position v) c (min a b) d (max a b) nov-vec (remove-subvec v c d)]
  70. (cond
  71. (< (- d c) 2) (displacement v)
  72. :else (insert (subvec v c d) (rand-position nov-vec) nov-vec)
  73. )
  74. )
  75. )
  76.  
  77. ;funkcija koja treba da ja implementira displacement modifikacijata na dadena pateka
  78. ;na vlez dobiva pateka kako vektor i treba da ja promeni spored displacement
  79. ;se zema podvektor od vlezniot so slucajna pocetna i krajna pozicija, za da ima smisla promenata treba podvektorot da ima dolzina pogolema od 1
  80. ;podvektorot treba da se "otstrani" od vlezniot vektor so sto se dobiva "nov" skraten vektor
  81. ;podvektorot treba da se vmetne vo "skrateniot" vektor na slucajna pozicija
  82.  
  83. (defn swap [v i1 i2] (assoc v i2 (v i1) i1 (v i2)))
  84.  
  85. (defn exchange [v] (let [a (rand-position v) b (rand-position v)] (cond (= a b) (exchange v) :else (swap v a b))))
  86. ;funkcija koja treba da ja implementira exchange modifikacijata na dadena pateka
  87. ;na vlez dobiva pateka kako vektor i treba da ja promeni spored exchange
  88. ;se zemaat dve slucajni pozicii vlezniot vektor, za da ima smisla promenata treba dvete pozicii da bidat razlicni
  89. ;elementite koi se naogaat na dvete slucajno izbrani pozicii si gi zamenuvaat mestata
  90.  
  91.  
  92. (defn insertion [v] (let [pos (rand-position v) el (nth v pos) nv (remove-subvec v pos (inc pos))] (insert [el] (rand-position nv) nv)))
  93. ;funkcija koja treba da ja implementira insertion modifikacijata na dadena pateka
  94. ;na vlez dobiva pateka kako vektor i treba da ja promeni spored insertion
  95. ;se zema slucajna pozicija od vlezniot vektor, elementot koj se naoga na taa pozicija se "otstranuva" od vlezniot vektor i se dobiva "nov skraten" vektor
  96. ;elementot koj prethodno go "otstranivme" se vraka nazad vo "noviot skraten" vektor, no na slucajna pozicija
  97.  
  98.  
  99. (defn inversion [v]
  100. (let [a (rand-position v) b (rand-position v) c (min a b) d (max a b) nov-vec (remove-subvec v c d)]
  101. (cond
  102. (< (- d c) 2) (displacement v)
  103. :else (insert (into [] (reverse (subvec v c d))) (rand-position nov-vec) nov-vec)
  104. )
  105. )
  106. )
  107.  
  108. ;funkcija koja treba da ja implementira inversion modifikacijata na dadena pateka
  109. ;na vlez dobiva pateka kako vektor i treba da ja promeni spored inversion
  110. ;se zema podvektor od vlezniot so slucajna pocetna i krajna pozicija, za da ima smisla promenata treba podvektorot da ima dolzina pogolema od 1
  111. ;podvektorot treba da se "otstrani" od vlezniot vektor so sto se dobiva "nov" skraten vektor
  112. ;podvektorot treba da se prevrti i da se vmetne vo "skrateniot" vektor na slucajna pozicija
  113.  
  114.  
  115. (defn scramble [v]
  116. (let [a (rand-position v) b (rand-position v) c (min a b) d (max a b) nov-vec (remove-subvec v c d)]
  117. (cond
  118. (< (- d c) 2) (displacement v)
  119. :else (insert (shuffle (subvec v c d)) (rand-position nov-vec) nov-vec)
  120. )
  121. )
  122. )
  123. ;funkcija koja treba da ja implementira scramble modifikacijata na dadena pateka
  124. ;na vlez dobiva pateka kako vektor i treba da ja promeni spored scramble
  125. ;se zema podvektor od vlezniot so slucajna pocetna i krajna pozicija, za da ima smisla promenata treba podvektorot da ima dolzina pogolema od 1
  126. ;podvektorot treba da se "otstrani" od vlezniot vektor so sto se dobiva "nov" skraten vektor
  127. ;podvektorot treba da se izmesa (shuffle) i da se vmetne vo "skrateniot" vektor na slucajna pozicija
  128.  
  129.  
  130. (def initial (shuffle cities))
  131. ;definicija na var so koj ja inicijalizirame patekata niz gradovite
  132.  
  133. (def best-route (ref initial))
  134. ;treba da definirate referenca (ref) vo koja ke se cuva najdobrata pateka kako vektor
  135.  
  136. (def best-length (ref (routelength initial)))
  137. ;treba da definirate referenca (ref) vo koja ke se cuva dolzinata na najdobrata pateka
  138.  
  139. (def maximprov 100)
  140. (def num-improv (ref maximprov))
  141. ;definicija na referenca za broj na podobruvanja koi ocekuvame agentite da gi napravat za da zavrsi skriptata
  142. ;***isprobajte razlicni varijanti za vrednosta na ovaa referenca i iskomentirajte sto se slucuva pri mali/golemi vrednosti i pri razlicen broj na gradovi***
  143.  
  144.  
  145. (def improv-operation (ref ()))
  146. ;definicija na var za lista vo koja ke se cuvaat site operacii koi agentite gi izvrsile i koi donele podobruvanje na patekata
  147.  
  148. (defn fn-name
  149. [f]
  150. (first (re-find #"(?<=\$)([^@]+)(?=@)" (str f))))
  151. ;funkcija koja koristi regularen izraz za da od dadena funkcija vo runtime go ekstrahira samo nejzinoto ime
  152.  
  153.  
  154. (def displacement-agent (agent initial))
  155. (def exchange-agent (agent initial)) ;definirajte agent so pocetna sostojba)
  156. (def insertion-agent (agent initial));definirajte agent so pocetna sostojba)
  157. (def inversion-agent (agent initial)) ;definirajte agent so pocetna sostojba)
  158. (def scramble-agent (agent initial)) ;definirajte agent so pocetna sostojba)
  159. ;definicii za agentite koi ke go resavaat problemot
  160. ;definirate po eden agent za sekoja mozna operacija na promena na patekata
  161. ;sto bi znacelo deka sekoj eden od ovie agenti ke probuva da go resi problemot so taa promena,
  162. ;a krajnoto resenie ke bide kombinacija na site
  163.  
  164. (def num-tries (atom 1000))
  165. ;definicija na var za broj na obidi na sekoj od agentite
  166. ;ovaa vrednost e neophodna kako ogranicuvanje bidejki ako se postavi loso brojot na podobruvanja moze da otideme vo overflow
  167. ;istiot problem ke se javi ako brojot na obidi e mnogu golem
  168. ;***probajte da eksperimentirate so ovaa vrednost i komentirajte koga stanuva problematicna, probajte da najdete objasnuvanje online za problemot koj se javuva***
  169.  
  170. (defn update [v f]
  171. ;vasiot kod ovde
  172. (let [nov-vec (f v) length (routelength nov-vec)]
  173. (cond
  174. (> length @best-length) v
  175. :else (do (dosync (ref-set best-length length)) (dosync (ref-set best-route nov-vec)) (dosync (alter num-improv dec))
  176. (dosync (ref-set improv-operation (conj @improv-operation (fn-name f))) nov-vec))
  177. )
  178. )
  179. )
  180.  
  181. ;funkcija koja dokolku se ispolneti uslovi treba da napravi azuriranje na referencite best-route, best-length, num-improv, improv-operation
  182. ;na vlez dobiva dva argumenti: vektor za momentalna pateka i funkcija koja treba da se primeni na takvata pateka za da se promeni
  183. ;referencite se menuvaat samo ako promenetata pateka e podobra od tekovnata
  184. ;ovaa funkcija treba da bide iskoristena od strana na agentite koi go baraat resenieto,t.e. ova e funkcijata koja mu se praka na sekoj eden agent
  185. ;pri koristenje na send funkcijata, momentalnata sostojba na agentot ke bide postavena kako prv argument na funkcijata
  186. ;rezultatot od izvrsuvanjeto na funkcijata ke bide nova sostojba na agentot
  187. ;vtoriot argument na funkcijata ukazuva na toa koja promena da se iskoristi za da se vidi dali agentot ke si ja promeni sostojbata
  188. ;primer: (send displacement-agent update displacement),
  189. ;sto bi znacelo deka vrz momentalnata sostojba na agentot so ime displacement-agent ja primenuvame update funkcijata vo koja ke se proba da se napravi azuriranje so displacement funkcijata
  190.  
  191. (defn show[]
  192. (do
  193. (println "Initial route was" initial "with length" (routelength initial))
  194. (println (- maximprov @num-improv) "improvements made")
  195. (println "The following operations were made" @improv-operation)
  196. (println "Best route is" @best-route "with length" @best-length)))
  197. ;funkcija za prikaz na resenieto
  198.  
  199. (defn main []
  200. (cond
  201. (<= @num-improv 0) (do (println "1") (shutdown-agents) (show))
  202. (< @num-tries 1) (do (await-for 1000 displacement-agent exchange-agent insertion-agent inversion-agent scramble-agent) (show))
  203. :else (do
  204. (send exchange-agent update exchange)
  205. (send displacement-agent update displacement)
  206. (send insertion-agent update insertion)
  207. (send inversion-agent update inversion)
  208. (send scramble-agent update scramble)
  209. (swap! num-tries dec)
  210. (main)
  211. ))
  212. )
  213.  
  214. ;glavnata funkcija preku koja go resavate problemot
  215. ;treba da zemete vo predvid nekolku moznosti:
  216. ;1. funkcijata da zavrsi poradi dostignat broj na podobruvanja na resenieto
  217. ;Vo ovoj slucaj potrebno e da gi prekinete site agenti koi seuste ne zavrsile i da go prikazete resenieto
  218. ;2. funkcijata da zavrsi poradi dostignat broj na obidi
  219. ;Vo ovoj slucaj potrebno e da gi pocekate site agenti da zavrsat i potoa da go prikazete resenieto
  220. ;3. Ako ne e ispolnet nitu eden uslov za prekinuvanje potrebno na sekoj od agentite da mu ispratite soodveten update, da go namalite brojot na obidi i da napravite rekurziven povik
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement