Python :: Aufgabe #242

2 Lösungen Lösungen öffentlich

Hysterie bei Atemwegserkrankung Covid-19

Anfänger - Python von hollst - 15.03.2020 um 20:17 Uhr
Die Covid-19-Hysterie ist zwar sehr nervig, hat mich aber zu folgender Aufgabenstellung inspiriert:

Eine Menge von N Leuten (sagen wir N = 1.000) haben Eintrittskarten für ein bevorstehendes Pop-Konzert gebucht. Die Stornierungsfrist ist noch nicht vorüber. Mit Ausbruch der Hysterie entscheidet sich 1/4 der N Leute, die Buchung zu stornieren, ebenfalls N/4 sind festen Willens, das Konzert trotz Covid-19-Ansteckungsgefahr zu besuchen. Der Rest der N Bucher macht eine Stornierung oder Teilnahme am Konzert von folgenden Bedingungen abhängig: N/4 würde stornieren, wenn die Gesamtzahl der Besucher unterhalb bzw. einschließlich 50 % sinkt (N/2). Sie befürchten, dass sich die Künstler bei weniger als die Hälfte der möglichen Besucher auch nur sehr wenig Mühe geben würden. Die letzten N/4 würden eine in Betracht gezogene Stornierung nicht vornehmen, wenn die Teilnehmerzahl unterhalb bzw. einschließlich 25 % gesunken ist. Ihr Argument: Bei nur N/4 oder weniger Zuschauer wäre genügend Zwischenraumplatzt, um sich quasi nicht zu infizieren.

Die Programmieraufgabe bestehe nun darin abzuschätzen, wieviele Besucher das Pop-Konzert in etwa haben wird.
Oder genauert: Der Konzertveranstalter würde das Konzert absagen, wenn weniger als 37.5 % der N Bucher tatsächlich buchen werden. Mit welcher Wahrscheinlichkeit wird das Konzert nicht abgesagt.

Wir gehen wie folgt vor: jeder der N Leute gehört mit eine Wahrscheinlichkeit von 1/4 zu einer der vier Gruppen (1 - auf jeden Fall stornieren, 2 - auf jeden Fall teilnehmen, 3 - vielleicht stornieren, 4 - vielleicht teilnehmen). Also, 25 % kommen auf jeden Falle, aber maximal 75 %.

Beginnend mit einem Besucher der Gruppe 2 (auf jeden Fall teilnehmen) werden nacheinander alle N - 1 Restinteressenten in zufälliger Reihenfolge nach ihrer Entscheidung befragt. Die Entscheidung ist für den befragten Besucher endgültig, selbst wenn sich im Laufe der Befragung die Bedingungen für die Zuordung zu Gruppe 3 oder 4 ändern sollten.

Viel Spaß!

Lösungen:

vote_ok
von Klaus (730 Punkte) - 17.03.2020 um 19:32 Uhr
Quellcode ausblenden Python-Code
import random as rnd

# Konstanten sind anpassbar
NO_OF_ITERATIONS = 1000                                    # Anzahl der Durchläufe zur Bestimmung der Wahrscheinlichkeit
NO_OF_VISITORS = 1000                                      # Anzahl der zu betrachtenden Besucher
RATE_GROUP_1 = 0.25                                        # Anteil GROUP 1: auf jeden Fall Storno
RATE_GROUP_2 = 0.25                                        # Anteil GROUP 2: auf jeden Fall Teilnahme
RATE_GROUP_3 = 0.25                                        # Anteil GROUP 3: Storno wenn Besucher <= 50%
RATE_GROUP_4 = 0.25                                        # Anteil GROUP 4: Teilnahme wenn Besucher <= 25%
RATE_CANCELLATION = 0.325                                  # Quote, deren Unterschreitung zur Konzertabsage führt


class Person:
    def __init__(self, group):
        self.group = group

    def decide_about_cancellation(self, rate_of_visitors):
        """ Entscheidet, ob storniert wird (return: Bool) """
        if self.group == 1:
            return True
        elif self.group == 2:
            return False
        elif self.group == 3:
            if rate_of_visitors <= 0.5:
                return True
            else:
                return False
        elif self.group == 4:
            if rate_of_visitors <= 0.25:
                return False
            else:
                return True


class Simultion:
    def __init__(self, number_of_iterations, number_of_visitors):
        self.number_of_iterations = number_of_iterations
        self.number_of_visitors = number_of_visitors
        self.statistic_of_cancellation = {'yes': 0, 'no': 0}
        self.sum_of_visitors_rate = 0                              # zur Bestimmung der durchschnittlichen Besucherzahl
        for iteration in range(self.number_of_iterations):
            self.start()
        self.print_results()

    def start(self):
        self.cancellation = {'yes': 0, 'no': 1}
        self.visitors = [Person(1)] * int(self.number_of_visitors * RATE_GROUP_1) + \
                        [Person(2)] * int((self.number_of_visitors * RATE_GROUP_2 - 1)) + \
                        [Person(3)] * int(self.number_of_visitors * RATE_GROUP_3) + \
                        [Person(4)] * int(self.number_of_visitors * RATE_GROUP_4)
        rnd.shuffle(self.visitors)

        for visitor in self.visitors:
            rate_of_visitors = self.cancellation['no'] / (self.cancellation['yes'] + self.cancellation['no'])
            if visitor.decide_about_cancellation(rate_of_visitors):
                self.cancellation['yes'] += 1
            else:
                self.cancellation['no'] += 1

        rate_of_visitors = self.cancellation['no'] / (self.cancellation['yes'] + self.cancellation['no'])
        self.sum_of_visitors_rate += rate_of_visitors
        if rate_of_visitors >= RATE_CANCELLATION:
            self.statistic_of_cancellation['no'] += 1
        else:
            self.statistic_of_cancellation['yes'] += 1

    def print_results(self):
        result = round(self.statistic_of_cancellation['no'] * 100 / (self.statistic_of_cancellation['yes'] +
                                                                     self.statistic_of_cancellation['no']), 1)
        average_of_visitors_rate = round(self.sum_of_visitors_rate * 100 / self.number_of_iterations, 1)

        print(f'Es wurden {self.number_of_iterations} Veranstaltungen simuliert.\n'
              f'Mit einer Wahrscheinlichkeit von {result}% findet das Konzert statt.\n'
              f'Im Mittelwert hätten {average_of_visitors_rate}% der Besucher das Konzert besucht.')


Simultion(NO_OF_ITERATIONS, NO_OF_VISITORS)
vote_ok
von satn1241 (1950 Punkte) - 01.04.2020 um 16:13 Uhr
Quellcode ausblenden Python-Code
def Befragung():    
    import random
    tickets = 1000
    hingeher = 1
    stornierer = 0
    quote = 1
  
    besucher_liste = list(range(2,tickets+1))
    while len(besucher_liste) > 0:
        befragter = random.randint(0,len(besucher_liste)-1)

#Hingeher
        if besucher_liste[befragter] < tickets/4+1:
            hingeher = hingeher +1

#Stornierer         
        if tickets/4 < besucher_liste[befragter] <tickets/2+1:
            stornierer = stornierer +1
 
#50%er Gruppe
        if tickets/2 < besucher_liste[befragter] <3*tickets/4+1:
            if quote <=0.5:
                stornierer = stornierer +1
            
            else:
                hingeher = hingeher +1

#25%er Gruppe    
        if 3*tickets/4 < besucher_liste[befragter] <tickets+1:
            if quote <=0.25:
                hingeher = hingeher +1

            else:
                stornierer = stornierer +1

        quote = hingeher/(hingeher+stornierer)
        besucher_liste.pop(befragter)
    return quote

#Ausführug der Befragung 1000-Mal        
wk = 0
for i in range (0,1000):
    wk = wk+ Befragung()
    i =1+i
print("Die Wahrscheinlichkeit liegt bei",round(wk/1000,4),"Prozent")