Posted on

Intelligenza Artificiale: AI come Ricerca di Soluzioni in Spazi di Problemi Esponenziali

Molti problemi che l’IA cerca di risolvere, dalla pianificazione di percorsi ottimali al gioco degli scacchi o alla scoperta di farmaci, sono complessi e caratterizzati da spazi di ricerca esponenziali. Ciò significa che il numero di possibili soluzioni cresce in modo esponenziale con la dimensione del problema.

Consideriamo, ad esempio, il problema del commesso viaggiatore (TSP): trovare il percorso più breve che visiti un insieme di città e ritorni alla città di partenza. Il numero di possibili percorsi cresce factorialmente con il numero di città, rendendo l’enumerazione completa impraticabile anche per un numero moderato di città.

L’IA affronta questa sfida attraverso diverse strategie:

  • Algoritmi di Ricerca Informata (Euristiche): Invece di esplorare lo spazio di ricerca in modo cieco, gli algoritmi euristici utilizzano “funzioni euristiche” che stimano la “distanza” dalla soluzione desiderata, guidando la ricerca verso le aree più promettenti.

 

  • Algoritmi di Ottimizzazione Ispirati alla Natura: Tecniche come gli algoritmi genetici, l’ottimizzazione per colonia di formiche e l’algoritmo di ottimizzazione a sciame di particelle si ispirano a processi naturali per esplorare spazi di ricerca complessi in modo efficiente, anche se non garantiscono di trovare la soluzione ottima.

 

  • Apprendimento Automatico: In molti casi, soprattutto quando lo spazio del problema è troppo vasto o mal definito per una ricerca esplicita, l’IA utilizza l’apprendimento automatico per “imparare” direttamente dai dati e sviluppare modelli che possono approssimare la soluzione desiderata o prendere decisioni intelligenti.

La capacità dell’IA di navigare e trovare soluzioni in spazi di problemi esponenziali, spesso attraverso approcci euristici e basati sui dati, è uno dei suoi punti di forza e la distingue da approcci computazionali più tradizionali. Tuttavia, è fondamentale essere consapevoli dei limiti di questi metodi, che spesso non garantiscono l’ottimalità della soluzione trovata.


INDICE

Posted on

Intelligenza Artificiale : Il Problema dell’Intelligenza

Al cuore dell’IA risiede l’enigmatico “problema dell’intelligenza”. Definire univocamente cosa costituisca l’intelligenza è una sfida che ha impegnato filosofi, psicologi e scienziati cognitivi per secoli. Nell’ambito dell’IA, questa difficoltà si traduce nella necessità di identificare le capacità cognitive che una macchina dovrebbe possedere per essere considerata “intelligente”.

Tradizionalmente, l’intelligenza umana è associata a una serie di facoltà complesse, tra cui:

  • Ragionamento: La capacità di trarre una deduzione logica, risolvere problemi e pianificare azioni.
  • Apprendimento: La capacità di acquisire nuove conoscenze e migliorare le proprie prestazioni attraverso l’esperienza.
  • Percezione: La capacità di interpretare informazioni sensoriali provenienti dall’ambiente.
  • Comprensione del linguaggio: La capacità di processare e generare linguaggio naturale.
  • Creatività: La capacità di produrre idee nuove e originali.
  • Coscienza (dibattuto): La consapevolezza di sé e del proprio ambiente (un aspetto ancora lontano dalle attuali capacità dell’IA generale).

Il problema per l’IA non è solo replicare queste singole capacità, ma anche comprendere come esse interagiscono e si integrano per dar luogo a un comportamento intelligente flessibile e adattivo. Il famoso Test di Turing, proposto da Alan Turing nel 1950, ha offerto un criterio operativo per valutare l’intelligenza di una macchina: se un essere umano non riesce a distinguere le risposte di una macchina da quelle di un altro essere umano in una conversazione testuale, allora si può dire che la macchina “pensa”.

Sistemi Intelligenti: Cenni Filosofici:

La possibilità di creare “sistemi intelligenti” ha profonde implicazioni filosofiche che riguardano la natura della mente, la coscienza e il rapporto tra uomo e macchina. Alcuni dei dibattiti filosofici centrali includono:

  • L’Intelligenza Artificiale Forte vs. Debole: L’IA forte mira a creare macchine con una vera e propria comprensione e coscienza, capaci di pensare e ragionare al pari di un essere umano, se non meglio. L’IA debole, al contrario, si concentra sulla progettazione di sistemi che simulano aspetti specifici dell’intelligenza per risolvere compiti particolari, senza necessariamente possedere una vera coscienza o comprensione. La maggior parte delle attuali applicazioni di IA rientra nella categoria dell’IA debole.
  • Il Problema della Scatola Nera: Molti sistemi di apprendimento automatico avanzati, come le reti neurali profonde, operano come delle “scatole nere”, in cui il processo decisionale interno è opaco e difficile da interpretare. Questo solleva interrogativi sulla trasparenza, l’affidabilità e la responsabilità delle decisioni prese da tali sistemi, soprattutto in contesti critici.
  • La Singolarità Tecnologica: Alcuni futuristi ipotizzano che, a un certo punto, l’IA potrebbe raggiungere un livello di intelligenza tale da auto-migliorarsi in modo esponenziale, portando a una “singolarità tecnologica” con conseguenze imprevedibili per l’umanità. Questo scenario, sebbene ancora speculativo, alimenta riflessioni etiche e sociali sulla direzione dello sviluppo dell’IA.
  • Lo Statuto Ontologico delle Entità Artificiali: Man mano che i sistemi di IA diventano più sofisticati, sorgono domande sul loro statuto ontologico. Possono avere diritti? Queste questioni diventano sempre più rilevanti con la crescente autonomia e capacità decisionale delle macchine.

INDICE

Posted on

Intelligenza Artificiale : Problemi Lineari ed Esponenziali

Problemi Lineari ed Esponenziali

Questa distinzione si basa sulla scalabilità degli algoritmi necessari per risolvere un problema al variare della dimensione dell’input (n).

  • Problemi Lineari: Un problema è risolvibile in tempo lineare se esiste un algoritmo la cui complessità temporale è O(n). Il tempo di esecuzione cresce proporzionalmente alla dimensione dell’input. Molte operazioni di base sull’input (come la ricerca di un elemento in un array non ordinato nel caso peggiore o la lettura di tutti gli elementi) rientrano in questa categoria. In IA, algoritmi con complessità lineare sono altamente desiderabili quando si elaborano grandi quantità di dati.

 

  • Problemi Esponenziali: Un problema è risolvibile in tempo esponenziale se l’algoritmo più efficiente conosciuto ha una complessità temporale del tipo O(c alla n) dove c>1 è una costante. Il tempo di esecuzione cresce in modo esponenziale con la dimensione dell’input, rendendo questi problemi intrattabili per input di dimensioni anche moderatamente grandi. Molti problemi NP-completi o NP-hard in IA, come la ricerca della soluzione ottima in spazi di ricerca vastissimi (ad esempio, in alcuni problemi di pianificazione o nel problema del commesso viaggiatore), possono avere algoritmi di risoluzione di complessità esponenziale.

Implicazioni per l’IA:

  • Riconoscere i limiti: È cruciale riconoscere quando un problema che si sta cercando di risolvere in IA è intrinsecamente esponenziale. Tentare di trovare una soluzione esatta per grandi istanze di tali problemi può essere computazionalmente proibitivo.

 

  • Strategie per affrontare la complessità esponenziale: In questi casi, la ricerca in IA spesso si concentra su:

 

    • Algoritmi di approssimazione: Trovare soluzioni che non sono necessariamente ottime ma sono “abbastanza buone” e possono essere calcolate in tempo ragionevole (spesso polinomiale). Trovare soluzioni approssimate con una garanzia di qualità rispetto all’ottimo
    • Euristiche: Sviluppare strategie di ricerca intelligenti che esplorano lo spazio delle soluzioni in modo più efficiente, anche se non garantiscono di trovare la soluzione ottima o di terminare in tempo polinomiale nel caso peggiore.
    • Algoritmi randomizzati: Utilizzare il caso per esplorare lo spazio delle soluzioni e trovare buone soluzioni con alta probabilità. Un algoritmo randomizzato è un algoritmo che, durante la sua esecuzione, prende decisioni basate su scelte casuali. Queste scelte non sono determinate dall’input del problema, ma da una fonte di casualità (come la generazione di numeri pseudo-casuali).Per problemi con spazi di ricerca enormi (spesso esponenziali), esplorare sistematicamente tutte le possibili soluzioni può essere computazionalmente impraticabile. Gli algoritmi randomizzati introducono l’elemento del caso per “saltare” attraverso questo spazio in modo più efficiente, con la speranza di trovare una buona soluzione (anche se non necessariamente l’ottima) in un tempo ragionevole. Trovare buone soluzioni con alta probabilità in tempo ragionevole
    • Tecniche di riduzione della complessità: Cercare di riformulare il problema o di sfruttare specifiche proprietà dell’istanza per ridurre la sua complessità effettiva.

In conclusione, una solida comprensione dei concetti di base dell’algoritmica e dei limiti della computazione è un pilastro fondamentale per lo sviluppo di sistemi di Intelligenza Artificiale efficaci e pratici. Permette ai ricercatori e agli sviluppatori di fare scelte informate sugli algoritmi da utilizzare, di comprendere le sfide computazionali intrinseche di determinati problemi e di sviluppare strategie intelligenti per affrontare la complessità.


INDICE

Posted on

Intelligenza Artificiale : Studio Euristico della Complessità dell’Ordinamento

L’ordinamento

L’ordinamento è un problema fondamentale in informatica e spesso un passo preliminare in molte applicazioni di IA (ad esempio, per organizzare dati prima dell’analisi o per facilitare la ricerca). Sebbene esistano algoritmi di ordinamento efficienti con complessità media e nel caso peggiore di O(nlogn) (come Merge Sort e Heap Sort), lo studio euristico della loro complessità si concentra sull’analisi pratica delle loro prestazioni in scenari specifici e sull’identificazione di ottimizzazioni.

Euristico

In informatica e in generale nella risoluzione di problemi, un approccio euristico (dal greco “heuriskein”, che significa “trovare”, “scoprire”) è una tecnica o una strategia che:

  • Non garantisce di trovare la soluzione ottimale (o la soluzione in assoluto).
  • Mira a trovare una “buona” soluzione in un tempo ragionevole, specialmente per problemi complessi dove trovare la soluzione esatta potrebbe essere computazionalmente proibitivo (ad esempio, problemi con spazi di ricerca esponenziali).
  • Si basa spesso su regole pratiche, intuizioni, “scorciatoie” o stime approssimative per guidare il processo di ricerca della soluzione.
  • È spesso sperimentale e si basa sull’osservazione del comportamento dell’algoritmo su diverse istanze del problema.

Studio Euristico

Quando parliamo di uno “studio euristico della complessità dell’ordinamento”, non ci riferiamo al calcolo formale della complessità asintotica (come per Merge Sort). Invece, ci concentriamo su un’analisi più pratica e sperimentale di come gli algoritmi di ordinamento si comportano in scenari reali. Questo tipo di studio può includere:

  • Analisi Empirica: Lo studio euristico coinvolge spesso l’implementazione e la sperimentazione degli algoritmi di ordinamento su diverse tipologie di input (dati quasi ordinati, dati casuali, dati inversamente ordinati) e la misurazione dei tempi di esecuzione effettivi. Questo approccio può rivelare comportamenti che l’analisi asintotica nel caso peggiore non cattura completamente.
  • Ottimizzazioni Pratiche: L’analisi euristica può portare a identificare ottimizzazioni specifiche per determinati tipi di dati. Ad esempio, per dati quasi ordinati, algoritmi come l’Insertion Sort possono avere prestazioni migliori di algoritmi O(nlogn) per piccole dimensioni dell’input. Algoritmi ibridi, che combinano diverse strategie (come l’uso di Insertion Sort per sottoproblemi piccoli nel Quick Sort), sono spesso sviluppati attraverso uno studio euristico delle loro prestazioni reali.
  • Considerazioni sull’Hardware: Valutare come le caratteristiche specifiche dell’hardware (come la cache della CPU, la parallelizzazione) influenzano le prestazioni degli algoritmi di ordinamento.

Uno studio euristico della complessità dell’ordinamento è un approccio pratico e sperimentale per capire le prestazioni reali degli algoritmi di ordinamento in diverse condizioni. Non si tratta di un calcolo formale di probabilità di eventi, ma piuttosto di un’indagine empirica per scoprire “buone” strategie e ottimizzazioni basate sull’osservazione e sulla sperimentazione. L’obiettivo è ottenere una comprensione più approfondita di come scegliere l’algoritmo di ordinamento più adatto a un particolare contesto applicativo.


Implicazioni per l’IA:

Anche se l’ordinamento di per sé potrebbe non essere l’obiettivo finale in molte applicazioni di IA, la comprensione delle sfide legate all’efficienza degli algoritmi su grandi dataset e l’approccio euristico all’ottimizzazione sono principi trasferibili a problemi più complessi che si incontrano nell’IA.


INDICE

Posted on

Intelligenza Artificiale: Complessità Algoritmica e dei Problemi

L’IA si basa pesantemente su algoritmi per l’elaborazione dei dati, l’apprendimento, la presa di decisione e la risoluzione di problemi complessi.

Complessità Algoritmica e dei Problemi

Complessità Algoritmica:

Si riferisce alla quantità di risorse computazionali (principalmente tempo e spazio di memoria) necessarie per eseguire un algoritmo in funzione della dimensione dell’input. Viene espressa utilizzando la notazione asintotica (O grande) che descrive il comportamento dell’algoritmo al crescere della dimensione dell’input. Un algoritmo con complessità O(n) (lineare) scala meglio rispetto a uno con complessità O(n2) (quadratica) o O(2n) (esponenziale) all’aumentare della quantità di dati. Nell’IA, dove spesso si lavora con enormi dataset (pensiamo al machine learning o all’elaborazione del linguaggio naturale), la scelta di algoritmi con bassa complessità è vitale per garantire tempi di esecuzione ragionevoli.

“scala meglio” (scales better) significa che l’algoritmo mantiene prestazioni ragionevoli (in termini di tempo o spazio) anche quando la dimensione dell’input diventa molto grande.  Un algoritmo che scala meglio vede la sua richiesta di risorse crescere più lentamente all’aumentare dell’input.

La “scalabilità peggiore” è visualizzata da una funzione il cui grafico cresce molto rapidamente sull’asse del tempo di esecuzione (y) all’aumentare della dimensione dell’input sull’asse orizzontale (x).

  • Funzione Lineare (): Il grafico è una linea retta con una pendenza costante. L’angolo di questa retta indica la costante moltiplicativa. Una pendenza maggiore significa che per ogni aumento unitario della dimensione dell’input, il tempo di esecuzione aumenta di una quantità maggiore (ma sempre in modo lineare). Tuttavia, la natura della crescita è lineare.

  • Funzione Quadratica (): Il grafico è una curva. La sua pendenza aumenta man mano che cresce. Questo riflette il fatto che il tasso di crescita del tempo di esecuzione sta accelerando.

Complessità dei Problemi:

Non si riferisce a un algoritmo specifico, ma alla difficoltà intrinseca di risolvere un determinato problema computazionale. Un problema può essere intrinsecamente difficile anche se si utilizza l’algoritmo più efficiente possibile. I problemi vengono classificati in diverse classi di complessità, come P (risolvibili in tempo polinomiale da una macchina di Turing deterministica) e NP (verificabili in tempo polinomiale da una macchina di Turing deterministica).

Tempo Polinomiale: Un problema si dice risolvibile in tempo polinomiale se esiste un algoritmo che può risolverlo e il cui tempo di esecuzione è limitato superiormente da una funzione polinomiale della dimensione dell’input. Quindi, un problema è in tempo polinomiale se esiste un algoritmo per risolverlo tale che il suo tempo di esecuzione nel caso peggiore è per qualche costante (indipendente da ).

Funzione Polinomiale : Una funzione polinomiale è una singola espressione che può contenere più termini (che sono singoli “monomi” o “potenze di con coefficienti”)

Macchina di Turing Deterministica (MTD):È un modello computazionale teorico in cui, dato uno stato e un simbolo letto, la prossima azione è univocamente determinata. È il modello di calcolo di riferimento per definire la classe di complessità P

Molti problemi importanti in IA, come la pianificazione ottima, la soddisfazione di vincoli complessi e alcuni problemi di apprendimento, sono noti per essere NP-completi o NP-hard, il che suggerisce che non si conoscono algoritmi efficienti (in tempo polinomiale) per risolverli in generale.

Risolvere in Tempo Polinomiale (Classe P):

  • Significato: Un problema decisionale (un problema la cui risposta è “sì” o “no”) appartiene alla classe P se esiste un algoritmo eseguito da una Macchina di Turing Deterministica (MTD) che è in grado di trovare la soluzione (cioè, di determinare se la risposta al problema è “sì” o “no”) in un tempo che è limitato superiormente da una funzione polinomiale della dimensione dell’input.

  • Esempio: Considera il problema di determinare se un numero intero è pari. Possiamo scrivere un semplice algoritmo (una MTD) che controlla l’ultima cifra del numero. Il tempo di esecuzione di questo algoritmo è lineare rispetto al numero di cifre (la dimensione dell’input). Quindi, il problema di verificare la parità è in P.

  • Implicazione: Se un problema è in P, significa che possiamo trovare una soluzione efficiente (in termini di tempo, almeno in teoria per grandi input) utilizzando un algoritmo “standard” (deterministico).

Verificare in Tempo Polinomiale (Classe NP):

  • Significato: Un problema decisionale appartiene alla classe NP se, data una potenziale soluzione per un’istanza del problema la cui risposta è “sì”, possiamo verificare (controllare) in tempo polinomiale (usando una MTD) se quella soluzione è effettivamente una soluzione valida.

  • Il Ruolo della soluzione : La chiave qui è la  “soluzione”. Se qualcuno ci fornisce una potenziale soluzione a un problema in NP (per un’istanza la cui risposta è “sì”), possiamo usare un algoritmo deterministico (una MTD) per controllare rapidamente (in tempo polinomiale) se questa soluzione è corretta. Non abbiamo bisogno di trovare la soluzione da soli in tempo polinomiale.

  • Esempio: Considera il problema del commesso viaggiatore (TSP) nella sua versione decisionale: “Dato un insieme di città, le distanze tra loro e un certo valore , esiste un percorso che visita tutte le città esattamente una volta e ha una lunghezza totale minore o uguale a ?”.

    • Verificare: Se qualcuno ci fornisce un percorso specifico (l’ordine in cui visitare le città), possiamo facilmente calcolare la lunghezza totale del percorso e verificare in tempo polinomiale (lineare rispetto al numero di città) se questa lunghezza è minore o uguale a . Questo significa che il TSP (decisionale) è in NP.
    • Risolvere: Trovare il percorso più breve in assoluto sembra essere molto più difficile e tutti gli algoritmi conosciuti nel caso peggiore hanno una complessità super-polinomiale (si congettura che non esista un algoritmo polinomiale per risolverlo). Quindi, anche se possiamo verificare una soluzione velocemente, trovarla è difficile.

 

  • Implicazione: Se un problema è in NP, significa che se qualcuno ci dà la risposta (“sì” e una prova di ciò, il certificato), possiamo facilmente convincerci che la risposta è corretta. Tuttavia, trovare quella risposta e la sua prova da soli potrebbe essere molto difficile.

La Differenza Fondamentale:

  • Classe P: Possiamo trovare la soluzione in modo efficiente (tempo polinomiale).
  • Classe NP: Possiamo verificare se una soluzione proposta è corretta in modo efficiente (tempo polinomiale), ma trovare la soluzione originale potrebbe essere difficile.

Implicazioni per l’IA: La consapevolezza della complessità aiuta i ricercatori e gli sviluppatori di IA a:

  • Scegliere algoritmi scalabili per grandi volumi di dati.
  • Comprendere i limiti teorici di ciò che può essere efficientemente calcolato.
  • Concentrarsi su approcci approssimati o euristici per problemi intrinsecamente difficili.

INDICE

Posted on

How to Deploy ASP.NET Core Web API on IIS Windows Server

(Tested on windows server 2012r2)

Install the .NET Core Hosting Bundle on Windows Server

The .NET Core Hosting bundle is an installer for the .NET Core Runtime and the ASP.NET Core Module. The bundle allows ASP.NET Core apps to run with IIS.

Current version:.NET Core Hosting Bundle installer (direct download)

(for this test we installed version .Net Core 8 on win 2012r2)

Visual Studio : Publish on Folder

After creating the ASP.NET Core application in Visual Studio, we can use the Visual Studio Publish Tool to deploy and run our app. For this project, choose to publish to a folder. Choose the folder and hit “Finish”.

In the next screen, where you see the settings for this deploy, click on “More Actions” and then on “Edit”.

Select :

  • Deployment Mode : Complete
  • Target Runtime : win-x64 (for our server)
  • File Publish Options : Delete all existing files prior to publish (flagged)
  • Database : Default Connection edit (if yuu need it)

Save this configuration, control it an Publish.

Copy the contents of the folder on the IIS server to the folder dedicated to the new site.

IIS and new site

Create the site on IIS. For the Application Pool you have to use default .NET CLR Version : v4.0.

Open your browser and call up the site. You receive the “page not found” error (404).

Remember that a site that hosts only calls web api. To verify that it works you can use the controller that Visual Studio sets by default when creating a site. Then type:

https://www.mynewapisite.com/WeatherForecast

and you will get a result. The site works!


Posted on

Deploy Xamarin Android App to Google Play Store

Xamarin App basic configuration

Visual Studio Configuration to Debug

AndroidManifest.xml

Open in editor xml (using Visual Studio)

android:debuggable=”true”

Project Propreties

  • Set use Fast Deployment (in the image below is not set)
  • Select apk


Visual Studio Configuration to Play store

AndroidManifest.xml

Open in editor xml (using Visual Studio)

android:debuggable=”false”

Project Propreties

  • Remove use Fast Deployment
  • Select bundle

Posted on

Mecdata – Sviluppo siti web

MECDATA è un’azienda italiana che offre una vasta gamma di servizi IT, tra cui lo sviluppo e la progettazione di siti Web. Un team di sviluppatori web esperti che possono creare siti Web personalizzati che soddisfano le esigenze specifiche dei loro clienti. I servizi di sviluppo siti web di MECDATA includono:

  • Progettazione e sviluppo di siti Web: MECDATA può progettare e sviluppare un sito Web da zero oppure può collaborare con te per riprogettare un sito Web esistente.
  • Soluzioni e-commerce: MECDATA può realizzare un sito e-commerce che ti permette di vendere online i tuoi prodotti o servizi.
  • Sistemi di gestione dei contenuti (CMS): MECDATA può installare e configurare un CMS per il tuo sito web, che ti consentirà di gestire facilmente i contenuti del tuo sito web.
  • Ottimizzazione per i motori di ricerca (SEO): MECDATA può aiutarti a ottimizzare il tuo sito web per i motori di ricerca, in modo che abbia maggiori probabilità di essere trovato dai potenziali clienti.
  • Manutenzione del sito web: MECDATA può fornire una manutenzione continua al tuo sito web, in modo che sia sempre aggiornato e sicuro.

I servizi di sviluppo di siti Web di MECDATA sono convenienti e affidabili e vantano una solida esperienza di successo. Ci impegnano a fornire ai nostri clienti siti Web di alta qualità che soddisfino le loro esigenze specifiche.

Se stai cercando un’azienda per sviluppare il tuo sito web, MECDATA è un’ottima opzione. Abbiamo l’esperienza e la competenza per creare un sito Web che ti aiuterà a raggiungere i tuoi obiettivi aziendali.

Ecco alcuni dei motivi per cui dovresti scegliere MECDATA per sviluppare il tuo sito web:

Esperienza: MECDATA dispone di un team di sviluppatori web esperti che hanno una comprovata esperienza di successo.

Competenza: MECDATA ha esperienza in tutti gli aspetti dello sviluppo di siti web, dalla progettazione e sviluppo al SEO e alla manutenzione.

Conveniente: i servizi di sviluppo di siti Web di MECDATA sono convenienti e competitivi.

Affidabilità: MECDATA è un’azienda affidabile che si impegna a fornire ai propri clienti siti Web di alta qualità.

Contatta MECDATA oggi per ottenere un preventivo gratuito per il tuo progetto di sviluppo del sito web.


Articolo scritto da Bard il 21/11/2023
Posted on

Retrieve resources in c# Windows Forms .Net Application

Scenario

You have a library (dll) with one or more image and you want to use those image in your application.

Load Resource from application

Consider having a library called : myLibrary.dll with some class inside with Namespace mylibrary.

In your bapplication you can get to the resources by referencing the assembly :

Assembly assem = Assembly.LoadFrom("myLibrary.dll");

You can enumerate the resource files

string[] resNames = assem.GetManifestResourceNames();
if (resNames.Length == 0)
Console.WriteLine(" No resources found.");

foreach (var resName in resNames)
Console.WriteLine(" Resource 1: {0}", resName.Replace(".resources", ""));
foreach (var resName in resNames)
Console.WriteLine(" Resource 2: {0}", resName);

And this will be the output :

Resource 1: myLibrary.Properties.Resources
Resource 2: myLibrary.Properties.Resources.resources

The replace is necessary because the real resource name is the first one (without .resources)

Now, If you have an image called myBitmap.png in your resources, you can load it, using ResourceManager

ResourceManager rm = new ResourceManager("myLibrary.Properties.Resources",
assem);

and finally

Object myres = rm.GetObject(myBitmap);

Load Resource inside Library

To get resource from a class inside your resource library, defined a new class, for example myClass and reference own assembly :

rm = new ResourceManager("myLibrary.Properties.Resources",
typeof(myClass).Assembly);

At this point you can withdraw the resource as seen above.