Я думаю, что ваш вопрос немного двусмысленный, но я постараюсь!Насколько я понимаю, вы начинаете с некоторого числа n
карандашей по рыночной цене p
.
- Вы продаете
a:=min(n//2,1000)
из них агенту А по 4 евро. - Вы продаете
b:=min(n//4,1000)
из них агенту Б по 5 евро. - Выпродайте
c:=min(n//4,1000)
из них агенту C по 5 евро. - Вы спрашиваете агента A, хочет ли она какой-либо из оставшихся карандашей;она покупает
a' <= min(n-a-b-c,1000)
из них за 5 евро. - Вы спрашиваете агента D, хочет ли она какой-либо из оставшихся карандашей;она покупает
d <= min(n-a-b-c-a',5000)
из них за 3 евро.
(Я не понимаю, почему у вас есть 24-элементные векторы. Это более двух лет или что-то? Я также сделал предположение о порядке- если вы спросите агентов A и D одновременно, хотят ли они некоторые из оставшихся карандашей, они оба могут попросить их!)
Первые три шага полностью определяются вашим контрактом;агенты не имеют права голоса в этом вопросе.Их легко вычислить, поэтому все, что вам нужно сделать, - это настроить способ спросить агентов, сколько карандашей они хотят, когда у них есть выбор.
Чтобы сделать это, я бы предположил, что у вас есть Agent
объектов с query
методом.Вы бы позвонили
agent.query(number_of_pencils_remaining, maximum_buyable, market_price)
, и это должно вернуть целое число, указывающее, сколько карандашей хочет купить агент.Это должно быть реализовано отдельно - я предполагаю, что агенты захотят сделать некоторые вычисления, основанные на их прогнозах и рыночной цене, прежде чем покупать.
Имеет ли это смысл?
Впсевдокод:
class Agent(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def query(number_of_pencils_remaining, maximum_buyable, market_price):
return 0
for price, volume in zip(...,...):
sell(quantity=min(volume//2, 1000), to=A, price=4)
sell(quantity=min(volume//4, 1000), to=B, price=5)
sell(quantity=min(volume//4, 1000), to=C, price=5)
sell(quantity=A.query(...), to=A, price=5)
sell(quantity=D.query(...), to=D, price=3)