Codigo de Problema de Granjero
Codigo de Problema de Granjero
Codigo de Problema de Granjero
Un agricultor europeo que se especializa en cultivar trigo, maíz y remolacha azucarera en sus 500 acres de
tierra durante el invierno. El agricultor sabe que se necesitan al menos 200 toneladas (T) de trigo y 240 T de
maíz para la alimentación del ganado. Estas cantidades pueden obtenerse en la granja o comprarse a un
mayorista. Cualquier producción que exceda los requisitos de alimentación se venderá.
Durante la última década, los precios medios de venta han sido de \ $ 170 y \ $ 150 por tonelada de trigo
y maíz, respectivamente. Los precios de compra son 40% más que esto debido al margen del mayorista y los
costos de transporte.
Otro cultivo rentable es la remolacha azucarera, que [esperan] venderse a \ $ 36 / T; sin embargo, la
Comisión Europea impone una cuota a la producción de remolacha azucarera. Cualquier cantidad que exceda
la cuota se puede vender solo a \ $ 10 / T. La cuota del agricultor para el próximo año es de 6000 T. "
Con base en la experiencia pasada, el agricultor sabe que el rendimiento medio en [su] tierra es de
aproximadamente 2,5 T, 3 T y 20 T por acre para trigo, maíz y remolacha azucarera, respectivamente.
[Para introducir incertidumbre,] suponga alguna correlación entre los rendimientos de los diferentes
cultivos. Una representación muy simplificada de esto sería asumir que los años son buenos, justos o malos
para todos los cultivos, lo que da como resultado rendimientos por encima del promedio, promedio o por
debajo del promedio para todos los cultivos. Para corregir estas ideas, por encima y por debajo del promedio
indica un rendimiento del 20% por encima o por debajo del rendimiento medio.
El área de la finca.
% Área máxima
Amax= 500.0;
% Hay 3 cultivos trigo (T), maíz (M) y remolacha_azucarera (RA). Cada un costo (C) de siembra diferente.
CT= 150.0; CM=230.0; CRA= 260.0
% El agricultor requiere una cantidad mínima de trigo y maíz, pero no de remolacha azucarera (toneladas).
T= 200.0; M=240.0; RA=0.0;
% El agricultor puede vender cultivos producidos bajo la cuota por las siguientes cantidades:
Sell_in_quota = Dict (: T=170.0; M=150. 0; :RA=36.0;)
% Si venden más de su cuota asignada, el agricultor gana lo siguiente por cada tonelada de cultivo por encima
de la cuota (\ $ / tonelada):
Sell_no_quota = Dict(:T=0.0; :M =0.0; :RA =10.0;)
%Los precios de compra del trigo y el maíz son un 40% superiores a su precio de venta. La descripción no se
refiere al precio de compra de la remolacha azucarera. Por lo tanto, usamos un valor alto de \ $ 1,000 /
tonelada.
Buy_price = Dict(:T= 238.0; :M= 210.0; :RA= 1000.0;)
% Sin embargo, el rendimiento es aleatorio. En los años buenos, el rendimiento es un + 20% por encima del
promedio, y en los años malos, el rendimiento es un -20% por debajo del promedio.
Yield_multiplier = Dict(:Bueno=.2; :Regular =1.0; :Malo= 0.8)
Formulación matemática
Código Matlab
@variable(model, x)
model[:x]
using SDDP, GLPK
%Variables de estado
function add_state_variables(subproblem)
@variable(subproblem, area[c = CROPS] >= 0, SDDP.State, initial_value=0)
end
add_state_variables (función genérica con 1 método)
Problema de la primera etapa
Solo podemos plantar un máximo de 500 acres y queremos minimizar el costo de plantación.
function create_first_stage_problem(subproblem)
@constraint(subproblem,
sum(subproblem[:area][c].out for c in CROPS) <= MAX_AREA)
@stageobjective(subproblem,
-sum(PLANTING_COST[c] * subproblem[:area][c].out for c in CROPS))
end
create_first_stage_problem (función genérica con 1 método)
variables de control
limitaciones
el objetivo
la incertidumbre
Primero, agreguemos las variables de control de la segunda etapa.
Variables
Agregamos cuatro tipos de variables de control. Técnicamente, yieldno es una variable de control. Sin
embargo, la agregamos como una variable "auxiliar" ficticia porque se utilizará cuando agreguemos
incertidumbre.
function second_stage_variables(subproblem)
@variables(subproblem, begin
0 <= yield[c=CROPS] # tonnes/acre
0 <= buy[c=CROPS] # tonnes
0 <= sell_in_quota[c=CROPS] <= QUOTA_MAX[c] # tonnes
0 <= sell_no_quota[c=CROPS] # tonnes
end)
end
second_stage_variables (función genérica con 1 método)
Restricciones
Necesitamos definir es la restricción de cantidad mínima. Esto asegura que MIN_QUANTITIES[c]de cada
cultivo se produzca.
function second_stage_constraint_min_quantity(subproblem)
@constraint(subproblem, [c=CROPS],
subproblem[:yield][c] + subproblem[:buy][c] -
subproblem[:sell_in_quota][c] - subproblem[:sell_no_quota][c] >=
MIN_QUANTITIES[c])
end
Objetivo
El objetivo de la segunda etapa es maximizar los ingresos de la venta de cultivos, menos el costo de comprar
maíz y trigo si es necesario para cumplir con la restricción de cantidad mínima.
function second_stage_objective(subproblem)
@stageobjective(subproblem,
sum(
SELL_IN_QUOTA[c] * subproblem[:sell_in_quota][c] +
SELL_NO_QUOTA[c] * subproblem[:sell_no_quota][c] -
BUY_PRICE[c] * subproblem[:buy][c]
for c in CROPS)
end