Assegna sottoinsieme con somma tra due valori

4

Ho un set S di size n i cui membri hanno associato a loro un numero nell'intervallo 0.00 a 1.00 inclusive.

Voglio selezionare un sottoinsieme T di size m con questa proprietà:

  • la media dei numeri associati ai membri di T deve essere compresa nell'intervallo specificato da x a y (ad esempio 0.65 a 0.75 ). Espressa in modo diverso: la somma dei numeri associati ai membri di T deve rientrare in un intervallo specificato (ad esempio, 0.65m su 0.75m )

Inoltre, tra tutti i possibili T s per un dato S , x , y , voglio sceglierne uno (uniformemente) a caso.

Il mio metodo attuale consiste nel selezionare casualmente m membri di S , quindi verificare se la somma rientra nell'intervallo desiderato. Ripeto finché non ottengo un risultato soddisfacente. Esiste un algoritmo (possibilmente programmazione dinamica?) Per ottenere il sottoinsieme desiderato senza usare guess e check?

Esempio:

S è un insieme di domande n = 200 , a ognuna assegnata una valutazione di difficoltà tra 0 e 1 inclusive. Voglio generare un test T con m = 50 domande dove la difficoltà media è tra 0.65 e 0.75 inclusive. Inoltre voglio selezionare un (uniformemente) casuale T , tra tutti i possibili T che soddisfano le mie condizioni.

Un altro esempio:

S = {0.1, 0.3, 0.5, 0.8, 1.0}
n = 5
m = 3
x = 0.5
y = 0.75

All possible T and their average value
{0.1, 0.3, 0.5} = 0.8 / 3 = 0.26
{0.1, 0.3, 0.8} = 1.2 / 3 = 0.40
{0.1, 0.3, 1.0} = 1.4 / 3 = 0.46
{0.1, 0.5, 0.8} = 1.4 / 3 = 0.46
{0.1, 0.5, 1.0} = 1.6 / 3 = 0.53
{0.1, 0.8, 1.0} = 1.9 / 3 = 0.63
{0.3, 0.5, 0.8} = 1.6 / 3 = 0.53
{0.3, 0.5, 1.0} = 1.8 / 3 = 0.60
{0.3, 0.8, 1.0} = 2.1 / 3 = 0.70
{0.5, 0.8, 1.0} = 2.3 / 3 = 0.76

Subsets of S with size m with average values between x and y
{0.1, 0.5, 1.0}
{0.1, 0.8, 1.0}
{0.3, 0.5, 0.8}
{0.3, 0.5, 1.0}
{0.3, 0.8, 1.0}

Sto cercando di trovare un algoritmo per produrre uno di questi 5 sottoinsiemi a caso, senza prima calcolare ogni sottoinsieme di S con dimensione m. Sembra che l'ipotesi e il controllo siano il metodo migliore.

    
posta Preston S 30.09.2014 - 00:55
fonte

1 risposta

2

Non penso sia possibile costruire in modo deterministico un insieme casuale in "one-go", qualunque cosa significhi esattamente. Comunque qui è quello che penso sia l'alternativa più vicina:

Inizia con N numeri casuali. Se la tua media non è soddisfacente, rimuovi un numero a caso e sostituiscilo con uno più piccolo / più grande. Per trovare rapidamente i numeri da rimuovere e i loro sostituti potresti dividere sia i tuoi set di input che di output in due (numeri al di sotto della media ricercata rispetto ai numeri sopra la media desiderata), oppure puoi ordinare il set di input e usare le ricerche binarie.

Un'idea alternativa ma simile è iniziare con un set vuoto e aggiungere numeri "piccoli" o "grandi" a seconda della media attuale. Tuttavia potresti ritrovarti con un set non valido alla fine e dovresti ricorrere al metodo n. 1, quindi penso che sia più elegante usare solo il n. 1.

Infine, per quanto riguarda i valori ridondanti, suggerisco di utilizzare una fase di pre-elaborazione: ordina il set di input, quindi esegui la scansione per trovare elementi ridondanti e selezionarne a caso uno.

Riscritto per chiarire le cose.

    
risposta data 30.09.2014 - 16:35
fonte

Leggi altre domande sui tag