Algorisme

De Viquipèdia
Dreceres ràpides: navegació, cerca
Figura 1. Visualització del Garbell d'Eratòstenes, un exemple d'Algorisme per tal de descartar nombres divisibles i deixar-ne només els Nombres primers.

Un algorisme[1] és un conjunt finit d'instruccions o passos que serveixen per a executar una tasca o resoldre un problema. En la vida quotidiana s'empren algorismes en multitud d'ocasions per resoldre diversos problemes com per exemple per posar una rentadora (conjunt d'instruccions enganxades a la tapa de la màquina), per tocar música (partitures), per construir un aeroplà a escala (expressats en les instruccions), per fer trucs de màgia (passos per a fer el truc) o, fins i tot, per a fer receptes de cuina (passos de la recepta). Alguns exemples d'algorismes en les matemàtiques són l'algorisme de la divisió per a calcular el quocient de dos nombres, l'algorisme d'Euclides per obtenir el màxim comú divisor de dos enters positius, el mètode de Gauss per resoldre un sistema lineal d'equacions, o com per exemple un algorisme que sumi els 'n' nombres primers.

D'una manera més formal, un algorisme és una seqüència finita d'instruccions realitzables, no ambigües, l'execució de les quals condueix a una resolució d'un problema. Aquesta definició es pot generalitzar des del punt de vista sistèmic, si se suposa que l'algorisme pot ésser dissenyat per rebre i aprofitar una determinada entrada, donant com a resultat una sortida, que pot resoldre un problema determinat.

Història[modifica | modifica el codi]

Figura 2. Al-Khwarizmi, introductor del sistema numèric indi i de les tècniques de l'àlgebra amb els seus nombres

En aquest apartat es distingeix entre la història de la paraula que denota el procés i la història de la ciència que estudia l'aplicació d'algorismes i els requeriments d'aquests. És evident que la repetició de tasques amb un mateix procés és practicada per tot tipus de sistemes vivents i que ja es coneixien alguns algorismes com per exemple el d'Euclides, pertanyents a l'àmbit de les matemàtiques, abans de designar-los com a tals.

Algorismes matemàtics a l'antiguitat[modifica | modifica el codi]

El coneixement de l'aplicabilitat de tècniques repetitives a l'hora de resoldre problemes matemàtics prové de l'antiga Babilònia on es troben escrits on es proposen algorismes[2] i també es feien servir taules de càlcul per resoldre problemes.

Altres exemples de l'antiguitat es troben a l'algorisme d'Euclides per calcular el màxim comú divisor de dos enters positius pertanyen a l'àmbit de les matemàtiques. Cal destacar també, el treball d'Euclides al camp de la geometria, que fou un referent per al desenvolupament formal de l'Algorísmica. Un exemple d'aplicació dels algorismes és el problema que consisteix a trobar el máxim d'un conjunt de nombres. Un exemple més complex per utilitzar aquest algorisme és el que s'explicarà a continuació utilitzan una descripció a alt nivell.

Exemple d'aplicació: algorisme d'Euclides[modifica | modifica el codi]

Donat un conjunt finit C de nombres, es té el problema de trobar el nombre més gran. Sense pèrdua de generalitat es pot assumir que el següent conjunt no és buit dels seus elements i estan numerats com c_1,c_2,\dots,c_n

És a dir, donat un conjunt C=\{c_1,c_2,\dots,c_n\} es demana trobar m tal que m \in C i x\leq m per tot element x que pertany al conjunt C.

Per trobar l'element màxim, s'assumeix que el primer element (c1) és el màxim, després, es recorre el conjunt i es compara cada valor amb el valor del màxim nombre trobat fins aquell moment. En el cas que un element sigui major que el màxim, s'assigna el seu valor al màxim. Quan s'acaba de recórrer la llista, el màxim nombre que s'ha trobat és el màxim de tot el conjunt.

Descripció formal[modifica | modifica el codi]

L'algorisme pot ser escrit d'una manera més formal en el següent pseudocodi:

Algorisme Trobar el màxim d'un conjunt

funció max(C)

//C es un conjunt no buit de nombres//
n|C| //|C| es el nombre d'elements de C//
mc_1
per i1 fins n fer
si c_i > m llavors
mc_i
tornar m

Sobre la notació:

  • "←" representa una assignació: mx significa que la variable m pren el valor de x;
  • "tornar" termina l'algorisme i retorna el valor a la seva dreta (en aquest cas, el màxim de C).

Origen del terme[modifica | modifica el codi]

Figura 3. Text en llatí a Cambridge, on la influència del matemàtic àrab es pot trobar la primera línia: Dixit Algorizmi

El terme algorisme prové del matemàtic i astrònom àrab Abu Abdullah Muhammad bin Musa al-Khwarizmi, autor de l'obra ”Sobre el càlcul amb nombres indis” l'any 825. Aquesta mateixa obra va ser traduïda al llatí al segle XII incloent-hi el nom de l'autor en forma llatina com a commemoració.[3] Un dels primers usos d'aquest terme el trobem en el tractat matemàtic en vers "Carmen de Algorismo", és a dir, Cançó o Poema de l'Algorisme (c.1220), del professor Alexandre de Villadei.[4] Aquesta cançó fou introduïda per tal d'ensenyar el sistema numèric indi. D'aquesta manera es desprenien mètodes de computació que simplificaven les operacions algebraiques amb els nous numerals (del zero al nou).[5] Així, els càlculs manuals es podien fer amb més eficiència. Una altra obra que esmenta a Al-Khwarizmi és ”Algorismus Vulgaris” de Johannes de Sacrobosco,[6] obra escrita el 1250 amb la intenció d'ensenyar els numerals indis i les possibilitats de l'aritmètica que va servir per introduir aquests coneixements a les universitats.[7]

D'aquesta manera, la paraula s'estengué per occident com al sistema introduït per l'autor basant-se en la numeració india i les operacions fonamentals que es podien simplificar amb aquest sistema.[8]

Desenvolupament de l'algorísmica[modifica | modifica el codi]

La història del plantejament matemàtic de la teoria dels algorismes va haver de nodrir-se de diferents idees al camp de les matemàtiques per tal d'arribar a disposar dels primers computadors.

Com a punt de partida del tractament axiomàtic de la matemàtica, és notable la tasca d'Euclides, que va formular els axiomes necessaris per desprendre la geometria amb la publicació del seu treball Elements.

El desenvolupament de l'estudi d'algorismes el va iniciar David Hilbert el 1900[9] en fer la proposició de la possibilitat de disposar d'un algorisme capaç de resoldre demostracions matemàtiques, això seria senzillament un mètode d'esbrinar si donada una afirmació aquesta és verdadera o és falsa.[10]

Un treball important que formulà les bases per tal de començar formalment la investigació de l'Algoritmia el va fer Kurt Gödel, en demostrar el 1931 a l'article ”Uber formal unentscheidbare Sätze der Principia Mathematica und verwandter a Systeme” el teorema d'incompletesa[11] on s'estableix que no es pot trobar un conjunt d'axiomes que compleixin les condicions necessàries per a la proposició de Hilbert:[10]

  • Axiomes suficientment potents per tal de demostrar qualsevol enunciat vertader.
  • No admeten contradiccions de manera que les afirmacions no puguin ser certes alhora que les seves negacions ho són.

Gràcies a Hilbert i a Gödel es va aconseguir desenvolupar l'algorítmica en paral·lel, per part de Church i d'en Turing. Per una banda, Church dedueix el càlcul lambda, mentre que Turing proposa la seva màquina, dues aplicacions en paral·lel i dutes a terme per separat. Amb aquests dos treballs s'omple el buit necessari per aclarir el concepte d'irresolubilitat del problema de Hilbert al cas dels algorismes.[12]

Avantatges de l'ús d'algorismes a la resolució de problemes[modifica | modifica el codi]

Figura 4. Algorisme d'ordenació.

L'algorisme dóna una solució genèrica a un problema i es pot emprar totes les vegades que es presenti aquest mateix problema, sempre que es dispose d'unes entrades adequades per fer-lo servir: per exemple l'algorisme de la divisió és genèric i independent dels nombres que s'hagi de dividir.

Una vegada descobert un algorisme per a efectuar una tasca, la realització d'aquesta ja no requereix entendre els principis que es basa dit algorisme, ja que el procés es redueix a seguir les instruccions del mateix. Per exemple, es pot fer una divisió seguint l'algorisme sense entendre per què funciona. La intel·ligència requerida per a portar a terme la tasca està codificada en l'algorisme.

Les màquines algorísmiques són aquelles capaces de dur a terme algorismes, i entre elles estan els ordinadors. En l'àmbit dels ordinadors, els algorismes s'expressen com programes. Els programes són algorismes codificats amb un llenguatge no ambigu que la seva sintaxi i semàntica "entén" l'ordinador. Hi ha molts llenguatges de programació d'ordinadors, com per exemple fortran, pascal o C.

Així doncs, si es vol que un ordinador efectuï una tasca, primer s'ha de desenvolupar un algorisme per a portar-la a terme; programar l'algorisme en la màquina consisteix a representar aquest algorisme de manera que es pugui comunicar a una màquina. En altres paraules, s'ha de transformar l'algorisme conceptual en un conjunt d'instruccions i representar aquestes últimes en un llenguatge sense ambigüitat.

Gràcies a la capacitat per a comunicar el pensament humà mitjançant algorismes, es poden construir màquines el comportament de les quals simula intel·ligència. El nivell d'intel·ligència que simula la màquina, estarà limitat per la intel·ligència que puguem comunicar-li per mitjà d'algorismes. Les màquines només poden realitzar tasques algorítmiques. Si es troba un algorisme per a dirigir l'execució d'una tasca, es podria construir una màquina per a portar-la a terme sempre que la tecnologia hagi avançat prou. Si no es troba un algorisme, és possible que l'execució estigui fora de les capacitats de les màquines. Un computador és tot aparell o màquina destinada a processar informació, entenent-se per procés, les successives fases, manipulacions o transformacions que sofreix la informació per a resoldre un problema determinat, seguint les instruccions d'un programa registrat.

A la Figura 4 es mostra l'algorisme d'ordenació en una versió molt simple. El propòsit de l'algorisme és fer passades des del cursor inicial fins al final, marcant el menor nombre i posant-lo al principi. Ací és clar que tots els casos tenen les mateixes operacions, ja que el recorregut és sempre el mateix, del cursor fins al final avaluant d'un a un tots els casos. És un clar exemple d'avantatge d'aquestes tècniques, ja que fa servir la força bruta per tal de recórrer un camí, sense fer divisions.

Eines per tal d'analitzar algorismes[modifica | modifica el codi]

A causa de la dificultat que suposa avaluar cadascun dels efectes d'un determinat algorisme en les disponibilitats en recursos per a la seva consecució és important l'ús d'eines matemàtiques potents i de suficients habilitats per a resoldre els entrebancs d'una determinada formulació d'algorisme.

En aquest apartat es poden veure alguns dels temes claus per a l'analista que fa possible l'aplicació d'un algorisme amb uns recursos determinats.

Expressió de l'algorisme amb el llenguatge[modifica | modifica el codi]

Figura 5. Diagrama de flux que expressa fàcilment el procés de cerca d'errors a un llum que ha fallat.

Els algorismes es poden expressar amb moltes notacions, incloent-hi el llenguatge, el pseudocodi, els diagrames de flux i els llenguatges de programació. Les expressions del llenguatge natural solen ser ambigües i amb massa riquesa de paraules i verbs, de manera que no se solen fer servir per a escriure algorismes tècnics i concisos. El pseudocodi i els diagrames de flux s'estructuren de diferents maneres per tal d'expressar els algorismes, de manera que s'evita caure en l'ambigüitat del llenguatge natural, disposant així d'unes instruccions concretes, fàcils d'entendre i independents de cap llenguatge d'implementació. Els llenguatges de programació es fan servir per a expressar algorismes en una forma en la qual es puguin executar a les computadores, però que també es fan servir per a documentar algorismes.

La utilitat de totes aquestes eines es troba associada a les tècniques de desenvolupament de codi, on primer es defineixen els passos, que poden ser esclarits o transmesos amb el llenguatge natural, després es plasmen en algun mitjà de representació mitjançant pseudocodi o diagrames de flux i finalment es tradueixen a algun llenguatge, procés també conegut com a codificació.[13]

El problema de l'eficiència[modifica | modifica el codi]

Quan es fan repeticions o combinacions d'algorismes de forma constant, resulta interessant orientar o fer l'anàlisi de l'algorisme o algorismes emprats en termes d'eficiència, és a dir, cal avaluar l'ús que es fa de l'algorisme per tal d'obtenir el resultat en termes de:

  • Memòria: És una mesura de la quantitat de dades de què disposa l'algorisme en un moment determinat.
  • Velocitat: És una mesura que depèn de les línies de codi que es recorren i de les operacions que contenen aquestes. Es podria mesurar en termes de velocitat computacional.

En determinades ocasions un plantejament d'algorisme té un cert marge per tal d'aconseguir millores que minimitzen tant la memòria com el recorregut en nombre d'operacions de l'algorisme, que relaxen els requeriments de la màquina que el fa servir i agilitzen el procés. Un efecte col·lateral a la millora dels algorismes és una possible reducció del codi d'instruccions i de la millora en la legibilitat d'aquest, aconseguint així una millor mantenibilitat de l'algorisme a l'hora de revisar-lo.

Els recursos que solen consumir els algorismes en general solen ser els següents:[14]

Millor cas, pitjor cas i cas mitjà[modifica | modifica el codi]

Per als treballs computacionals és útil considerar els diferents casos que poden donar-se en fer iteracions amb algorismes. Es defineixen així els conceptes de millor cas, pitjor cas i cas mitjà d'un algorisme per tal d'expressar la quantitat en termes de recurs almenys, com a màxim i mitjana respectivament, tractant-se normalment del recurs temps d'execució.[14][15] Això és una peça important a l'estudi de la complexitat computacional i es pot estudiar fent servir les eines exposades a l'anterior apartat, és a dir: l'eliminació de constants al càlcul dels requeriments de cada cas amb la notació de Landau.

Breument es descriuen els dos casos interessants per fer estimacions amb algorismes, encara que normalment el problema se centra en el pitjor dels casos:[14][15]

  • El pitjor cas és el pitjor cost, en termes de temps. El pitjor cas s'aconsegueix amb un conjunt d'entrades que fan que l'algorisme tingui aquest temps d'execució. És indicatiu del cost de l'algorisme en general i permet assegurar que el temps d'execució no sobrepassi aquest valor.
  • El cas mitjà és el temps mitjà que trigaria l'algorisme prenent un grup aleatori de possibles entrades a l'algorisme. Es tracta d'un càlcul que entranya certa dificultat, especialment si no es coneix la distribució aleatòria de les entrades, ja que la tendència general és la de suposar casos equiprobables.

Classificació d'algorismes[modifica | modifica el codi]

Es tracten diferents maneres de classificar els algorismes. A cadascuna d'aquestes classificacions es poden trobar unes particularitats d'aplicació a cada grup d'algorismes definit.

Per implementació[modifica | modifica el codi]

Segons la manera en què es faran servir els recursos i es recorreran les instruccions al codi, es poden classificar els algorismes de diferents maneres. Totes elles tenen aplicacions per a la resolució de determinats problemes.

Recursivitat[modifica | modifica el codi]

Molts algorismes tracten de simplificar el seu plantejament dividint un problema en un o diversos problemes més simples als quals es faria una cridada al mateix algorisme, amb un valor més proper.

L'exemple més clar es podria veure a la solució recursiva del problema del factorial d'un nombre natural n. En efecte, la solució per a n>0 es pot descompondre en problemes del mateix tipus que resulten ser més simples:

n!=n*(n-1)!

On es pot notar que:

  • n! és el factorial de n.
  • És clar que (n-1)! pot descompondre's una altra vegada en (n-1)!=(n-1)*(n-2)!, i així s'aniria disminuint fins a 1, on s'hauria d'establir la parada de l'algorisme, possiblement amb la convenció 0!=1, que sol proposar-se com a definició per tal de generalitzar a la majoria de problemes de matemàtiques.

Així doncs, a l'exemple es resol un problema gràcies a les successives cridades al mateix algorisme fins a unes condicions de parada on no es torna a requerir el mateix algorisme i la funció dóna una sortida predeterminada a l'arribar al punt final. Gràcies a la multiplicació acumulativa dels resultats de l'algorisme a cada nivell es conclou finalment amb la cerca del factorial d'un nombre natural amb l'ús de la recursivitat.[15] Mirant-ho des del punt de vista de l'eficiència, la recursivitat és una alternativa força recomanable. S'hi troben moltíssimes variants als bucles while i for que hi poden ésser reemplaçats per un algorisme recursiu, augmentant així la seva eficiéncia, i per tant, la utilització de la CPU.

Lògica[modifica | modifica el codi]

Si l'algorisme s'implementa basant-se en una deducció lògica controlada. On la component lògica expressa els axiomes que es poden fer servir a la computació i la component de control determina la manera en què la deducció s'aplica als axiomes i es formulen les possibles estratègies de resolució implementades.[16] Es tracta de la base del paradigma de la programació lògica. Als llenguatges de programació lògics purs la component de control és fixa, mentre que la component lògica és l'única especificació amb la qual s'alimenten els algorismes. Aquestes solucions tenen l'avantatge de tenir una semàntica elegant: el canvi als axiomes té un resultat ben definit: el canvi de l'algorisme.

En sèrie, en paral·lel o distribuït[modifica | modifica el codi]

Figura 6. Es mostra un sistema en paral·lel a l'esquema a i b, mentre que el c mostra un sistema distribuït

Se sol suposar que als algorismes les computadores només executen una instrucció en un moment determinat del temps. Aquestes operacions i les computadores que les executen normalment s'anomenen seqüencials o bé se'ls posa el cognom de en sèrie.

El concepte contrari al seqüencial és el del tractament de l'algorisme amb més d'un processador a la vegada, aquesta manera d'efectuar les instruccions sol distingir-se també pel tipus d'arquitectura de processadors emprada. La distinció per tipus d'arquitectura és evident, ja que determina la gestió de la memòria, del tràfic de les comunicacions i del procés en general de l'algorisme. Així doncs, se sol distingir entre: algorismes en paral·lel o algorismes distribuïts:

  • Els algorismes en paral·lel prenen avantatge d'arquitectures d'ordinadors on es disposa de diferents processadors per treballar amb un problema al mateix temps
  • Els algorismes distribuïts fan servir màquines diferents connectades per xarxa en forma de clúster o bé sistemes que fan servir una configuració intermèdia amb processadors independents amb memòria distribuïda.

Els algorismes que es fan servir per a aprofitar aquestes màquines divideixen els problemes de manera que els ataquen com a subconjunts de problemes simètrics o asimètrics per tal d'aconseguir uns resultats que comprendrien la combinació de les resolucions dels problemes per separat.

El consum de recursos en aquest tipus d'algorismes no només depèn dels cicles d'instruccions processats, ja que s'han de tenir en compte les comunicacions entre processadors. Un exemple de la necessitat de recursos de comunicació es troba als algorismes d'ordenació, que poden adaptar-se a l'ús en paral·lel de manera molt eficient, però que malbaratarien la disponibilitat del recurs de comunicació. L'impacte en la necessitat de recurs de comunicació és dependent del grau de paral·lelització o granularitat, això és que si s'incrementa la granularitat dels processos es concentrarien les tasques en uns pocs processadors, cosa que disminueix la necessitat de comunicació, però que fa servir menys processadors, apropant-se més al processament en sèrie.[17]

Els algorismes iteratius són, en el cas general, paral·lelitzables. Alguns problemes que no poden ser resolts en paral·lel, se solen anomenar inherently serial problems (En català: problemes inherentment expressables en sèrie).

Determinístics o no-determinístics[modifica | modifica el codi]

Els algorismes determinístics resolen els problemes amb la solució exacta al problema a cada etapa de l'algorisme, mentre que els no determinístics ho fan responent a preguntes típiques que van fent la solució cada vegada més acurada gràcies a l'ús de l'heurística.

Exactes o aproximats[modifica | modifica el codi]

Mentre que molts algorismes arriben a una solució exacta, els algorismes aproximats cerquen una aproximació que s'apropi a la vertadera. Les aproximacions es poden fer servir amb una estratègia determinística o bé aleatòria. Aquests algorismes tenen valor pràctic per a problemes molt difícils.

Per paradigma o estratègia de resolució[modifica | modifica el codi]

L'altra manera de classificar algorismes pot fer-se per la metodologia seguida al seu disseny. Alguns dels dissenys més estesos són els que es veuen a continuació.

Divideix i venceràs[modifica | modifica el codi]

Figura 7. Mètode de dividir i conquerir, que també es fa servir en transposar matrius

Amb l'exposició d'un exemple senzill de recursivitat ha quedat retratada l'estratègia general per tal de resoldre un problema gràcies a la divisió en parts més petites. Les estratègies generals d'aquest tipus tractarien d'acomplir tres passos:[14][15]

  • Divideix: Es tracta de l'estratègia de divisió per tal de fer servir el mateix o d'altres algorismes amb el consegüent progrés en la cerca de la solució.
  • Conquereix: Una vegada es té clara l'estratègia de divisió, es processen els subproblemes amb els algorismes necessaris.
  • Combina: El resultat és la combinació dels diferents subproblemes conquerits.

Amb la recursivitat vista al problema del factorial són evidents les tres fases, ja que:[15]

  • La divisió es tracta factoritzant la solució en els dos naturals més grans que el componen n i (n-1)!, on n és conegut i n-1 també, però és necessària la resolució d'aquest últim com a subproblema.
  • La conquesta comença en resoldre l'1!, on s'ha introduït la definició de 0!=1.
  • Cada subproblema es resol gràcies a les combinacions de cada conquesta, donant com a resultat des de 1!=1*0!=1*1=1, fins al cas del nombre factorial cercat: n!=n*(n-1)! on ja es coneixen tots els valors a la dreta de la igualtat.

Programació dinàmica[modifica | modifica el codi]

Figura 8. Dependències semblants als problemes de programació dinàmica a la sèrie de Fibonacci

Es tracta de la divisió de l'algorisme en problemes d'optimització per separat que poden superposar-se per tal d'avaluar en última instància el resultat òptim a un problema. Cadascun dels subproblemes es tracten de resoldre gràcies a diferents instàncies.

D'aquesta manera, el programa divideix el treball segons necessitat en problemes més petits. Aquest és un punt en comú amb el mètode de divideix i venceràs, amb el matís que aquest últim divideix el problema en punts determinístics. L'ús del paradigma divideix i venceràs és adequat quan els problemes no tenen dependència.

D'altra banda, en la resolució de problemes per programació dinàmica, el punt de divisió dels problemes entra en joc com a variable a optimitzar, resultant més adequat per a resoldre problemes dependents que se superposen.[18][19]

El mètode voraç[modifica | modifica el codi]

L'algorisme voraç és similar a la programació dinàmica, amb la diferència de què els subproblemes no són generalment coneguts a cada etapa. En comptes d'això es pot escollir una opció voraç que és el que sembla òptim en aquest moment. Aquest algorisme juga amb les solucions de subproblemes prenent les millors decisions (no totes les factibles al moment) i el porta a una etapa basada en òptims locals de l'anterior etapa. No és gaire exhaustiva ni dóna la resposta correcta en general. No obstant és un mètode molt eficient si el recorregut de l'algorisme és l'adequat. L'algorisme voraç més conegut és el que dóna Kruskal per tal d'aconseguir l'arbre de llargària mínima.

Programació lineal[modifica | modifica el codi]

Són els problemes que es resolen donant un espai de restriccions a un problema que opera amb unes variables determinades. L'objectiu en aquest tipus de problemes és el de cercar un òptim d'una funció donada també en funció de les variables del problema. Les restriccions de l'espai de les solucions solen donar-se en forma d'inequacions. Alguns problemes expressats en forma de grafs com per exemple el del flux màxim o el del transport formen part d'aquest tipus de paradigma de resolució de problemes d'optimització i es poden resoldre per un algorisme genèric per al tractament de la programació lineal, com és el mètode Simplex. Una variable més complexa de la programació lineal s'anomena programació entera, on l'espai de les solucions es restringeix al camp dels enters.

Reducció[modifica | modifica el codi]

Aquesta tècnica té avantatges en la resolució de problemes difícils dels quals no es coneix un algorisme de resolució específic. S'aplica quan aquests problemes poden resoldre's gràcies a algorismes coneguts que transformen el problema i aprofiten aquesta transformació per tal de resoldre l'algorisme resultant de la reducció. Per exemple, un algorisme de selecció per tal de buscar l'element mitjà a una llista d'elements desordenada es pot resoldre transformant la llista amb l'algorisme d'ordenació i després fent la cerca de l'element situat en la posició mitjana. Aquesta tècnica també s'anomena transforma i venceràs (de l'anglès transform and conquer).

Cerca i enumeració[modifica | modifica el codi]

Alguns problemes (com jugar als escacs) es poden modelar de manera més adequada amb l'ús de grafs. Un algorisme d'exploració de grafs especifica les regles per tal de moure's per un determinat graf de manera que l'aplicació d'aquest per a la resolució de problemes sigui útil. Aquesta categoria inclou: algorismes de cerca, algorismes de poda i ramificació i algorismes de tornada enrere.

Paradigma probabilístic i heurístic[modifica | modifica el codi]

Els algorismes que pertanyen a aquesta classe no s'ajusten exactament a la definició d'algorisme. Aquests són:

  1. Algorismes probabilístics són aquells als quals s'escullen aleatòriament algunes decisions; per alguns problemes es pot provar que les solucions més ràpides han d'involucrar certa aleatorietat.
  2. Algorismes genètics que tracten de trobar solucions imitant el procés biològic evolucionari amb un cicle de mutacions aleatòries de les quals es desprenen diferents solucions. D'aquesta manera s'emula la reproducció i la supervivència del més adaptat. A la programació genètica aquesta aproximació té extensió als algorismes, tractant-se en si mateixos com si fossin la solució a un problema i seleccionant entre les més adaptades.
  3. Algorismes heurístics, amb el propòsit general no de trobar una solució òptima, més aviat d'aproximar una solució on el temps o els recursos són limitats. No són pràctics per tal de trobar solucions perfectes. Un exemple d'açò pot ser la cerca local, la cerca tabú, o els algorismes de recuita simulada (de l'anglès simulated annealing) que és una classe d'algorisme probabilístic heurístic que varia la solució d'un problema en una quantitat aleatòria. El nom de recuita simulada fa al·lusió al terme recuita, procedent de la metal·lúrgia per denotar l'escalfament i posterior refredament amb cert manteniment de la temperatura del metall per tal de conferir-li les característiques desitjades, de manera que els grans del metall recristalitzen i lliuren la peça de defectes. El propòsit de la variància aleatòria és trobar prop dels òptims globals solucions que poden ser més simples localment que algunes solucions òptimes.

Algorismes com a funcions[modifica | modifica el codi]

Un algorisme es pot entendre com una funció que transforma les dades d'un problema (entrada) en les dades d'una solució (sortida). Encara més, les dades es poden representar al seu torn com a seqüències de bits, i en general, de símbols qualssevol Com cada seqüència de bits representa un nombre natural (vegeu Sistema binari), llavors els algorismes són en essència funcions dels nombres naturals en els nombres naturals que sí que es poden calcular. És a dir que tot algorisme calcula una funció f:\mathbf N\to \mathbf N on cada nombre natural és la codificació d'un problema o d'una solució (ajustant-se cadascuna de les resolucions dels problemes als algorismes utilitzats en les funcions).

Computació amb algorismes[modifica | modifica el codi]

Als sistemes de computadors, un algorisme és una instància d'una lògica escrita en forma de programari, feta per programadors i escrita per tal de funcionar en un determinat mitjà computacional per tar de fer alguna tasca. Aquesta lògica pot resultar molt senzilla i estar implementada a qualsevol tipus de programa.

Implementació[modifica | modifica el codi]

En el cas general, els algorismes no són necessàriament implementats mitjançant programes d'ordinador. Hi ha altres mitjans com per exemple a la biologia o als circuits elèctrics o mecànics que presenten repeticions d'algorismes.

Vegeu també[modifica | modifica el codi]

Referències[modifica | modifica el codi]

  1. DIEC Definició d'algorisme de l'Institut d'estudis Catalans
  2. Knuth, Donald E. «Ancient Babylonian algorithms» (en anglès). Nova York: ACM, 1972. [Consulta: 7 d'agost de 2009].
  3. Yacoob, Tasneem R. «The Genius of Muhammad Bin Musa Al-Khwarizmi». [Consulta: 29 de juliol de 2009].
  4. Lieberknecht, Otrfried. Allegorese und Philologie, 1999, pp 180. ISBN 3515073264. 
  5. Smith, Jeremy. «Abu Jafar Muhammad ibn Musa al-Khwarizmi». [Consulta: 29 de juliol de 2009].
  6. Bianchi, Luigi. «Lecture 8: The Middle Ages». Université York, 2003. [Consulta: 29 de juliol de 2009].
  7. Pedersen, Olaf. In Quest of Sacrobosco, 1985, pp. 199-200 (Journal for the History of Astronomy). 
  8. Lindberg, David C. Science in the Middle Ages, 1978, pp 315. ISBN 0-226-48233-2. 
  9. Wegner, Peter; Goldin, Dina. «Computation Beyond Turing Machines», 2002. [Consulta: 28 de juliol de 2009].
  10. 10,0 10,1 Muñoz, José. «Breve historia de la Computación», 2005. [Consulta: 28 de juliol de 2009].
  11. Bagaria, Joan; Castellet, Manuel; Puente, Carles; Stirling, James; Messeguer, Xavier. «Matemàtiques del segle XXI : dels fonaments a la tecnologia».
  12. Sieg, Wilfred. «”Church's Thesis”, “Consistency”, “Formalization”, “Proof Theory”, DICTIONARY ENTRIES», 1992.
  13. Myler, Harley R. Cambridge University Press, 1998. Fundamentals of engineering programming with C and Fortran, p. 25. ISBN 0521629500. 
  14. 14,0 14,1 14,2 14,3 Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. The MIT Press. Introduction to Algorithms, 1989. ISBN 0-262-03141-8. 
  15. 15,0 15,1 15,2 15,3 15,4 Ferri, Francesc; Albert, Jesús; Martín, Gregorio. Universitat de València. Introducció a l'anàlisi i disseny d'algorismes (en català), 1998. ISBN 8437038545. 
  16. Kowalsky, Robert Kowalski. J.J. Horning. Algorithm=Logic+Control (en anglès), 1979. 
  17. Boeriu, Stefan; Wang, Kai-Ping; Bruch Jr., John C. «Lecture Notes on Parallel Computation» p. 8. Department of Mechanical and Environmental Engineering, University of California. [Consulta: 7 d'agost de 2009].
  18. Narasimhan, Giri. «Dynamic Programming vs. Divide-&-conquer» (en anglès) p. 1, 2007. [Consulta: 27 de gener de 2011].
  19. Youssef, Abdou. «Dynamic Programming» (en anglès), 2001. [Consulta: 27 de gener de 2011].

Enllaços externs[modifica | modifica el codi]

A Wikimedia Commons hi ha contingut multimèdia relatiu a: Algorisme Modifica l'enllaç a Wikidata