Determinazione dell'esaurimento delle risorse in anticipo

1

Immagino che questa sia una domanda per la soluzione dei problemi, ma sono fuori di idee, non so davvero dove posso trovare aiuto, e ho bisogno di risolvere questo problema.

Essenzialmente abbiamo una serie di consumatori e un insieme di risorse e l'obiettivo è assegnare una risorsa a ciascun consumatore. Non tutte le risorse sono idonee per ogni consumatore: ci sono molti diversi tipi di regole che limitano le scelte.

Dati questi consumatori e risorse:

consumers = [C1, C2, C3, C4, C5]
resources = [R1, R2, R3, R4, R5, R6, R7, R8]

Possiamo rappresentare le risorse idonee con una tabella (si noti che in questo esempio il raggruppamento in sezioni di risorse può suggerire una soluzione, in pratica le risorse idonee sarebbero più disperse e il raggruppamento sarebbe difficile o impossibile):

    C1    C2    C3    C4    C5
R1  x     x     x     x
R2  x     x     x     x
R3                    x     x
R4                    x     x
R5                    x     x
R6                    x     x
R7                    x     x
R8                    x     x

Proviamo ad assegnare una risorsa a ogni consumatore:

while unsatisfied_consumers:
    unassigned_resources = list(resources)
    unsatisfied_consumers = list(consumers)

    for c in unsatisfied_consumers:
        for r in eligible_resources[c]:
            if c.assign(r):
                unsatisfied_consumers.remove(c)
                unassigned_resources.remove(r)
                break

Se non tutti i consumatori potrebbero essere soddisfatti, per ognuno di essi proviamo a trovare risorse già assegnate idonee e al destinatario assegnato viene invece assegnata una risorsa non assegnata (se idonea). Essenzialmente una riassegnazione. Questo sarebbe giusto dopo il ciclo for :

for c in unsatisfied_consumers:
   assigned_resources = [r for r in resources if r not in unassigned_resources]
   c_eligible_resources = [r for r in eligible_resources[c] if r in assigned_resources]

   for r in c_eligible_resources:
       satisfied_consumer = r.assigned_consumer()
       # try to find an alternative resrouce for the already satisfied consumer
       # so that c can be assigned its resource instead
       for unassigned_r in unassigned_resources:
           if satisfied_consumer.assign(unassigned_r):
               unassigned_resrouces.remove(unassigned_r)
               unsatisfied_consumers.remove(c)
               c.resource = r

Come puoi vedere, siamo noiosi a forzare il nostro modo di trovare la soluzione.

Il problema è quando non tutti i consumatori possono essere soddisfatti, semplicemente a causa dell'idoneità delle risorse. Indipendentemente dal numero di tentativi di riassegnazione delle risorse, ad alcuni utenti non verranno mai assegnate risorse perché non ci sono abbastanza risorse.

E c'è dove sto cercando di ottenere. Sto cercando di escogitare un modo per essere in grado di dire quali sono i consumatori esposti all'esaurimento delle risorse prima ancora di iniziare ad assegnare risorse, in modo che quando si manifestano problemi di insoddisfazione, possiamo tranquillamente assumere il loro stato e andare avanti con i consumatori che possono effettivamente essere risorse assegnate.

Usando il mio esempio di tabella, a prima vista possiamo dire che i consumatori C1 , C2 e C3 rivaleggiano per le risorse R1 e R2 , quindi uno di questi consumatori sarà semplicemente insoddisfatto. Quello che sto cercando di fare è progettare un meccanismo per riconoscere che [C1, C2, C3] è soggetto all'esaurimento delle risorse quindi se si verifica un assegnamento fallito, non dovremmo provare di nuovo per questi particolari consumatori.

Sappiamo quali risorse sono elliglbe per ogni consumatore, e inversamente sappiamo quali sono i consumatori "adatti" a ciascuna risorsa. Forse questa informazione potrebbe essere utilizzata nella soluzione?

    
posta dabadaba 27.02.2018 - 13:00
fonte

2 risposte

1

In generale, questo sembra un problema NP-completo. Ciò significa che un approccio a forza bruta è essenzialmente la soluzione ottimale (che conosciamo) se la tabella di compatibilità può avere qualsiasi valore.

In pratica, potrebbe contenere regolarità che è possibile sfruttare. Se la situazione reale è simile ai dati di esempio che hai fornito, allora hai solo due diversi tipi di risorse da distribuire e tre tipi di clienti da rivendicare.

Ciò significa che invece di tracciare ogni singolo incarico, conta semplicemente quanti dei clienti di classe-A saranno soddisfatti e quanti delle risorse di tipo X sarà assegnato. Una volta deciso, puoi concretizzare la soluzione scegliendo casualmente N dai clienti della classe M-A che verranno serviti, ecc.

Ciò non rende il problema più fattibile in generale, ma riduce il numero concreto di casi da calcolare. In casi particolari questo potrebbe costituire la differenza tra "senza speranza" e "costoso". (In caso contrario, dovrai rinunciare a trovare una soluzione ottimale e guardare invece all'intero mondo degli algoritmi euristici per trovare uno approssimativo .)

    
risposta data 27.02.2018 - 13:08
fonte
0

Potrei mancare qualcosa ma sembrerebbe aver senso assegnare la risorsa più popolare al cliente con il minor numero di risorse idonee e continuare in questo modo fino a quando non sarà possibile effettuare ulteriori assegnazioni.

Se si desidera tenere conto delle allocazioni esistenti, in cui i punteggi erano uguali, è sufficiente selezionare le allocazioni di risorse già assegnate.

Se potessi fornire alcuni set di dati specifici, sarebbe più semplice, ma apprezzo che ciò potrebbe non essere possibile.

    
risposta data 27.02.2018 - 14:55
fonte

Leggi altre domande sui tag