Нахождение всех подмножеств набора

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

Но сначала давайте рассмотрим некоторые специфические проблемы с кодом:

speed(-10)

Это в основном бессмыслица. Неправильная черепаха, неверный аргумент. Перечитайте документацию. Вместо того, чтобы идти на все эти усилия:

pil_img = Image.open("eightLane.jpg")  # Use PIL to open .jpg image.
tk_img = ImageTk.PhotoImage(pil_img)  # Convert it into something tkinter can use.
canvas = turtle.getcanvas()  # Get the tkinter Canvas of this TurtleScreen.
# Create a Canvas image object holding the tkinter image.
img_obj_id = canvas.create_image(0, 0, image=tk_img, anchor='center')

Почему бы просто не преобразовать внешнее фоновое изображение в GIF и просто сделать: структура данных:

addk=0
addkk=0
addkkk=0
addkkkk=0
addkkkkk=0
addkkkkkk=0
addkkkkkkk=0
addkkkkkkkk=0

Если бы мы расширили ипподром до девяти полос, то должно быть только небольшое количество мест, в которых ваш код должен измениться. Мой пример:

from turtle import Screen, Turtle
from math import sin, cos, atan2, pi
from random import randrange

# should probably calculate starting positions based on ellipse perimeter
LINEUP = [  # (color, (starting postion))
    ('red', (0, 90)),
    ('yellow', (-55, 120)),
    ('blue', (-120, 150)),
    ('green', (-195, 165)),
    ('dark goldenrod', (-270, 180)),
    ('blue violet', (-365, 170)),
    ('magenta', (-465, 140)),
    ('light slate gray', (-550, 100)),
]

DELTA = 0.4  # radians clockwise

def radii(index):  # calculate concentric ellipse radii
    return 265 + index * 44, 90 + index * 36

def race():
    """
    every 1/10th of a second, pick a random
    racer and move it forward a bit
    """

    index = randrange(len(racers))
    racer = racers[index]

    # get angle from x, y; bump angle; compute new x, y
    theta = atan2(racer.ycor(), racer.xcor()) + DELTA

    a, b = radii(index)

    x = a * cos(theta)
    y = b * sin(theta)

    racer.setheading(racer.towards(x, y))
    racer.setposition(x, y)

    # check if racer has crossed the finish line
    if pi/2 < theta < pi/2 + DELTA/2:
        pass  # we have a winner!
    else:
        screen.ontimer(race, 100)

screen = Screen()
screen.setup(1225, 825)  # fit image
screen.bgpic("eightLane.gif")  # convert image to GIF for simplicity

racers = []

for index, (color, position) in enumerate(LINEUP):

    racer = Turtle('turtle', visible=False)
    racer.setheading(180 + index * 10)
    racer.speed('fastest')
    racer.color(color)
    racer.penup()
    racer.setposition(position)
    racer.showturtle()

    racers.append(racer)

race()
screen.mainloop()

enter image description here

33
задан Rahul Vyas 16 October 2019 в 05:56
поделиться

3 ответа

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

  • Для n = 1 набор подмножеств is {{}, {1}}
  • Для n> 1 найдите набор подмножеств 1, ..., n-1 и сделайте две его копии. Для одного из них добавьте n к каждому подмножеству. Затем возьмите объединение двух копий.

Редактировать Чтобы сделать его кристально ясным:

  • Множество подмножеств {1} есть {{}, {1}}
  • Для {1, 2 }, возьмите {{}, {1}}, добавьте 2 к каждому подмножеству, чтобы получить {{2}, {1, 2}}, и возьмите объединение с {{}, {1}}, чтобы получить {{}, { 1}, {2}, {1, 2}}
  • Повторяйте до достижения n
106
ответ дан Michael Borgwardt 27 November 2019 в 17:20
поделиться

Если Вы хотите перечислить все возможные подмножества, взглянули на данную статью. Они обсуждают разные подходы, такие как лексикографический порядок, серое кодирование и последовательность банкира. Они дают реализацию в качестве примера последовательности банкира и обсуждают различные характеристики решений, например, производительности.

8
ответ дан sris 27 November 2019 в 17:20
поделиться

одним простым способом был бы следующий псевдокод:

Set getSubsets(Set theSet)
{
  SetOfSets resultSet = theSet, tempSet;


  for (int iteration=1; iteration < theSet.length(); iteration++)
    foreach element in resultSet
    {
      foreach other in resultSet
        if (element != other && !isSubset(element, other) && other.length() >= iteration)
          tempSet.append(union(element, other));
    }
    union(tempSet, resultSet)
    tempSet.clear()
  }

}

Ну, я не совсем уверен, что это правильно, но выглядит нормально.

0
ответ дан AndreasT 27 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: