MATLAB Tutorial #10

Instrukcja warunkowa IF

Treść obu stworzonych uprzednio plików (monty_uparciuch.m oraz monty_niestateczny.m) w znacznym stopniu się pokrywa. Różnica pomiędzy nimi polega na tym, że w jednym przypadku gracza stawia się przed możliwością zmiany wyboru bramki i gracz z tej propozycji korzysta, w drugim pozostaje on przy swoim pierwotnym wyborze. Dołożymy do kodu zawartego w monty_niestateczny dodatkową część, która będzie uzależniała przebieg algorytmu od zdefiniowanych warunków – w naszym przypadku takim warunkiem będzie wybór strategii, jaką obrał gracz.


Zacznijmy od zapisania skryptu monty_niestateczny pod nową nazwą, niech to będzie po prostu monty.

  • Otwórz do edycji plik monty_niestateczny, po czym zapisz go pod nową nazwą.

Teraz możesz przejść do wprowadzania zmian. Strategię gracza ustalamy „na sztywno”, przed główną pętlą programu.

  • Zdefiniuj na początku skrytpu nową zmienną strategia_gracza , przypisz jej wartość 1.
strategia_gracza = 1

Umawiamy się od razu, że wartość 1 oznaczać wybór strategii uparciucha. W samej pętli for dokonujemy większej zmiany. Na miejsce linii

drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]);

Wstaw cały blok instrukcji:

    if strategia_gracza == 1
        drugi_wybor = pierwszy_wybor;
    else
        drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]);
    end

Powyższy blok kodu będzie interpretowany w następujący sposób: Jeśli zmienna strategia_gracza przyjmie wartość 1, warunek strategia_gracza == 1 zostanie spełniony i MATLAB zacznie wykonywać instrukcję znajdujące się bezpośrednio pod linią z if. W przeciwnym wypadku (jeśli strategia_gracza przyjmie wartość 0, 2, 8 czy jakąkolwiek inną) MATLAB wykona instrukcję znajdujące się bezpośrednio pod linią z else. Program będzie działał, można go jednak nieco poprawić. Ponieważ w grze można przyjąć jedną z dwóch strategii (tj. uczestnik turnieju ma dwie opcje: zostać przy pierwszym wyborze lub go zmienić) warto zadbać, by miało to odzwierciedlenie w kodzie. Jak na razie strategia uparciucha została oznaczona konkretnie, przy pomocy liczby 1, natomiast strategia niestatecznego jest przyjmowana przy podaniu dowolnej innej wartości. Zmieńmy to teraz modyfikując blok if - else

    if strategia_gracza == 1
        drugi_wybor = pierwszy_wybor;
    elseif strategia_gracza == 2
        drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]);
    else
        error('Nieprawidłowe wskazanie strategii gracza')
    end

Podobnie jak w poprzednim przypadku, w pierwszej kolejności dokonywane jest sprawdzenie, czy zmienna strategia_gracza przyjęła wartości 1. Jeśli nie, to sprawdzane jest, czy strategia_gracza przyjęła wartości 2. Jeśli wynik tego sprawdzenie również jest negatywny, wykonywany jest kod zapisane bezpośrednio pod else. W naszym przypadku będzie to przerwanie działania programu i wyświetlenie informacji o błędzie.

Całość pliku monty.m powinna wyglądać następująco:

strategia_gracza = 1
liczba_gier = 10000;
liczba_wygranych = 0;
for i = 1:liczba_gier
    bramki = [false false false];
    bramka_z_nagroda = randi(3); % polecenie losuję liczbę naturalną w zakresie 1 - 3
    bramki(bramka_z_nagroda) = true;
    pierwszy_wybor = randi(3);
    numery_bramek = [1 2 3];
    numery_pustych_bramek = setdiff(numery_bramek, pierwszy_wybor);
    opcje_prowadzacego = setdiff(numery_pustych_bramek, bramka_z_nagroda);
    wskazanie_prowadzacego = opcje_prowadzacego(1);
    if strategia_gracza == 1
        drugi_wybor = pierwszy_wybor;
    elseif strategia_gracza == 2
        drugi_wybor = setdiff(numery_bramek, [wskazanie_prowadzacego, pierwszy_wybor]);
    else
        error('Nieprawidłowe wskazanie strategii gracza')
    end
    wygrana = bramki(drugi_wybor);
    liczba_wygranych = liczba_wygranych + wygrana;
end
p_wygranej = liczba_wygranych / liczba_gier

Kod na pewno nie jest "optymalny". Ma jednak jedną dużą zaletę: jest czytelny. I to jest olbrzymia zaleta MATLABa.

(Visited 668 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *