#1. Основные этапы работы генетического алгоритма | Генетические алгоритмы на Python

Поділитися
Вставка
  • Опубліковано 22 лис 2024

КОМЕНТАРІ • 57

  • @mr.dipperxaki
    @mr.dipperxaki 2 роки тому +18

    Человек просто делает круто и качественно. Пусть ваши старания окупятся. Спасибо!

  • @Trepetsky
    @Trepetsky 3 роки тому +16

    Прям как чувствуете! Недели 2 назад сам начал изучать GA и тут вы ролик выпускаете) спасибо, на русскоязычном Ютуб это не хватает.

    • @yan200go
      @yan200go 3 роки тому

      У меня также)

  • @ЛенаАлексеева-р8б
    @ЛенаАлексеева-р8б 7 місяців тому +1

    Офигеть! Фитнес это же реально решение многих проблем по жизни)))❤вы очень умный, спасибо вам за то, что простым языком объясняете. Поверьте, вы учите людей не только ии)

  • @АртемЛёвин-д5л
    @АртемЛёвин-д5л Рік тому +1

    Наглядно, доступно, с толком и расстановкой. Спасибо!

  • @DRTR-bm8wt
    @DRTR-bm8wt 3 роки тому +5

    Огромное спасибо за все те старания, что вы вкладываете в обучающие видео.

  • @ЖанЖак-м7м
    @ЖанЖак-м7м Рік тому +1

    Как всегда-с огромным интересом просматриваю все ваши видео!!! Очень понятно и очень интересно! СПАСИБО!

  • @Timur_play_time
    @Timur_play_time 3 роки тому +11

    Как же интересно! Спасибо за урок!!

  • @friend1cat
    @friend1cat 3 роки тому +5

    Спасибо, Сергей!

  • @АлександрКлимов-х3и

    Очень рад, что нашел ваш канал! Смотрю взахлеб

  • @kamoliddinshukurov9398
    @kamoliddinshukurov9398 Рік тому +2

    Класс

  • @mar_kha
    @mar_kha 2 роки тому +3

    Спасибо Вам большое! Ваша подача материала просто шикарна)

  • @jetbrain9115
    @jetbrain9115 2 роки тому +2

    Как всегда, подача и материалы супер!!!! Спасибо!

  • @kelsou560
    @kelsou560 3 роки тому +2

    Это лайк без вопросов

  • @AcCeHu3aToP
    @AcCeHu3aToP 3 роки тому +3

    Как всегда лайк. Даешь больше обучающего видео по Data science!

  • @RedPixel-j1e
    @RedPixel-j1e 3 роки тому +2

    Ооо, уже начинаю смотреть!) Долго искал такой курс

  • @deniss5562
    @deniss5562 3 роки тому +1

    Ждём с нетерпением )

  • @Делакруа́-ы9щ
    @Делакруа́-ы9щ Рік тому

    подвижный шест - это маятник Капицы, что бы он не падал, точка подвеса должна совершать колебания, параметры которых можно рассчитать, об этом рассказывал Владимир Арнольд, на ютубе есть видео.

  • @Xomkafrfr
    @Xomkafrfr 10 місяців тому +1

    Спасибо! ❤

  • @CanalNew1
    @CanalNew1 3 роки тому +1

    Очень интересно, генетический mortal combat.

  • @МихаилИванов-я4й9д
    @МихаилИванов-я4й9д 3 роки тому +2

    Очень круто

  • @mk6289l
    @mk6289l Рік тому +2

    Кому нужно подробнее может почитать книгу "Hands-On Genetic Algorithms with Python". Возможно автор брал ее за основу.

  • @-Slesh-
    @-Slesh- 3 роки тому +1

    Спасибо!

  • @андрейхоменко-и5я
    @андрейхоменко-и5я 3 роки тому +2

    Это что то очень сложное. Но очень интересное. Надеюсь получиться понять.

    • @yuliyaparamonova5596
      @yuliyaparamonova5596 2 роки тому

      Если тебе это сложно, то программирование тебе не по пути

  • @davidapk323
    @davidapk323 3 роки тому +1

    спасибо

  • @КЛОВИ-щ5ы
    @КЛОВИ-щ5ы 3 роки тому +2

    Все впринципе звучит легко пока что, только нужно теперь попробовать написать код

  • @БендерЗадунайский-щ9ы

    интересно! хоть сейчас и не надо😀

  • @Aleksandr___
    @Aleksandr___ 3 роки тому +6

    ох как интересно, надеюсь запрогаем своих "животных" с графическим отображением)

    • @selfedu_rus
      @selfedu_rus  3 роки тому +3

      до тележки точно дойдем :)

  • @dmitrykhomyakov8451
    @dmitrykhomyakov8451 10 місяців тому +1

    Сергей добрый день. При просмотре Ваших уроков возник вопрос по теме отбора. В этом видео и в видео про методы обора не совсем понятно чем заменяются кандидаты НЕ прошедшие отбор? Например в турнирном отборе отбирается один из трех кандидатов. Выбор происходит несколько раз. В итоговом отборе кандидатов в 3 раза мемньше чем в исходном. Как в результате сохраняется размер популяции ?

    • @selfedu_rus
      @selfedu_rus  10 місяців тому

      давно делал, нужно уточнить, одно из двух:
      1. либо дублируются особи в новой популяции
      2. либо при отборе сразу делается скрещивание и появляются новые непохожие особи

    • @dmitrykhomyakov8451
      @dmitrykhomyakov8451 10 місяців тому

      1. В трех экземплярах дублируется особь которая "выиграла" отбор ?
      2. А если скрещивание отключено тогда как ?
      Разве при скрещиваниии количество особей увеличивается?.

  • @scorpion4eg88
    @scorpion4eg88 9 місяців тому +1

    Про турнирный отбор. Если популяция до турнира и после турнира остается одинаковой и все имеют равные шансы на спаривание, не означает ли это, что в ней нет смысла? По алгоритму похоже что из исходной популяции в получившуюся некоторые удачливые попадают более одного раза. Так ли это, или я чтото упускаю? Хотелось бы понять, где прячется механизм ухода слабых.

    • @selfedu_rus
      @selfedu_rus  9 місяців тому

      да, одинаковые особи могут быть в новой популяции; уходят те, кто не прошел турнирный отбор )

    • @scorpion4eg88
      @scorpion4eg88 9 місяців тому

      @@selfedu_rus понял) спасибо за ответ и за ваш труд

  • @ivanlino3747
    @ivanlino3747 3 роки тому +1

    +++ спасибо! ps Осталось тебе затронуть тему изучения английского языка)))

  • @impellergimpeller5133
    @impellergimpeller5133 3 роки тому +1

    👍👍👍👍👍

  • @Йойхочуїсти
    @Йойхочуїсти Рік тому +1

    ЧОЛОВІЧЕ, НА ТВОМУ КАНАЛІ АБСОЛЮТНО ВСЕ ЩО МЕНІ ПОТРІБНО
    ДЯКУЮ ТОБІ ВЕЛИЧЕЗНЕ

  • @Creeper71
    @Creeper71 5 місяців тому +1

    Такой знакомый голос...
    Это вы ведете канал Begin End?

  • @КатяКлещенко-з3ш
    @КатяКлещенко-з3ш 3 роки тому +1

    Добрый день, хотела бы у вас спросить, каким образом можно применять генетические алгоритмы в планировании расписания с пожеланиями участников ? Не могу разобраться, спасибо

  • @sabbraxcaddabra
    @sabbraxcaddabra 3 роки тому +1

    Здравствуйте, хотел бы задать вам вопрос. Не совсем понял как(или почему) количество родителей после отбора должно быть равно размеру начальной популяции?

    • @selfedu_rus
      @selfedu_rus  3 роки тому

      Это не обязательно, в самом простом варианте, чтобы популяция не вырождалась и не разрасталась мы делаем такую логику

    • @ЮрийКлименко-к3щ
      @ЮрийКлименко-к3щ 2 роки тому

      @@selfedu_rus так получается если после отбора количество родителей равно первоначальному, то никакого отбора и не произошло)

    • @yuliyaparamonova5596
      @yuliyaparamonova5596 2 роки тому

      @@ЮрийКлименко-к3щ Нет

  • @ЖандосКуандиков
    @ЖандосКуандиков 7 місяців тому

    ВЫ...ПРЕДСТАВЛЯЕТЕ....КАКОЙ....ГЕНЕТИКОЙ---АЛГОРИТМОВ....ВЛАДЕЛЛ....СОЗДАТЕЛЬ....НАШЕГО---МИРА.........И...ЭТО....ЧЕЛОВЕК...НО...РОЖДЕННЫЙ......НЕ...КАК....МЫ☝️☝️☝️☝️🔴🔴🔴🔴

  • @FundLikVis
    @FundLikVis 2 роки тому

    Можно но ли мой код как-то оптимизировать? Или у него все уже хорошо?
    import random
    class Osobi:
    def Standard_Values():
    _1 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _2 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _3 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _4 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _5 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _6 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _7 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    _8 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
    return _1,_2,_3,_4,_5,_6,_7,_8
    class Genetic_Algoritm_Start:
    For_mutations = random.randint(0,7)
    def Otbor(_1,_2,_3,_4,_5,_6,_7,_8):
    choice_1 = random.randint(0,7)
    choice_2 = random.randint(0,7)
    if choice_2 == choice_1:
    choice_2 = random.randint(0,7)
    return choice_1, choice_2
    def Otbor_Part_Two(choice_1, choice_2):
    if Osobi[choice_1] > Osobi[choice_2]:
    _1_ = Osobi[choice_1]
    else:
    _1_ = Osobi[choice_2]
    if Osobi[choice_1] < Osobi[choice_2]:
    _2_ = Osobi[choice_1]
    else:
    _2_ = Osobi[choice_2]
    return _1_,_2_
    def New_Age(_1_,_2_):
    For_Born = [_1_,_2_]
    _1 = For_Born[random.randint(0,1)]
    _2 = For_Born[random.randint(0,1)]
    _3 = For_Born[random.randint(0,1)]
    _4 = For_Born[random.randint(0,1)]
    _5 = For_Born[random.randint(0,1)]
    _6 = For_Born[random.randint(0,1)]
    _7 = For_Born[random.randint(0,1)]
    _8 = For_Born[random.randint(0,1)]
    return _1,_2,_3,_4,_5,_6,_7,_8
    def Mutations(Osobi,For_mutations):
    For_mutations = random.randint(0,7)
    Sector = random.randint(0,7)
    if Osobi[For_mutations][Sector] == 0:
    Osobi[For_mutations][Sector] = 1
    else:
    Osobi[For_mutations][Sector] = 0
    return Osobi[For_mutations],For_mutations
    [_1,_2,_3,_4,_5,_6,_7,_8] = Osobi.Standard_Values()
    # Запуск Цикла
    run = True
    pokol = 0
    while run:
    pokol += 1
    Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
    choice_1, choice_2 = Genetic_Algoritm_Start.Otbor(_1,_2,_3,_4,_5,_6,_7,_8)
    _1_,_2_ = Genetic_Algoritm_Start.Otbor_Part_Two(choice_1, choice_2)
    _1,_2,_3,_4,_5,_6,_7,_8 = Genetic_Algoritm_Start.New_Age(_1_,_2_)
    Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
    Osobi[Genetic_Algoritm_Start.For_mutations],Genetic_Algoritm_Start.For_mutations = Genetic_Algoritm_Start.Mutations(Osobi,Genetic_Algoritm_Start.For_mutations)
    print(Osobi)
    if Osobi[0] == [1,1,1,1,1,1,1,1]:
    run = False
    print("Genetic_Algoritm_Working Поколение номер: ", pokol)

    • @FundLikVis
      @FundLikVis 2 роки тому

      Как я понимаю это ведь нормально, что многое зависит от удачи? Количество итерация варьируется от 5 до 707

    • @FundLikVis
      @FundLikVis 2 роки тому

      Тут обновленная версия, в прошлой версия 2 родитель из-за неизвестных причин постоянно уходил от детей. Правда теперь требуется 17000 итераций
      import random
      class Osobi:
      def Standard_Values():
      _1 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _2 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _3 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _4 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _5 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _6 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _7 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _8 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      return _1,_2,_3,_4,_5,_6,_7,_8
      class Genetic_Algoritm_Start:
      For_mutations = random.randint(0,7)
      def Otbor(_1,_2,_3,_4,_5,_6,_7,_8):
      choice_1 = random.randint(0,7)
      choice_2 = random.randint(0,7)
      if choice_2 == choice_1:
      choice_2 = random.randint(0,7)
      return choice_1, choice_2
      def Otbor_Part_Two(choice_1, choice_2,_1_,_2_):
      if Osobi[choice_1] > Osobi[choice_2]:
      _1_ = Osobi[choice_1]
      if Osobi[choice_2] > Osobi[choice_1]:
      _1_ = Osobi[choice_2]
      if Osobi[choice_1] < Osobi[choice_2]:
      _2_ = Osobi[choice_1]
      if Osobi[choice_2] < Osobi[choice_1]:
      _2_ = Osobi[choice_2]
      return _1_,_2_
      def New_Age(_1_,_2_):
      For_Born = [_1_,_2_]
      _1 = For_Born[random.randint(-1,1)]
      _2 = For_Born[random.randint(-1,1)]
      _3 = For_Born[random.randint(-1,1)]
      _4 = For_Born[random.randint(-1,1)]
      _5 = For_Born[random.randint(-1,1)]
      _6 = For_Born[random.randint(-1,1)]
      _7 = For_Born[random.randint(-1,1)]
      _8 = For_Born[random.randint(-1,1)]
      return _1,_2,_3,_4,_5,_6,_7,_8
      def Mutations(Osobi,For_mutations):
      For_mutations = random.randint(0,7)
      Sector = random.randint(0,7)
      if Osobi[For_mutations][Sector] == 0:
      Osobi[For_mutations][Sector] = 1
      else:
      Osobi[For_mutations][Sector] = 0
      return Osobi[For_mutations],For_mutations
      [_1,_2,_3,_4,_5,_6,_7,_8] = Osobi.Standard_Values()
      # Запуск Цикла
      run = True
      pokol = 0
      _1_, _2_ = 1,2
      while run:
      pokol += 1
      Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
      choice_1, choice_2 = Genetic_Algoritm_Start.Otbor(_1,_2,_3,_4,_5,_6,_7,_8)
      _1_,_2_ = Genetic_Algoritm_Start.Otbor_Part_Two(choice_1, choice_2, _1_, _2_)
      _1,_2,_3,_4,_5,_6,_7,_8 = Genetic_Algoritm_Start.New_Age(_1_,_2_)
      Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
      Osobi[Genetic_Algoritm_Start.For_mutations],Genetic_Algoritm_Start.For_mutations = Genetic_Algoritm_Start.Mutations(Osobi,Genetic_Algoritm_Start.For_mutations)
      print(Osobi)
      if Osobi[0] == [1,1,1,1,1,1,1,1]:
      if Osobi[1] == [1,1,1,1,1,1,1,1]:
      if Osobi[2] == [1,1,1,1,1,1,1,1]:
      if Osobi[3] == [1,1,1,1,1,1,1,1]:
      if Osobi[4] == [1,1,1,1,1,1,1,1]:
      if Osobi[5] == [1,1,1,1,1,1,1,1]:
      if Osobi[6] == [1,1,1,1,1,1,1,1]:
      if Osobi[7] == [1,1,1,1,1,1,1,1]:
      run = False
      print("Genetic_Algoritm_Working Поколение номер: ", pokol)

    • @FundLikVis
      @FundLikVis 2 роки тому

      Хотя оно и логично, я просто сделал подобие скрещивания, как-бы скоро это исправлю

    • @FundLikVis
      @FundLikVis 2 роки тому

      Ух, наконец-то закончил, теперь он и с узорами справляется не за 10002939 итераций

    • @FundLikVis
      @FundLikVis 2 роки тому

      import random
      class Osobi:
      def Standard_Values():
      _1 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _2 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _3 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _4 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _5 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _6 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _7 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      _8 = [random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1),random.randint(0,1)]
      return _1,_2,_3,_4,_5,_6,_7,_8
      class Genetic_Algoritm_Start:
      For_mutations = random.randint(0,7)
      def Otbor(_1,_2,_3,_4,_5,_6,_7,_8):
      choice_1 = random.randint(0,7)
      choice_2 = random.randint(0,7)
      if choice_2 == choice_1:
      choice_2 = random.randint(0,7)
      return choice_1, choice_2
      def Otbor_Part_Two(choice_1, choice_2,_1_,_2_):
      if Osobi[choice_1] > Osobi[choice_2]:
      _1_ = Osobi[choice_1]
      if Osobi[choice_2] > Osobi[choice_1]:
      _1_ = Osobi[choice_2]
      if Osobi[choice_1] < Osobi[choice_2]:
      _2_ = Osobi[choice_1]
      if Osobi[choice_2] < Osobi[choice_1]:
      _2_ = Osobi[choice_2]
      return _1_,_2_
      def New_Age(_1_,_2_):
      For_Born = [_1_,_2_]
      _1 = For_Born[random.randint(-1,1)]
      _1[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _2 = For_Born[random.randint(-1,1)]
      _2[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _3 = For_Born[random.randint(-1,1)]
      _3[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _4 = For_Born[random.randint(-1,1)]
      _4[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _5 = For_Born[random.randint(-1,1)]
      _5[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _6 = For_Born[random.randint(-1,1)]
      _6[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _7 = For_Born[random.randint(-1,1)]
      _7[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      _8 = For_Born[random.randint(-1,1)]
      _8[random.randint(0,7)] = For_Born[random.randint(-1,1)][random.randint(0,7)]
      return _1,_2,_3,_4,_5,_6,_7,_8
      def Mutations(Osobi,For_mutations):
      For_mutations = random.randint(0,7)
      Sector = random.randint(0,7)
      if Osobi[For_mutations][Sector] == 0:
      Osobi[For_mutations][Sector] = 1
      else:
      Osobi[For_mutations][Sector] = 0
      return Osobi[For_mutations],For_mutations
      [_1,_2,_3,_4,_5,_6,_7,_8] = Osobi.Standard_Values()
      # Запуск Цикла
      run = True
      pokol = 0
      _1_, _2_ = 1,2
      while run:
      pokol += 1
      Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
      choice_1, choice_2 = Genetic_Algoritm_Start.Otbor(_1,_2,_3,_4,_5,_6,_7,_8)
      _1_,_2_ = Genetic_Algoritm_Start.Otbor_Part_Two(choice_1, choice_2, _1_, _2_)
      _1,_2,_3,_4,_5,_6,_7,_8 = Genetic_Algoritm_Start.New_Age(_1_,_2_)
      Osobi = [_1,_2,_3,_4,_5,_6,_7,_8]
      Osobi[Genetic_Algoritm_Start.For_mutations],Genetic_Algoritm_Start.For_mutations = Genetic_Algoritm_Start.Mutations(Osobi,Genetic_Algoritm_Start.For_mutations)
      print(Osobi)
      if _1 == [1,0,0,1,1,0,0,1] and _2 == [1,0,0,1,1,0,0,1] and _3 == [1,0,0,1,1,0,0,1] and _4 == [1,0,0,1,1,0,0,1] and _5 == [1,0,0,1,1,0,0,1] and _6 == [1,0,0,1,1,0,0,1] and _7 == [1,0,0,1,1,0,0,1] and _8 == [1,0,0,1,1,0,0,1]:
      run = False
      print("Genetic_Algoritm_Working Поколение номер: ", pokol)

  • @brainstormbalaclava5384
    @brainstormbalaclava5384 3 роки тому +1

    Спасибо

  • @jamjam3337
    @jamjam3337 11 місяців тому +1

    👏👍