Guida per principianti allo sviluppo di software di ottimizzazione [chiuso]

2

Sono novizio nella programmazione "seria", cioè applicazioni che si occupano di applicazioni di vita reale e progetti software che vanno oltre i compiti scolastici.

I miei interessi includono l'ottimizzazione, la ricerca operativa, gli algoritmi e ultimamente ho scoperto quanto mi piace il design / sviluppo / ingegneria del software.

Ho già sviluppato alcune semplici applicazioni desktop per alcuni "famosi" problemi come TSP usando approcci euristici, un risolutore VRP (in corso) e così via.

Durante lo sviluppo di questo tipo di software ho effettivamente utilizzato i concetti base insegnati a scuola come l'analisi dell'orientamento agli oggetti e il design. Ma, ho trovato questi corsi piuttosto elementari e piuttosto noiosi (per le mie aspettative).

Quindi ho deciso di andare un po 'oltre e di iniziare a sviluppare software "reale" (ed è qui che ho capito quanto sia importante e interessante l'ingegneria / progettazione del software.)

Ora, ecco il mio problema: non riesco a trovare una "guida allo studio" per lo sviluppo di software di questo tipo.

Attualmente esistono numerose risorse (libri, siti Web, esercitazioni) in fase di progettazione e sviluppo di IS complesse, applicazioni web, app per smartphone ma non riesco a trovare un libro ad esempio intitolato "Sviluppo software di ottimizzazione". Sicuramente, qualcuno potrebbe affermare che "i modelli di progettazione si applicano al software in generale", ma non è questo il mio punto.

Il mio punto è che potrei semplicemente usare la mia immaginazione per implementazioni "semplici", ma cosa succede quando la mia immaginazione non può andare oltre?

In altre parole, sto cercando una guida / percorso per colmare il divario tra: Matematica-Algoritmo Progettazione-Ingegneria software-Ottimizzazione-Sviluppo software

    
posta Florents Tselai 21.12.2011 - 22:18
fonte

4 risposte

6

Sembra che tu voglia immergerti in tutti gli aspetti dell'ingegneria del software, il che è fantastico, ma lo svantaggio è che non esiste un posto dove trovare tutti questi tipi di risposte: il nostro è un campo giovane e in rapida evoluzione. La risposta corretta per "come imparo a progettare algoritmi?" porta a un'intera area di discussione, "come posso imparare a scrivere programmi complessi?" è un altro, "come faccio a imparare a scrivere programmi veloci?" un terzo, e "come faccio a trovare i modi più noti per risolvere questo tipo di problema?" è ancora un altro

Ciò che mi viene in mente è che hai una passione per quelli che sono considerati problemi algoritmici "difficili". Questa non è una passione di carriera comune (per qualche ragione) e non troverete una gamma di risorse così ampia come per obiettivi più comuni. D'altra parte, per quelli con la combinazione di interessi e talenti matematici e pratici, è una nicchia praticabile (anche se è difficile introdursi - non trovi lavoro su Craigslist ...). La maggior parte delle risorse algoritmiche in questo settore saranno accademiche e specifiche della tecnica, mentre la programmazione delle prestazioni a basso livello è molto più il mondo degli oscuri forum Internet e dei documenti tecnici del produttore.

Nell'area specifica dell'ottimizzazione della funzione, sembra che tu abbia lavorato principalmente con algoritmi precisi completamente deterministici finora. Questi hanno tutti i tipi di vantaggi, ma a volte sono poco pratici nei problemi con spazi di soluzione molto grandi. Potresti divertirti ad esplorare approcci probabilistici, come catene di Markov, ricottura simulata, algoritmi genetici e programmazione evolutiva, algoritmi di formica, ecc.

Inoltre, dovresti almeno essere a conoscenza del campo degli algoritmi di approssimazione, che precludono la precisione per prestazioni più elevate (ad esempio, l'imballaggio preciso del contenitore è NP, ma può essere risolto in tempo polinomiale con un errore accettabile arbitrariamente basso).

So che non ti ho dato alcun collegamento diretto, ma spero di aver buttato fuori abbastanza argomenti da riempire un po 'di tempo con Google!

    
risposta data 22.12.2011 - 18:47
fonte
2

Credo che parte del problema che stai riscontrando sia che tale software sviluppato per le aziende, piuttosto che software sviluppato per il mercato di massa (noto come "shrink-wrapped" o consumer), sia sviluppato e venduto come soluzioni piuttosto che come applicazioni, per la maggior parte.

Alcune di queste aziende hanno un prodotto di base e vendono il pacchetto con consulenza di personalizzazione, che essenzialmente sta sviluppando una codifica formale delle "regole aziendali" o "logica aziendale" per l'attività del cliente. Ciò è necessario in quanto il in realtà in realtà desidera una soluzione al loro problema, non un sistema complesso in grado di manipolare simboli e numeri. Le aziende addestrano e promuovono i propri consulenti interni (ad es. IBM) e esterni (SAIC) che si specializzano nel supportare il loro prodotto e la sua personalizzazione per i clienti.

Sospetto che la maggior parte di questa conoscenza ricada nel lato accademico della recinzione ( SIAM potrebbe essere la migliore fonte di riviste e libri ) o conoscenza aziendale interna che non è ampiamente condivisa, in quanto i mercati particolari possono essere percepiti come piccoli (pochi concorrenti).

Un luogo in cui è possibile trovare una comunità di persone disposte a condividere le proprie conoscenze è centri di supercomputer accademici, che possono persino fornire un luogo di lavoro per passare dal proprio background apparentemente accademico a un'esperienza e un ruolo più orientati allo sviluppo.

Non lo so per certo, è totalmente al di fuori della mia sfera di conoscenza / esperienza, ma una potenziale area da considerare potrebbe essere il campo di data mining , dove i set di dati sono così grandi che approcci più avanzati per l'estrazione di informazioni utili possono toccare l'ottimizzazione e l'approccio OR.

Le organizzazioni militari e di intelligence interna (ad esempio NSA, CGHQ, CSE) possono essere luoghi di applicazione e / o impiego se sei interessato.

Non so se un dipartimento come il dipartimento C & O di U Waterloo possa avere ulteriori suggerimenti. Altrimenti ciò che viene generalmente definito "calcolo scientifico" potrebbe essere il più vicino a quello che stai cercando.

Tale attenzione è al di fuori del mio stesso background, ma spero che ti aiuti a darti dei punti da considerare o esaminare.

    
risposta data 22.12.2011 - 21:51
fonte
1

Il corso gratuito Machine Learning online della Stanford University potrebbe essere esattamente quello che stai cercando. Include compiti di programmazione come compiti a casa e copertine:

This course provides a broad introduction to machine learning, datamining, and statistical pattern recognition. Topics include: (i) Supervised learning (parametric/non-parametric algorithms, support vector machines, kernels, neural networks). (ii) Unsupervised learning (clustering, dimensionality reduction, recommender systems, deep learning). (iii) Best practices in machine learning (bias/variance theory; innovation process in machine learning and AI). The course will also draw from numerous case studies and applications, so that you'll also learn how to apply learning algorithms to building smart robots (perception, control), text understanding (web search, anti-spam), computer vision, medical informatics, audio, database mining, and other areas.

    
risposta data 21.12.2011 - 22:36
fonte
0

Se riesci a ottenere un algoritmo in codice su O (1), allora è completamente ottimizzato e hai raggiunto il sacro graal della programmazione algoritmica, tuttavia, di solito il tempo e lo sforzo necessari per arrivare a quel livello di ottimizzazione non è ne vale la pena dato che i computer di oggi sono abbastanza veloci da gestire qualsiasi cosa. Ma ci sono momenti in cui uno dovrebbe ottimizzare l'algoritmo per renderlo più efficiente. Quindi capire la complessità del codice e come viene eseguito è un buon inizio.

Ecco un buon articolo per iniziare:

link

    
risposta data 21.12.2011 - 22:47
fonte

Leggi altre domande sui tag