Come trovare la migliore corrispondenza (set di opzioni) tra diversi set di opzioni?

-1

Immagina una dozzina di servizi (serie di opzioni), ognuna delle quali contiene un sottoinsieme di tutte le opzioni disponibili. Voglio creare un modulo web che elenca tutte le opzioni possibili in modo che gli utenti possano selezionare le caselle per le opzioni che desiderano, quindi, dopo che il modulo è stato inviato, restituire un rapporto che elenca i servizi dalla migliore corrispondenza alla peggiore.

Ad esempio, prendi in considerazione tutti i diversi servizi TV disponibili: via cavo, via satellite, streaming ... come posso configurare una pagina che consenta a un utente di dire "su 350 canali, questi sono il 10/20/35 che effettivamente guardo "(controlla le caselle di controllo, invia il modulo, interroga il database ...) quindi restituisci un elenco di servizi che coprono al meglio i requisiti specificati in 10/20/35.

Sto avendo problemi a sistemare il mio cervello intorno al modo migliore per fare questo ... come sarebbero strutturati i dati / le tabelle, quale sarebbe la query, ecc. Se qualcuno potrebbe dare qualche suggerimento su come meglio avvicinati a questo, apprezzerei molto l'aiuto.

    
posta QuantiumTech 28.08.2018 - 16:07
fonte

1 risposta

0

Per questo tipo di cose devi decidere cosa significa "meglio". Una volta fatto, il resto andrà a posto.

Quindi con il tuo esempio TV, presumibilmente ogni pacchetto offre un set di canali e vuoi la combinazione più economica di pacchetti che include tutti i canali selezionati.

Semplice abbastanza, fai una ricerca ad albero ricorsiva di tutti i pacchetti, rimuovendo i canali dalla selezione e sommando il prezzo man mano che procedi. Ordina per prezzo totale e il primo è la tua risposta!

Tuttavia, cosa succede se esiste un pacchetto davvero economico che offre tutti i canali tranne uno, ma quel canale non è disponibile da solo su altri pacchetti.

Una persona reale potrebbe desiderare di vederla in cima alla lista, anche se si perderebbe uno dei suoi essenziali canali.

È questo genere di cose a cui devi pensare e schiarirti le idee. Una volta che sei chiaro, puoi assegnare dei punti bonus a questi scenari e ordinarli di conseguenza

Ecco un algoritmo di esempio. Potresti farlo più veloce in sql, ma non sarebbe scalabile.

public List<List<Package>> BestMatch(
    IEnumerable<string> remainingChannels, 
    IEnumerable<Package> remainingPackages,
    IEnumerable<Package> results
    )
{
    var new_result = new List<List<Package>>();
    var rp = remainingPackages.Where(i => i.channels.Any(j => remainingChannels.Contains(j)));
    if(!rp.Any())
    {
        new_result.Add(results.ToList());
        return new_result;
    }

    foreach (var p in rp)
    {
        var rc = remainingChannels.Where(i => !p.channels.Contains(i));
        var new_rp = rp.Where(i => i != p);
        var r2 = new List<Package>();
        r2.AddRange(results);
        r2.Add(p);
        new_result.AddRange(BestMatch(rc, new_rp, r2));
    }

    return new_result;
}
    
risposta data 28.08.2018 - 16:24
fonte

Leggi altre domande sui tag