C# :: Aufgabe #280

1 Lösung Lösung öffentlich

Hysterie bei Atemwegserkrankung Covid-19

Anfänger - C# 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 Waldgeist (1470 Punkte) - 22.03.2020 um 14:46 Uhr
Habe mir das mal als WPF Anwendung Programmiert.
Sollte eigentlich passen, auch wenn ich immer relativ kleine Werte raus bekomme.
Das komplettes Projekt habe ich als ZIP Datei angehängt.

Hier der Code:

Quellcode ausblenden C#-Code
/*AUFGABE 280
  
Hysterie bei Atemwegserkrankung Covid-19

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.


*/

using System;
using System.Windows;

namespace Corona
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void berechne_Click(object sender, RoutedEventArgs e)
        {
            int N = Convert.ToInt32(anzahl.Text);                   //Anzahl der Teilnehmer
            int S = Convert.ToInt32(simulation.Text);               //Anzahl der Simulationen, d.h. Wie oft wird die Berechnung durchgeführt

            double summezusagen = 0;                                //Anzahl der Zusagen aufsummiert über alle Berechnungen
            double summeratio = 0;                                  //Verhältnis von Zusagen zu Teilnehmern

            double minimum = N;
            double maximum = 0;
            double durchschnitt = 0;


            Random rdm = new Random((int)DateTime.Now.Ticks);       //Zufallszahl Initialisieren

            for (int i = 1; i <= S; i = i + 1)                      // Schleife für die Anzahl der Simulationen
            {
                double zusagen = 1;                                 //Anzahl der Personen die am Konzert teilnehmen in der aktuellen Berechnung

                int gruppe1 = 0;                                    //Anzahl der Personen in Gruppe1  
                int gruppe2 = 1;                                    //Anzahl der Personen in Gruppe2    
                int gruppe3 = 0;                                    //Anzahl der Personen in Gruppe3  
                int gruppe4 = 0;                                    //Anzahl der Personen in Gruppe4  
                int w = 1;                                          //Anzahl der Personen die bereits gewählt / entschieden haben  
                double ratio = 1;                               // lokale Variable für das Verhältnis von Zusagen zu Teilnehmern  

                do                                                  //Schleife für die Anzahl der Teilnehmer
                {
                    int z = rdm.Next(1, 5);                         // Variable z mit Zufallszahls zwischen 1 und 4  
                      

                    if ((z == 1) & (gruppe1 < (N / 4)))               //Person gehört zu Gruppe1 --> Storno
                    {
                        gruppe1++;
                        w++;
                    }

                    else if ((z == 2) & (gruppe2 < (N / 4)))           //Person gehört zu Gruppe2 --> teilnehmen
                    {
                        zusagen++;
                        gruppe2++;
                        w++;
                    }

                    else if ((z == 3) & (gruppe3 < (N / 4)))          //Person gehört zu Gruppe3 --> teilnehmen wenn aktuelles Verhältnis >50%
                    {
                        gruppe3++;
                        w++;
                        if (ratio > 0.5) zusagen++;
                    }

                    else if ((z == 4) & (gruppe4 < (N / 4)))          //Person gehört zu Gruppe4 --> teilnehmen wenn aktuelles Verhältnis <50%
                    {
                        gruppe4++;
                        w++;
                        if (ratio <= 0.25) zusagen++;
                    }

                    ratio = (zusagen / w);
                    


                    
                } while (w < N);

                if (zusagen < minimum) minimum = zusagen;
                if (zusagen > maximum) maximum = zusagen;
                summeratio = summeratio + ratio;
                summezusagen = summezusagen + zusagen;
                

            }
            durchschnitt = summezusagen / S; 
            summeratio = (summeratio / S) * 100;
            ausgabe.Text = summeratio.ToString();
            minimumbox.Text = minimum.ToString();
            maximumbox.Text = maximum.ToString();
            durchschnittbox.Text = durchschnitt.ToString();
        }
    }
}




das ist der XAML Code für die GUI:

Quellcode ausblenden C#-Code
<Window x:Class="Corona.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Corona"
        mc:Ignorable="d"
        Title="Corona" Height="450" Width="800">
    <Grid>
        <Label Content="Anzahl Personen:" HorizontalAlignment="Left" Height="34" Margin="26,38,0,0" VerticalAlignment="Top" Width="100"/>
        <TextBox x:Name="anzahl" HorizontalAlignment="Left" Height="34" Margin="167,38,0,0" Text="12" TextWrapping="Wrap" VerticalAlignment="Top" Width="90"/>
        <Label Content="Anzahl Simulationen" HorizontalAlignment="Left" Height="30" Margin="26
               ,121,0,0" VerticalAlignment="Top" Width="137"/>
        <TextBox x:Name="simulation" HorizontalAlignment="Left" Height="30" Margin="167,121,0,0" Text="1" TextWrapping="Wrap" VerticalAlignment="Top" Width="90"/>
        <Button x:Name="berechne" Content="Berechne" HorizontalAlignment="Left" Height="49" Margin="26,190,0,0" VerticalAlignment="Top" Width="231" Click="berechne_Click"/>
        <TextBox x:Name="ausgabe" HorizontalAlignment="Left" Height="16" Margin="345,264,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="60"/>
        <Label Content="Wahrscheinlichkeit mit der das Konzert abgesagt wird:" HorizontalAlignment="Left" Height="31" Margin="26,257,0,0" VerticalAlignment="Top" Width="314" FontWeight="Bold"/>
        <Label Content="Prozent." HorizontalAlignment="Left" Height="24" Margin="410,257,0,0" VerticalAlignment="Top" Width="63" FontWeight="Bold"/>
        <Label Content="maximale Teilnehmerzahl" HorizontalAlignment="Left" Height="28" Margin="26,307,0,0" VerticalAlignment="Top" Width="296" RenderTransformOrigin="2.373,2.457"/>
        <Label Content="minimale Teilnehmerzahl" HorizontalAlignment="Left" Height="28" Margin="26,334,0,0" VerticalAlignment="Top" Width="296" RenderTransformOrigin="2.373,2.457"/>
        <Label Content="durchschnittliche Teilnehmerzahl" HorizontalAlignment="Left" Height="28" Margin="26,362,0,0" VerticalAlignment="Top" Width="296" RenderTransformOrigin="2.373,2.457"/>
        <TextBox x:Name="maximumbox" HorizontalAlignment="Left" Height="16" Margin="221,313,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="60"/>
        <TextBox x:Name="minimumbox" HorizontalAlignment="Left" Height="16" Margin="221,340,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="60"/>
        <TextBox x:Name="durchschnittbox" HorizontalAlignment="Left" Height="16" Margin="221,368,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="60"/>

    </Grid>
</Window>