Newsgroup: it.hobby.enigmi
Titolo: (MA) Sul "duello matto", proposta indecente.

(Ci si ricollega al post dei gg scorsi "Il duello matto").
Io sinceramente devo trovare il coraggio e la faccia tosta, ma provo a
chiederlo:
Se qualcuno di coloro che sono in grado di farlo, potesse elaborare un
programmino che simuli il "quadriello", ossia che simuli la situazione
col rispetto delle percentuali e delle condizioni e dia ogni volta un
vincitore  (o una situazione finale), il sottoscritto gli inviera'
sicuramente un regalino in segno di gratitudine.
Magari un programma in cui dando via via nuove percentuali e nuove
regole di tiro ad ogni personaggio fornisca infine le probabilita' di
sopravvivenza o comunque le si possa ricavare da un gran numero di
casi simulati. Insomma abbiate pieta', col linguaggio matematico ci ho
litigato da piccolo, ma spero si sia capito :-)
ciao
fulvio

 programmino che simuli il "quadriello"....
PS- A ben pensarci credo che con qualche idea da apportare (e
vestendolo di grafica) ne potrebbe anche scaturire un giochino per PC
divertente... Naturalmente non ho la piu' pallida idea della
complessita' della faccenda, per cui mi dichiaro fin da ora incapace
di intendere!
:-)
riciao
fulvio

 divertente... 
.
.
.qualcosa di simile ai 'crobots'...?
;-)
CiaO,
Massimo

 .qualcosa di simile ai 'crobots'...?
Azz, non li conosco, mi informo poi ti dico :-)
fulvio

 ha scritto nel messaggio
news:b5me0v$ui8$1...@newsreader.mailgate.org...

Non proprio (se ho ben capito cosa sono); io pensavo ad una sfida in
cui volta per volta il programma (o anche il giocatore) stabilisce le
regole di ciascun pistolero e tu invece puoi decidere da solo a chi
sparare o meno (insomma ti cali in un personaggio e fai le scelte per
lui). Poi in base alle probabilita' effettive (che il programma
dovrebbe calcolare un po' piu' agevolmente di noialtri) il duello si
svolge, magari al termine ti dice pure la migliore strategia.... boh
insomma qualcosa del genere, ma suppongo sia piuttosto complicato (e
forse pure inutile :-)
ciao
fulvio

 elaborare un programmino che simuli il "quadriello"
Ho scritto un programmino in visual basic per simulare il quadriello.
Era pensato per uso interno, ma voglio essere magnanimo ;)
Per non stare a trafficare con pacchetti di installazione, file
allegati nella casella comune, ho pensato di adattarlo a vba per
excell. Chi non ha Excell (con regolare licenza, si capisce)?
Il codice lo allego sotto.
Per farlo funzionare bisogna incollarlo su un modulo. Si fà così:
* Strumenti->Macro->Editor_di_Visual_Basic (Alt+F11)
* Inserisci->Modulo
* Modifica->Incolla (Ctrl+V)
* File->Chiudi_e_torna_a_Excell (Ctr+Q)
Per lanciare la macro conviene associare una combinazioni di tasti:
* Strumenti->Macro->Macro... (Alt+F8)
* Opzioni...
* Scelta rapida CTRL+q (quadriello, o la lettera che preferite)
* OK
Nella cella G1 dovete metterci il numero di iterazioni che volete, se
ci mettete 1 vi fa anche vedere lo svolgimento del quadriello.
In E1,E2,E3,E4 ci mette i totali dei duelli vinti da M,J,B,V. Se
volete vedere le percentuali arrangiatevi! Qualcosa dovete pur fare ;)
E dov'è codificata la strategia di Mike? Nella funzione strategia!
Credo di aver seguito i consigli emersi nei post del thread, ma sembra
proprio che partendo senza sparare a nessuno (istruzione "strategia =
nessuno") mike abbia maggiori possibilità di farcela.
Fatemi sapere se funziona!
Ciao, Silv:o)
----8<-------------------------------
Private Const mike As Integer = 0
Private Const joe As Integer = 1
Private Const bob As Integer = 2
Private Const valdez As Integer = 3
Private Const nessuno = 4
Private nomi
Private morto(4) As Boolean
Private vivi As Integer
Private ultimo As Integer
Private turno As Integer
Private n As Long
Private Sub spara(pistolero As Integer)
  Dim bersaglio As Integer
  Select Case pistolero
   Case mike
    bersaglio = strategia
    If bersaglio < 4 Then
      If Rnd() < 2 / 5 Then
        colpisci pistolero, bersaglio, "COLPITO"
      Else
        colpisci pistolero, bersaglio, "MANCATO"
      End If
      ultimo = mike
    Else
      colpisci pistolero, bersaglio, ""
    End If
   Case bob
    bersaglio = ultimo
    If Rnd() < 0.8 Then
      colpisci pistolero, bersaglio, "COLPITO"
    Else
      colpisci pistolero, bersaglio, "MANCATO"
    End If
    ultimo = bob
   Case valdez
    If Not morto(joe) Then
      bersaglio = joe
    Else
      If Not morto(bob) Then
        bersaglio = bob
      Else
        bersaglio = mike
      End If
    End If
    If Rnd() < 0.5 Then
      colpisci pistolero, bersaglio, "COLPITO"
    Else
      colpisci pistolero, bersaglio, "MANCATO"
    End If
    ultimo = valdez
   Case joe
    bersaglio = Int(Rnd() * 3)
    If bersaglio > 0 Then bersaglio = bersaglio + 1
    If morto(bersaglio) Then
      colpisci pistolero, bersaglio, "GIA' MORTO"
    Else
      colpisci pistolero, bersaglio, "COLPITO"
    End If
    ultimo = joe
  End Select
End Sub
Private Function strategia()
  If vivi = 4 Then
    strategia = nessuno
  End If
  If vivi = 3 Then
    If morto(joe) Then strategia = nessuno
    If morto(bob) Then strategia = valdez
    If morto(valdez) Then strategia = bob
  End If
  If vivi = 2 Then
    If Not (morto(joe)) Then strategia = joe
    If Not (morto(bob)) Then strategia = bob
    If Not (morto(valdez)) Then strategia = valdez
  End If
End Function
Private Sub colpisci(p As Integer, b As Integer, e As String)
  If n = 1 Then
    Cells(turno, 1).Value = nomi(p)
    Cells(turno, 2).Value = nomi(b)
    Cells(turno, 3).Value = e
  End If
  If e = "COLPITO" Then
    vivi = vivi - 1
    morto(b) = True
  End If
End Sub
Public Sub quadriello()
 Dim t As Integer
 Dim mm As Integer
 Dim jj As Integer
 Dim bb As Integer
 Dim vv As Integer
  nomi = Array("MIKE", "JOE", "BOB", "VALDEZ", "NESSUNO")
  Range("A1:D30").Clear
  n = Cells(1, 7).Value '00
  For i = 1 To n
    vivi = 4
    turno = 1
    t = 0
    ultimo = 4
    Erase morto
    Do
      If Not (morto(t)) Then
        spara t
        turno = turno + 1
      End If
      t = (t + 1) Mod 4
    Loop Until vivi = 1
    If Not (morto(mike)) Then mm = mm + 1
    If Not (morto(joe)) Then jj = jj + 1
    If Not (morto(bob)) Then bb = bb + 1
    If Not (morto(valdez)) Then vv = vv + 1
  Next i
  Cells(1, 5) = Cells(1, 5) + mm
  Cells(2, 5) = Cells(2, 5) + jj
  Cells(3, 5) = Cells(3, 5) + bb
  Cells(4, 5) = Cells(4, 5) + vv
End Sub
----8<-------------------------------

 ha scritto nel messaggio
news:b67sat$2agqu$1...@ID-49224.news.dfncis.de...
Chi non ha Excell (con regolare licenza, si capisce)?
Ehm ... io  (qual e' la faccina che uno arrossisce di vergogna?)
Comunque , vedo di procurarmelo (sempre con regolarissima licenza!),
aspetto i giudizi del NG, ma sicuramente ti ringrazio un sacco per
aver preso l' idea in considerazione!
ciao
fulvio

volete vedere le percentuali arrangiatevi! Qualcosa dovete pur fare ;)
Gira benissimo ed e` anche abbastanza veloce non ostante il vb.
Purtroppo il codice mi ci vuole un po' per seguirlo perche' quel
disastro appunto di vb lo conosco appena.
Ma c'e` qcs che non ho capito o che non va.. M non dovrebbe vincere
passando.
Se vuoi ti mando il file ii formato gnumeric se hai Linux, o lo
esporto a .xls. Le percentuali molto difficilmente son sbagliate
e si vede il calcolo chiarissimo.
-- 
Ciao,		| Attenzione! campo "Reply-To:" alterato ;^)
Remigio Zedda	| E-mail: 
remi...@tiscali.it
	-- Linux 2.4.18 su Debian GNU/Linux 3.0 "Woody"

 Ciao, Silv:o)
Ho modificato il programma in modo che i quattro casi in cui si divide la
strategia di Mike (cioè il comportamento nei casi: MJBV MJB MJV MBV) siano
analizzati in tutte e 108 le possibili combinazioni.
Se volete ve lo posto, dopo aver inserito qualche commento e reso più
comprensibile il codice.
Viene fuori che la miglior strategia è quella di sparare a B, inizialmente,
mentre dopo che sono rimasti in tre la strategia non è costante ogni volta,
segno che le prob. variano di poco e la simulazione non è abbastanza
sensibile (ho fatto la media su 10000 prove, per non metterci troppo tempo,
ma potrei farne di più, ci guarderò...)
Ho anche cambiato la strategia di Bob per evitare il problema in cui Bob si
spara da solo, avendo sparato per ultimo al giro prima.
Ciao
Andrea

comprensibile il codice.
Io ti direi di si`, meglio che spedirlo per email, cosi` si puo`
confrontare col proprio (io ho fatto un foglio in Gnumeric+o-=Excel).


 Fatemi sapere se funziona!
Complimenti! Il codice gira alla perfezione e si presta benissimo
alla risoluzione del "quadriello", nel caso in cui Bob spara sempre
contro l'ultimo che ha sparato fra quelli rimasti in vita e nella
ipotesi di quadriello "all'ultimo sangue".
Interessante il tuo modo di programmare, quasi ineccepibile!
Le probabilità di sopravvivenza di Mike, a seconda della sua
strategia iniziale, sono riportate qui nel seguito:
    SCENARIO               PROB. DI SOPRAVV. (%)
 1  M non spara...........................31.1
 2  M spara J...............................22.8
 3  M spara B..............................34.1<<<<<<<<<
 4  M spara V..............................33.5
già in precedenza ben calcolate da Maurizio Fregeni!
A lui va quindi il merito di aver individuato correttamente
la soluzione con tanto di rigore matematico.
La migliore strategia che Mike possa adottare consiste,
pertanto, nello sparare Bob al primo turno o fintanto che
siano rimasti vivi in quattro.
Fulvio, ora tocca a te! Ci avevi promesso una variante
ancora più divertente ;-)
Ciao a tutti
Antonio

 ancora più divertente ;-)
Ah beh... Davvero?  Ok se la faccenda piace ho un' ideuzza.... Vediamo
se faccio abbastanza presto a studiarci su un po'
ciao
fulvio

 già in precedenza ben calcolate da Maurizio Frigeni!
Be', vuol dire che non avevo sbagliato i calcoli... Mi sembra giusto
allora riportare i valori esatti:
     SCENARIO                    PROB. DI SOPRAVVIVENZA
  1  M non spara........................... 23299/74844
  2  M spara J.............................  4069/17820
  3  M spara B............................. 25525/74844
  4  M spara V.............................  8353/24948
Maurizio

4  M spara V.............................  8353/24948
Potresti farmi avere i calcoli?
Bastano quelli del solo caso B, voglio confrontarli
coi miei che vengono diversi. TIA:-)


 Potresti farmi avere i calcoli?
La strada è quella indicata da Andrea; indico con p[x,y,...] la
probabilità che ha M di restare in vita quando sono rimasti in gioco x,
y, ... che sparano in quest'ordine. Si parte dal caso di due soli
duellanti rimasti, su cui non ci sono dubbi:
p[m, j] = 2/3;  p[j, m] = 4/9;
p[m, b] = 5/11; p[b, m] = 1/11;
p[m, v] = 4/7;  p[v, m] = 2/7.
Passiamo ad analizzare i casi con tre duellanti, partendo dal caso j, b,
m; nel caso in cui m spara a b si ha il sistema:
p[j, b, m] == 1/3 p[b, m, j] + 1/3 p[m, j]
p[b, m, j] == 4/5 p[m, b]    + 1/5 p[m, j, b]
p[m, j, b] == 2/5 p[j, m]    + 3/5 p[j, b, m]
che risolto dà (ho fatto fare i calcoli a Mathematica):
p[b, m, j] = 527/1188, 
p[j, b, m] = 1319/3564 
p[m, j, b] = 475/1188.
Se m spara a j si ha invece il sistema:
p[j, b, m] == 1/3 p[b, m, j] + 1/3 p[m, j]
p[b, m, j] == 4/5 p[m, b]    + 1/5 p[m, j, b]
p[m, j, b] == 2/5 p[b, m]    + 3/5 p[j, b, m]
che risolto dà:
p[b, m, j] = 41/99
p[j, b, m] = 107/297
p[m, j, b] = 25/99.
Infine, se m passa si ha il sistema:
p[j, b, m] == 1/3 p[b, m, j] + 1/3 p[m, j]
p[b, m, j] == 4/5 p[m, b]    + 1/5 p[m, j, b]
p[m, j, b] == p[j, b, m]
che risolto dà:
p[b, m, j] = 101/231
p[j, b, m] = 85/231
p[m, j, b] = 85/231.
La probabilità p[m, j, b] è maggiore nel caso in cui m spara a b, quindi
questa sarà la sua strategia.
Passiamo ora a considerare il caso j, v, m; in questo caso risulta che a
m conviene sparare a v (ti risparmio gli altri casi). Il sistema è:
p[j, v, m] == 1/3 p[v, m, j] + 1/3 p[m, j]
p[v, m, j] == 1/2 p[m, v]    + 1/2 p[m, j, v]
p[m, j, v] == 2/5 p[j, m]    + 3/5 p[j, v, m]
e la soluzione:
p[j, v, m] = 656/1701 
p[m, j, v] = 232/567
p[v, m, j] = 278/567
Nel caso b, v, m risulta che a m conviene passare; qui dobbiamo
distinguere p[b, v, m] se m ha sparato per ultimo e pp[b, v, m] se m ha
passato (perché il comportamento di b nei due casi è diverso). Il
sistema è:
p[b, v, m]  == 1/5 p[v, m, b]
pp[b, v, m] == 4/5 p[m, b] + 1/5 p[v, m, b]
p[v, m, b]  == 1/2 p[m, v] + 1/2 p[m, b, v]
p[m, b, v]  == pp[b, v, m]
ed ha per soluzione:
p[b, v, m] = 8/77
p[v, m, b] = 40/77
p[m, b, v] = 36/77 
pp[b, v, m] = 36/77.
Infine, nel caso con 4 duellanti, risulta:
p[j, b, v, m] = 1/3 p[v, m, j] + 1/3 p[b, m, j] = 23299/74844
e quindi i vari casi:
se m passa: 
p[m, j, b, v] = p[j, b, v, m] = 23299/74844;
se m spara a j:
p[m, j, b, v] = 2/5 p[b, v, m] + 3/5 p[j, b, v, m] = 4069/17820
se m spara a b:
p[m, j, b, v] = 2/5 p[j, v, m] + 3/5 p[j, b, v, m] = 25525/74844
se m spara a v:
p[m, j, b, v] = 2/5 p[j, b, m] + 3/5 p[j, b, v, m] = 8353/24948
che sono proprio i risultati riportati.
Maurizio

 coi miei che vengono diversi. TIA:-)
Sono gli stessi che ho postato io tempo fa! :-)
Solo che c'era un errore di calcolo... :-(
ma il procedimento è ok!
Ciao
Andrea

p[m, j, b] = 475/1188.
TNX!!  Ora mi viene anche a me esattamente uguale, mi ero perso
un loop.
Cmq io ho proceduto direttamente e non dalla fine e viene veramente
cortissimo. Per i conti non credo convenga con Mathematica, perche'
son quasi tutte uguali e sono progressioni geometriche: si calcolano
quasi a mente.
