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