Matematické Fórum

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

#1 08. 11. 2022 12:50

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Algoritmus simulovaného žihania

Dobrý deň,
hľadám slovenské alebo české poznámky na algoritmus simulovaného žihania (umelá inteligencia) pre problém obchodného cestujúceho (anglicky Simulated Annealing Algorithm - Traveling Salesman Problem).

Ďakujem.

Offline

 

#2 08. 11. 2022 20:01

Aleš13
Příspěvky: 329
Reputace:   
 

Re: Algoritmus simulovaného žihania

Česky třeba tady:
https://translate.google.cz/?hl=en& … =translate
je to tam imho popsané celkem srozumitelně.

Offline

 

#3 09. 11. 2022 12:58

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Re: Algoritmus simulovaného žihania

Dobrý deň ↑ Aleš13:,
našiel som to aj implementované:

https://www.geeksforgeeks.org/traveling … mentation/

Ďakujem.

Offline

 

#4 09. 11. 2022 18:39 — Editoval Aleš13 (09. 11. 2022 23:01)

Aleš13
Příspěvky: 329
Reputace:   
 

Re: Algoritmus simulovaného žihania

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

 

#5 10. 11. 2022 12:54

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Re: Algoritmus simulovaného žihania

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

 

#6 10. 11. 2022 13:01 — Editoval fmfiain (10. 11. 2022 13:08)

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Re: Algoritmus simulovaného žihania

Dobrý deň ↑ Aleš13:,
Čo je to za jazyk?
Zevraj je to kotlin, vývojové prostredie pre android.

Offline

 

#7 10. 11. 2022 14:44

Aleš13
Příspěvky: 329
Reputace:   
 

Re: Algoritmus simulovaného žihania

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

 

#8 11. 11. 2022 08:22

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Re: Algoritmus simulovaného žihania

Dobrý deň ↑ Aleš13:,
prepísal som to do jazyka java:

Code:

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

 

#9 11. 11. 2022 13:19

Aleš13
Příspěvky: 329
Reputace:   
 

Re: Algoritmus simulovaného žihania

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

 

#10 11. 11. 2022 13:28 — Editoval fmfiain (11. 11. 2022 13:34)

fmfiain
Příspěvky: 700
Reputace:   -1 
 

Re: Algoritmus simulovaného žihania

Dobrý deň ↑ Aleš13:,
našiel som Travelling-salesman-problem:

https://github.com/melisekm/Travelling-salesman-problem

A je to aj simulované žihanie.

Offline

 

#11 11. 11. 2022 16:57

Aleš13
Příspěvky: 329
Reputace:   
 

Re: Algoritmus simulovaného žihania

Hezký článek, to je přesně ono.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson