Come determinare in modo efficace se una determinata scala è valida?


28

Nel mio locale club di squash, c'è una scala che funziona come segue.

  1. All'inizio della stagione costruiamo un tavolo con il nome di ciascun membro del club su una riga separata.
  2. Scriviamo quindi il numero di partite vinte e il numero di partite giocate accanto a ciascun nome (nella forma: vittorie / partite del giocatore).

Quindi all'inizio della stagione la tabella si presenta così:

Carol 0/0
Billy 0/0
Alice 0/0
Daffyd 0/0

Ogni due giocatori possono giocare una partita, con un giocatore vincente. Se vince il giocatore più vicino alla parte inferiore del tavolo, viene cambiata la posizione dei giocatori. Ripetiamo quindi il passaggio 2., aggiornando il numero di vittorie e partite accanto a ciascun giocatore. Ad esempio, se Alice batte Billy, lo abbiamo

Carol 0/0
Alice 1/1
Billy 0/1
Daffyd 0/0

Queste partite continuano per tutta la stagione e alla fine portano i giocatori a essere elencati in ordine di forza approssimativo.

Sfortunatamente, l'aggiornamento avviene in modo piuttosto casuale, quindi vengono fatti degli errori. Di seguito sono riportati alcuni esempi di tabelle non valide, ovvero tabelle che non sono state prodotte seguendo correttamente i passaggi precedenti per alcuni ordini di partenza (abbiamo dimenticato l'ordine che abbiamo usato all'inizio della stagione) e la sequenza di partite e risultati:

Alice 0/1
Billy 1/1
Carol 0/1
Daffyd 0/0

Alice 2/3
Billy 0/1
Carol 0/0
Daffyd 0/0

Alice 1/1
Billy 0/2
Carol 2/2
Daffyd 0/1

Data una tabella, come possiamo determinare in modo efficiente se è valido? Potremmo iniziare osservando quanto segue:

  1. L'ordine dei nomi non ha importanza, poiché abbiamo dimenticato l'ordine di partenza originale.

  2. Il numero totale di vittorie dovrebbe essere la metà della somma del numero di partite giocate. (Questo mostra che il primo esempio sopra non è valido.)

  3. Supponiamo che la tabella sia valida. Poi c'è una multigrafo - un grafico che ammette più fronti ma nessun loop - con ogni vertice corrispondente a un giocatore e ogni bordo di una partita giocata. Quindi il numero totale di partite giocate da ciascun giocatore corrisponde al grado del vertice del giocatore nella multigrafia. Quindi, se non c'è multigrafo con i gradi di vertice appropriati, la tabella deve essere non valida. Ad esempio, non esiste una multigrafo con un vertice di grado uno e uno di grado tre, quindi il secondo esempio non è valido. [Siamo in grado di verificare efficacemente l'esistenza di tale multigraph.]

Quindi abbiamo due controlli che possiamo applicare per iniziare, ma ciò consente comunque tabelle non valide, come il terzo esempio. Per vedere che questa tabella non è valida, possiamo lavorare all'indietro, esaurendo tutti i possibili modi in cui la tabella potrebbe essere sorta.

Mi chiedevo se qualcuno potesse pensare a un algoritmo polinomiale (nel numero di giocatori e nel numero di giochi) che risolve questo problema decisionale?


2
Forse esiste un teorema di tipo Havel Hakimi per le multigrafi dirette ...
Aryabhata,

Perché il terzo esempio non può essere possibile? E se Alice avesse vinto su Bob, Carol avesse vinto su Bob e Carol avesse vinto su Daffyd. Quindi Alice ha vinto 1 partite su 1, Bob ha vinto 0 partite su 2, Carol ha vinto 2 partite su 2 e Daffyd ha vinto 0 partite su 1?
utdiscant,

utdiscant: dopo ogni partita, se vince il giocatore più basso, i giocatori vengono scambiati. Per mostrare che il terzo esempio è possibile, dovresti dare una configurazione iniziale e una sequenza di giochi - cioè, con un ordine - risultante nella tabella data.
Ben

aryabhata: Grazie - sì, sarebbe un passo utile. Sfortunatamente, sembra piuttosto difficile ...
Ben

1
un suggerimento per studiare / risolvere questo. specificarlo come problema SAT. quindi prova molti casi casuali. vedere se ce ne sono di più per un risolutore standard. in caso contrario, forse è un sottoinsieme vincolato in P.
vzn,

Risposte:


1

Questa non è una risposta completa. Fornisco una dichiarazione più semplice del problema e alcune osservazioni.

[n]

vulabel(v)<label(u)

Gne

NPG

Osservazione

label(v)vv

Penso che dovrebbe essere possibile combinare questa osservazione con Havel-Hakimi per dare un algoritmo temporale polinomiale.


Ciao. Grazie. Ti dispiacerebbe dichiarare di nuovo la tua osservazione formulata nel contesto delle scale? Penso che ci sia un controesempio per un grafico di ordine 3, ma forse ho letto male.
Ben

@Ben, penso che sarebbe il seguente: puoi presumere che l'ultima persona sulla scala abbia giocato tutte le partite che ha vinto all'inizio del torneo e ha giocato tutte le partite perse alla fine del torneo . Fammi sapere se c'è un contro-esempio in questo, non ho controllato attentamente.
Kaveh,

Sfortunatamente, ci sono scale come questa: A 2/2 B 0/1 C 0/1
Ben

@Ben, penso che l'esempio sia coerente con quello che ho scritto, cioè non è un contro-esempio all'osservazione.
Kaveh,

La scala è valida. Supponiamo che l'ultima partita giocata sia stata una perdita per C. Quindi prima dell'ultima partita, la scala doveva essere così: C 0/0 B 0/1 A 1/1, ma questa scala non è valida. Quindi, non possiamo supporre che l'ultima partita sia stata una perdita per C.
Ben

0

Non ho risolto il problema, ma ho risultati parziali, le cui dichiarazioni sono riportate di seguito. Scriverò le prove se qualcuno è interessato.

Proposta . Supponiamo che la scala (1) contenga più di un giocatore (2) contenga un numero uguale di vittorie e perdite; e (3) è tale che ogni giocatore ha vinto almeno una partita e perso almeno una partita. Quindi la scala è valida.

WiiLiiRi

Li=0

Wik:Rk>Ri,Wk>0(Lk1)++k:Rk<RiLk,
LiWi=0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.