Originally posted by: Ebisa
Many thanks ChrisBr,
In my problem, I have a local demand and a local supply each with different patterns over a period of time. I also have a storage unit that can buffer between supply and demand. I am trying to schedule the charging and discharging pattern of the storage to minimize some parameters. The storage level is float (continuous) and is also subject to some constraints. Now my problem is with the storage_level decision variable. would you give me some ideas on how to go around this?
here is the code of what i was trying to do:
using CP;
int noOfTimesteps = ...;
range time_steps = 1 ..noOfTimesteps;
int time_pts = ...; //time units per unit time step
int c1 = ...;
int c2 = ...;
int c3 = ...;
float max_storage = ...;
float min_storage = ...;
int rate_charging = ...; //constraints on maximum charging rate
int rate_discharging = ...;
float initial_charge_level = ...;
float self_loss_rate = ...;
float charge_eff = ...;
float discharge_eff = ...;
float demand
time_steps = ...;
float local_supply
time_steps = ...;
dvar int charge
time_steps in 0..rate_charging; //actual charging rate
dvar int discharge
time_steps in 0..rate_discharging; //actual discharging rate
dvar int track_charging
i in time_steps in 0..1;
dvar int track_discharging
i in time_steps in 0..1;
dexpr float net_demand
i in time_steps= demand[i] + charge[i]*track_charging[i] - local_supply[i] - discharge[i]*track_discharging[i];
dexpr float sum_net_demand = sum(i in time_steps) net_demand[i];
dexpr float average_net_demand = sum_net_demand/noOfTimesteps;
dexpr float offset
i in time_steps= abs(net_demand[i] - average_net_demand);
dexpr float sum_offset = sum(i in time_steps) offset[i];
dexpr float average_offset = sum_offset/noOfTimesteps;
dexpr float peak_offset = max (i in time_steps) offset[i];
dexpr float charge_level
i in time_steps in 0..max_storage;
execute {
cp.param.FailLimit = 10000;
}
//objective
minimize c1*peak_offset; /*+ c2*average_offset + c3*average_net_demand;*/
//constraints
constraints
{
charge_level[1] == initial_charge_level;
forall(i in 2..noOfTimesteps)
{
charge_level[i] == charge_level
i-1 - self_loss_rate*time_pts + track_charging
i-1*charge
i-1 *charge_eff*time_pts - ((track_discharging
i-1*discharge
i-1) /discharge_eff )*time_pts;
}
forall(i in time_steps)
{
charge_level[i] <= max_storage;
charge_level[i] >= min_storage;
charge[i] <= rate_charging;
discharge[i] <= rate_discharging;
track_charging[i]*track_discharging[i] == 0;
}
charge_level
noOfTimesteps- self_loss_rate*time_pts - track_discharging
noOfTimesteps*discharge
noOfTimesteps*time_pts/discharge_eff >= min_storage;
}
#DecisionOptimization#OPLusingCPOptimizer