Декартово произведение в Python - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь сделать разброс сюжета о проблеме "звезд и столбов".По оси X у меня «количество детей, которым нужно раздать конфеты», по оси Y - количество конфет, которое нужно раздать.На оси Z у меня есть «несколько способов распределения.

Я использую вложенные циклы для генерации набора данных для построения графиков:

import itertools as it
import math
import numpy as np
import matplotlib as mlp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x_coordinate = np.arange(16)
y_coordinate = np.arange(16)
dataset = []
for i in range(10):
    for j in range(10):
    mylist = [item for item in it.product(range(i), repeat = j) if sum(item) == (i-1)]
    z_value = len(mylist) 
    x_value = i
    y_value = j
    dataset.append((x_value, y_value, z_value))  
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
x = [item[0] for item in dataset]
y = [item[1] for item in dataset]
z = [item[2] for item in dataset]
ax.scatter(x,y,z,c='r')
ax.set_xlabel('Candies')
ax.set_ylabel('Children')
ax.set_zlabel('Search space')

Проблема заключается в том, что когда я проверяю свой набор данных, ясм. записи типа (1,5,1), (1,6,1) и т. д., которые подразумевают, что существует 1 способ распределить 1 конфету среди 5 детей или 1 способ распределить 1 конфету среди 6 детей. Но это не такправда, есть 5 способов распределить 1 конфету среди 5 детей и 6 способов распределить 1 конфету среди 6 детей. Я, конечно, делаю что-то ужасно неправильно, но я не могу понять это.

1 Ответ

0 голосов
/ 16 ноября 2018

Ваше вычисление mylist находит все способы распределить i-1 конфеты среди j детей, а не i конфет.Существует ровно 1 способ распределить 0 конфет между 5 детьми или 6 детьми или любым количеством детей: никто ничего не получает.

...