Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Česky třeba tady:
https://translate.google.cz/?hl=en& … =translate
je to tam imho popsané celkem srozumitelně.
Offline
Dobrý deň ↑ Aleš13:,
našiel som to aj implementované:
https://www.geeksforgeeks.org/traveling … mentation/
Ďakujem.
Offline
Tohle je ale základní algoritmus, který sice najde nejlepší řešení, ale je nepoužitelný pro větší úlohy. A není v něm to simulované žíhání, protože pro tenhle algoritmus postrádá smysl. To je vhodné pro nějakou heuristiku která prohledává jen některé kombinace při přibližném řešení většího problému.
Offline
Dobrý deň ↑ Aleš13:,
Našiel som inú implementáciu:
https://www.goodrequest.com/blog/algori … ne-zihanie
To už je simulovane zihanie, ale pre 8 dám.
Offline
Nevím, tenhle jazyk neznám, ale v zásadě mi připadá srozumitelný :-)
Jinak to simulované žíhání není nějaký exaktně daný algoritmus, který by se dal odněkud opsat a použít, to je spíš soustava principů jak řešit nějakou třídu úloh. Vždycky se to pak musí vymyslet konkrétně, pro daný algoritmus řešící určitý problém.
Offline
Dobrý deň ↑ Aleš13:,
prepísal som to do jazyka java:
import java.lang.Math; import java.util.Random; public class SZ8D { static int broadSize = 40; static int tries = 100; static Random rand = new Random(); static int cost(int[] solution) { int cost = 0; for (int i = 0; i < broadSize; i++) { for (int j = (i+1); j < broadSize; j++) { if (solution[i] == solution[j]) cost++; if (solution[i] == solution[j] + (j-i)) cost++; if (solution[i] == solution[j] - (j-i)) cost++; } } return cost; } static int[] neighbor(int[] solution) { int column = rand.nextInt(broadSize); int row = rand.nextInt(broadSize); int[] returnSolution = solution.clone(); returnSolution[column] = row; return returnSolution; } static Boolean accept(int[] actual, int[] neighbor, double temp) { int diff = cost(neighbor) - cost(actual); if (diff < 0) {return true;} return rand.nextDouble() < Math.pow(Math.E,-diff/temp); } public static void main(String[] args) { // TODO Auto-generated method stub int[] current = new int[broadSize]; for (int i = 0; i < broadSize; i++) { current[i] = rand.nextInt(broadSize); } long startAt = System.currentTimeMillis(); for (int j = 0; j < tries; j++) { for (int i = 0; i < 10000; i++) { double temperature = 100.0 / (i + 100); int[] neighbor = neighbor(current); if (accept(current,neighbor,temperature)) { current = neighbor; } if (cost(current) == 0) { System.out.print("Try #" + Integer.toString(j) + "\n"); String Solution = "Solution "; for (int k = 0; k < broadSize;k++) { Solution = Solution + Integer.toString(current[k]) + " "; } Solution = Solution + " found in " + Integer.toString(i) + " iterations and " + Long.toString(System.currentTimeMillis() - startAt) + " ms. \n"; System.out.print(Solution); return; } } } } }
Mohol by si to po mne porovnať, či som to prepísal správne?
Ďakujem.
Offline
Vypadá to cca stejně, žádný rozdíl mě tam nepraštil do očí :-) ale nejvyšší instance na posouzení bude překladač Javy (nepouštěl jsem to). Sice už Konfucius říkal, že když program funguje, tak to ještě neznamená, že je správně, ale v tomhle případě bych se s takovým potvrzením spokojil.
Offline
Dobrý deň ↑ Aleš13:,
našiel som Travelling-salesman-problem:
https://github.com/melisekm/Travelling-salesman-problem
A je to aj simulované žihanie.
Offline