Problemų sprendimo automatizavimas

Iš Pitonas.
18:07, 2 rugpjūčio 2023 versija, sukurta Martynas (aptarimas | indėlis) (Naujas puslapis: === Problemų sprendimo automatizavimas === Žmonės nuo senų laikų susiduria su įvairiais sudėtingais uždaviniais. Iki atsirandant kompiuteriams, uždaviniams, kurių sprendimui gauti reikėdavo atlikti daug skaičiavimo operacijų XIX ir XX a. pirmoje pusėje būdavo surenkamaos visos komandos skaičiuotojų, kurie turėdavo atlikti reikiamus skaičiavimus. Tokiu būdu būdavo atliekami sudėtingi skaičiavimai astronomijoje, apskaičiuojamos balistinių raketų traj...)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)

Problemų sprendimo automatizavimas

Žmonės nuo senų laikų susiduria su įvairiais sudėtingais uždaviniais. Iki atsirandant kompiuteriams, uždaviniams, kurių sprendimui gauti reikėdavo atlikti daug skaičiavimo operacijų XIX ir XX a. pirmoje pusėje būdavo surenkamaos visos komandos skaičiuotojų, kurie turėdavo atlikti reikiamus skaičiavimus. Tokiu būdu būdavo atliekami sudėtingi skaičiavimai astronomijoje, apskaičiuojamos balistinių raketų trajektorijos, atliekami skaičivimai orų prognozėms. Šis darbas būdavo ilgas ir gan nuobodus. Šiais laikais šias problemas galima automaitzuoti panaudojant kompiuterius.

Automatizavimo pavyzdžiai

Aritmetinės operacijos

Turbūt vienas iš paprasčiausių automatizavimo pavyzdžių būtų - aritmetinių skaičiavimų automatizavimas. Parašykime paprastą programą:

print("Įvesk pirmą skaičių")
skaičius1 = int(input())
print("Įvesk antrą skaičių")
skaičius2 = int(input())
sandauga = skaičius1 * skaičius2
print("Skaičių sandauga yra:", sandauga)

Tokia paprasta automatizacija leidžia greitai sudauginti du didelius skaičius, išvengiant žmogaus klaidų.

Didelio kiekio duomenų apdorojimas

Vienas iš dažniausių automatizavimo pritaikymų - didelio kiekio duomenų apdorojimas. Kompiuteriu galima greitai apdoroti didelį kiekį duomenų, kuriuos apdoroti žmogui užtruktų daug laiko. Įsivaizduokime kad turime failą, kur surašytos kiekvienos metų dienos vidutinė temperatūra farenheito skalėje. Mūsų tikslas suskaičiuoti vidutinę metų temperatūrą celsijaus skalėje. Be kompiuterio tektų ilgai ir nuobodžiai atlikti daug veiksmų. Nesunku kažkur ir klaidą padaryti. Tuo tarpu galime viską automatizuoti parašius tokį kodą:

def paversk_fahrenheitus_į_celsijų(temperatūra_farenheitais):
    temperatūra_celsijais = (temperatūra_farenheitais - 32) * 5 / 9
    return temperatūra_celsijais

def skaičiuok_vidutinę_temperatūrą(duomenų_failo_pavadinimas):
    viso_celsijų = 0
    dienų_skaičius = 0

    with open(duomenų_failo_pavadinimas, 'r') as failas:
        for eilutė in failas:
            farenheitai = int(eilutė)
            celsijai = paversk_fahrenheitus_į_celsijų(farenheitai)
            viso_celsijų += celsijai
            dienų_skaičius += 1

    vidutinė_temperatūra = viso_celsijų / dienų_skaičius
    return vidutinė_temperatūra

if __name__ == "__main__":
    duomenų_failas = "temperatures.txt"
    vidutinė_temperatūra = skaičiuok_vidutinę_temperatūrą(duomenų_failas)
    print(f"Vidutinė temperatūra yra: {vidutinė_temperatūra}")

Itin sudėtingų problemų automatizavimas

Egsituoja daug itin sudėtingų problemų, kurių automatizavimui reikalingi superkompiuteriai. Štai keletas pavyzdžių: 1. Orų prognozė ir klimato modeliavimas. Orų prognozės modeliai naudoja didelius duomenų kiekius, gaunamus iš satelitų, radarų ir kitų šaltinių. Superkomiuteris gali apdorti šiuos duomenis realiu laiku. Tam naudojami sudėtingi algoritmai simuliuojantys atmosferos dinamiką, vandenynų sroves ir kitus atmosferos reiškinius. Tai leidžia gauti greitesnses ir tikslesnes orų prognezes, bei pasiruošti galimoms stichinėms nelaimėms.

2. Vaistų kūrimas. Superkompiuteris atlieka automatizuotas simuliacijas ir virtualius eksperimentus su modeliuojamais vaistais. Analizuojamos molekulinės struktūros ir jų tarpusavio sąveika. Taip nustatomos potencialios naujos vaistinės medžiagos ir įvertinamas jų naudingumas.

3. Transporto ir logistikos optimizacija. Superkompiuteriu optimizuojami transporto ir logistikos tinklai. Aviacijoje tai leidžia optimizuoti skrydžių maršrutus ir taip taupyti degalus, bei trumpinti kleionės laiką. Krovinių pervežime tai padeda optimizuoti maršrutus, efektyviai paskirstyti krovinius ir minimizuoti kaštus.

Uždaviniai, kuriuos sudėtinga automatizuoti

Ne visų problemų sprendimus įmanoma lengvai automatizuoti. Štai du pavyzdžiai: 1. Matematinių teoremų įrodymas. Įrodyti teoremai gali reikėti patikrinti be galo daug įvairių galimybių ir atvejų. Dažnai to neįmanoma padryti automatizacijos būdu.

2. Sveikųjų skaičių faktorizavimas. Faktorizvaimo tikslas rasti duoto skaičiaus pirminius daugiklius. Pirminių skaičių faktorizavimu yra paremtos šiuolaikinės kriptografinės sistemos, pavyzdžiui RSA. Nors egzistuoja skaičių faktorizavimo algoritmai, tačiau faktorizuoti itin didelius skaičius, naudojamus kriptografijoje net ir galingais kompiuteriais užtrunka labai ilgai. Pavyzdžiui RSA dažnai galima sutikti raktus, kurie yra 2048 bitų ilgio sveikasis skaičius. Faktorizuoti tokį skaičių net ir galingu superkompiuteriu, gali užtrukti tūkstančius metų.

Skaičiavimo laikas

Vienas svarbiausių metrikų programavime yra programos vykdymo laikas. Vykdymo laiką tiesiogiai įtakoja naudojamų skaičiavimų sudėtingumas, duomenų kiekiai, bei naudojamo kompiuterio galia.

Skaičiavimo laiko nustatymas

Nori sužinoti kiek ilgai užtruko įvykdyti tavo programą? Pitone tą galime padaryti keletu būdų. Pateiksime vieną iš jų

#Importuojame paketą, leidžiantį dirbti su laiku
import time

#Pasiimimame algortimo vykdymo pradžios laiką
pradžios_laikas = time.time()

# Čia įrašome kodą, kurio vykdymo trukmę norime matuoti

#Pasiimame vykdymo pabaigos laiką
pabaigos_laikas = time.time()

#Paskaičiuojame vykdymo pradžios ir pabaigos laikus. Tai ir bus mūsų vykdymo laikas 
vykdymo_laikas = pabaigos_laikas - pradžios_laikas
print(f"Vykdymo laikas sekundėmis: {vykdymo_laikas:.6f}")

Pasirinkto algoritmo įtaka skaičiavimo laikui

Dažnai tą patį uždavinį galima spręsti ne vienu skirtingu būdu. Skaykime mums reikia suskaičiuoti visų skaičių nuo 1 iki N sumą. Tą padarysime dviem skirtingais būdais ir pamatuosime vykdymo laikus:

#Importuojame paketą, leidžiantį dirbti su laiku
import time

def suma1(N):
    result = 0
    #Skai2iuojame rezultatą tiesiogiai sudedami visus skaičius
    for i in range(1, N + 1):
        result += i
    return result


print ("Įvesk N")
N = int(input())



#Pasiimimame algortimo vykdymo pradžios laiką
pradžios_laikas = time.time()

print("Suma:", suma1(N))

#Pasiimame vykdymo pabaigos laiką
pabaigos_laikas = time.time()

#Paskaičiuojame vykdymo pradžios ir pabaigos laikus. Tai ir bus mūsų vykdymo laikas 
vykdymo_laikas = pabaigos_laikas - pradžios_laikas
print(f"Vykdymo laikas sekundėmis: {vykdymo_laikas:.6f}")

Įvykdžiau šį kodą savo kompiuteryje, su N=100000000 (100 milijonų), vykdymo trukmė buvo 11,6 sekundės

#Importuojame paketą, leidžiantį dirbti su laiku
import time

def suma2(N):
    #Pasinaudojame matematine formule
    return N * (N + 1) // 2


print ("Įvesk N")
N = int(input())



#Pasiimimame algortimo vykdymo pradžios laiką
pradžios_laikas = time.time()

print("Suma:", suma2(N))

#Pasiimame vykdymo pabaigos laiką
pabaigos_laikas = time.time()

#Paskaičiuojame vykdymo pradžios ir pabaigos laikus. Tai ir bus mūsų vykdymo laikas 
vykdymo_laikas = pabaigos_laikas - pradžios_laikas
print(f"Vykdymo laikas sekundėmis: {vykdymo_laikas:.6f}")

Dabar su N=100000000, vykdymo laikas tebuvo 0,001132 sekundės. Gali išbandyti abu kodo atvejus. Pamatysi, jog jų atsakymai bus vienodi, o vykdymo laikas skirsis daug kartų. Nors vykdymo greitis priklausys nuo konkretaus kompiuterio ir gali gauti kitokią trukmę, nei gavau aš, bet antrasis algoritmas visada bus greitesnis, nepriklausomai nuo nauodjamao kompiuterio.