else: TS = m.addConstrs(inflow_now[i] + inflow_past[i] == 0 for i in range(4)) m.add_continuous_uncertainty( uncertainty=sampler(t - 1), locations=([(TS[i], inflow_past[i]) for i in range(4)] + [TS[i] for i in range(4)]), ) if t < T / 2: z = m.addVars(4, vtype='B') m.addConstrs(hydro[i] >= z[i] * hydro_['UB'][:4][i] / 2 for i in range(4)) m.addConstrs(thermal_sum[i] >= (1 - z[i]) * thermal_mid_level[i] for i in range(4)) HydroThermal.discretize(n_samples=100, random_state=seed) if solver == 'Extensive': HT_extensive = Extensive(HydroThermal) HT_extensive.solve(outputFlag=0, TimeLimit=time_limit) print('lower bound', HT_extensive.objBound) print('upper bound', HT_extensive.objVal) print('total time', HT_extensive.total_time) print('gap', HT_extensive.MIPGap) if solver == 'SDDiP': HydroThermal.binarize(bin_stage=T) HT_sddp = SDDiP(HydroThermal) HT_sddp.solve( logFile=0, logToConsole=0, cuts=[cut], n_processes=1,
for i in I for j in J) # capacity constraint m.addConstrs( gurobipy.quicksum(B_now[(i, j)] - C_now[(i, j)] for i in I for j in J if l in i and j.startswith(k)) <= R[k] for k in K for l in L) m.addConstrs( (b[(i, j)] <= 0 for i in I for j in J), uncertainty_dependent=[ 6 * i + j for i in range(len(I)) for j in range(len(J)) ]) start_mca = time.time() markovian = airline.discretize( method='SA', n_Markov_states=n_Markov_states, n_sample_paths=n_sample_paths, int_flag=1, ) time_mca = time.time() - start_mca mca['model'].append(idx) mca['iter_MCA'].append(n_sample_paths) mca['time'].append(time_mca) for t in range(1, 15): mca[t].append(markovian.n_Markov_states[t - 1]) # comparison visually of the true process and its Markov chain approximation if idx == 2: simulation = markovian.simulate(1000) true = demand_sampler(numpy.random.RandomState(0), 1000) fig_mca, ax_mca = plt.subplots(6, 2, figsize=(10, 10),