Проблема смешивания - рассчитать цену товара с учетом увеличения прибыли - PullRequest
0 голосов
/ 27 сентября 2019

новичок в AMPL.

В проблеме смешения я решил модель, максимизировав прибыль.

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

Возможно ли сделать это прямо во время работы.?

Применяя «пусть», я могу изменить количество доступного продукта, но я изо всех сил пытаюсь понять, как установить цену продукта как переменную?Как я могу это сделать?

Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2019

Здесь вы пытаетесь сделать пару вещей.

Одна из них - решить модифицированную версию проблемы с требованием, чтобы прибыль была как минимум на X% лучше, чем в предыдущей версии.проблема.Это можно сделать следующим образом:

  • Решить исходную версию задачи
  • Установить параметр profit_0 равный прибыли от старой проблемы.
  • Измените ограничения на проблему соответствующим образом
  • Измените целевую функцию, чтобы она теперь «максимизировала цену поставщика 3».
  • Повторно решите проблему с новым ограничением, что прибыль в новомрешение должно быть, по крайней мере, столь же хорошим, как 1.05*profit_0 или любым другим требованием.

Другое состоит в том, чтобы рассматривать некоторые цены как фиксированные, а другие как переменные.Вероятно, самый простой способ сделать это - определить их все как переменные, но затем ограничить некоторые из них фиксированными значениями.

Кодирование их в AMPL не слишком сложно, и я приведу пример синтаксиса ниже.К сожалению, тот факт, что вы умножаете (переменную цену) на (переменное количество купленных), чтобы найти свои затраты, означает, что вы получите квадратичное ограничение, которое многие решатели отклонят.

В этом примере я использовал Gecode, который не идеален для такого рода задач (в частности, он требует, чтобы все переменные были целочисленными), но, по крайней мере, допускает квадратичные ограничения:

reset;
option solver gecode;
# all the "integer" constraints in this example are there because
# gecode won't accept non-integer variables; ideally they wouldn't
# be there.

# To keep the demo simple, we assume that we are simply buying
# a single ingredient from suppliers and reselling it, without
# blending considerations.

param ingredients_budget;
# the maximum we can spend on buying ingredients

set suppliers;

param max_supply{suppliers};
# maximum amount each supplier has available

var prices{suppliers} integer >= 0;
# the amount charged by each supplier - in fact we want to treat
# some of those as var and some as constant, which we'll do by
# fixing some of the values.

param fixed_prices{suppliers} default -1;
# A positive value will be interpreted as "fix price at this value";
# negative will be interpreted as variable price.

s.t. fix_prices{s in suppliers: fixed_prices[s] > 0}:
    prices[s] = fixed_prices[s];

param selling_price;

var quantity_bought{s in suppliers} >= 0, <= max_supply[s] integer;

var quantity_sold integer;
s.t. max_sales: quantity_sold = sum{s in suppliers} quantity_bought[s];

var input_costs integer;
s.t. defineinputcosts: input_costs = sum{s in suppliers} quantity_bought[s]*prices[s];

s.t. enforcebudget: input_costs <= ingredients_budget;

var profit integer;
s.t. defineprofit: profit = quantity_sold*selling_price - input_costs;

maximize OF1: profit;

data;
param ingredients_budget := 1000;

set suppliers :=
S1
S2
;

param max_supply :=
S1 100
S2 0
;

param fixed_prices :=
S1 120
;

param selling_price := 150;

model;

print("Running first case with nothing available from S2");

solve;


display profit;
display quantity_bought;
display quantity_sold;

param profit_0;
let profit_0 := profit;

param increase_factor = 0.05;

let max_supply["S2"] := 100;

s.t. improveprofit: profit >= (1+increase_factor)*profit_0;

maximize OF2: prices["S2"];
objective OF2;

print("Now running to increase profit.");
solve;


display profit;
display quantity_bought;
display quantity_sold;
display prices["S2"];

Другой вариант - использовать циклические команды AMPL для многократного запуска одной и той же проблемы, но каждый раз изменяя соответствующее значение цены, чтобы увидеть, какие значения цены дают приемлемую прибыль.Если вы сделаете это, вам не нужно объявлять цену как переменную, просто сделайте ее параметром и используйте «let» для переключения между сценариями.Это позволит избежать квадратичного ограничения и позволит вам использовать решатели MIP, такие как CPLEX и Gurobi.

Вы также можете спросить в Operations Research SE, где вы можете получить ответы на некоторые вопросы лучше, чем я.

...