Matematické Fórum


1. 8. 2026 (L) Fórum bude brzy uzavřeno 😿

Nejste přihlášen(a). Přihlásit

#1 08. 11. 2022 12:50

fmfiain
Příspěvky: 744
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: 383
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: 744
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: 383
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: 744
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: 744
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: 383
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: 744
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: 383
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: 744
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: 383
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