Как работать с переменной, которая зависит от другой переменной, например, спроса и цены в интерфейсе Python Gurobi - PullRequest
0 голосов
/ 01 июня 2019

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

  1. Это Прибыль = Доход - стоимость + governemnt_subsidies
  2. Я рассчитываю Доход как Спрос * ticket_price

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

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

Я использую gurobypy - интерфейс Python Gurobi.Ниже приведен минимальный пример того, что я сделал до сих пор - я не включил governemnt_subsidies, потому что он не нужен для вопроса.

#--------------------------------
#input data
#--------------------------------
# A list of regions. set R
regions = ["Region_1", "Region_2"]
# A list of airports involved in the auction. set I
airports = ["A", "B"]
# A list of routes R
routes = ["A-B-ARN", "A-ARN", "B-ARN"]
Cost_bh = {
    "A-B-ARN" : 726,
     "A-ARN" : 1116,
     "B-ARN" : 1473
 }

#parameter variables
incidence_matrix_G = dict({
    ("A-B-ARN","A") : 1,
    ("A-B-ARN", "B") : 1,
    ("A-ARN","A" ) : 1,
    ("A-ARN", "B") : 0,
    ("B-ARN","A" ) : 0,
    ("B-ARN", "B") : 1
 })

route_bh = {
     "A-B-ARN" : 2.44,
     "A-ARN" : 1.41,
     "B-ARN" : 1.71
 }

route_maxflights = {
     "A-B-ARN" : 18,
     "A-ARN" : 12,
     "B-ARN" : 12
 }
route_maxprice = {
     "A" : 1300,
     "B" : 1000
 }

catchment = {
     "A-B-ARN" :  283475 ,
     "A-ARN" :  283475 ,
     "B-ARN" :  556465 
 }
#--------------------------------
# Create a new model
#--------------------------------
model = Model("Airline Profit")

#variables
price = {} # the prices an airline is charging per route, and airport
Demand= {} # the price responsive demand an airline gets per route and airport

#Define variables

# define price per route per airport
for route in routes:
    for airport in airports:
        price[route, airport] = model.addVar(vtype=GRB.CONTINUOUS,
                                              name="price_{}_{}".format(route, airport))
# define demand per route per airport, based on the price
for route in routes:
    for airport in airports:
        Demand[route, airport] = model.addVar(vtype=GRB.CONTINUOUS,
                                             name="Demand_{}_{}".format(route, airport))
m.update()

#AK add constraints 
for route in routes:
    for airport in airports:
        model.addConstrs(Demand[route, airport] =  np.exp(0.005 + (1.5434*np.log(catchment[route]))-(0.6774*np.log(route_bh[route]))-(1.8963*np.log(price[route, airport])))

model.addConstrs((price[route, airport]  <= route_maxprice[airport] for route in routes for airport in airports), "price_cap")

# Set objective function components
#AK the revenue for the airline
obj_revenue = quicksum(incidence_matrix_G[route, airport]*Demand[route, airport]*price[route, airport]*route_maxflights[route] for route in routes for airport in airports)

#The total operation cost; cost_bh is aircraft and route
# cost_bh is precomputes for a given route based on the used aircraft
obj_cost_operation = quicksum(Cost_bh[route]*route_bh[route]*route_maxflights[route] for route in routes)

Obj_airline = obj_revenue - 2*obj_cost_operation
model.setObjective(Obj_airline, GRB.MAXIMIZE)

В настоящее время я получаю некоторые результаты, но я знаю, что онине правильно, потому что когда я делаю print(Demand.values()), я получаю:

dict_values([<gurobi.LinExpr: 18.777961108358838 + -1.8963 price_A-B-ARN_A>, <gurobi.LinExpr: 18.777961108358838 + -1.8963 price_A-B-ARN_B>, <gurobi.LinExpr: 19.14945291443028 + -1.8963 price_A-ARN_A>, <gurobi.LinExpr: 19.14945291443028 + -1.8963 price_A-ARN_B>, <gurobi.LinExpr: 20.05977292744191 + -1.8963 price_B-ARN_A>, <gurobi.LinExpr: 20.05977292744191 + -1.8963 price_B-ARN_B>])

Я считаю, что если бы это работало, я бы получал реальные значения вместо линейных выражений.

Спасибоза вашу помощь.

...