AssetMgt.add_Markovian_uncertainty(g) for t in range(T): m = AssetMgt[t] now, past = m.addStateVars(2, lb=0, obj=0) if t == 0: m.addConstr(now[0] + now[1] == 55) if t in [1, 2]: m.addConstr(past[0] + past[1] == now[0] + now[1], uncertainty_dependent={ past[0]: 0, past[1]: 1 }) if t == 3: y = m.addVar(obj=1) w = m.addVar(obj=-4) m.addConstr(past[0] + past[1] - y + w == 80, uncertainty_dependent={ past[0]: 0, past[1]: 1 }) AssetMgt.discretize( n_Markov_states=25, n_sample_paths=10000, ) # Extensive(AssetMgt).solve() SDDP(AssetMgt).solve(max_iterations=400) result = Evaluation(AssetMgt) result.run(n_simulations=1000) resultTrue = EvaluationTrue(AssetMgt) resultTrue.run(n_simulations=1000)
X_now, X_past = m.addStateVars(I, name='accumulated purchase') if t == 0: m.addConstrs(X_now[j] == 0 for j in range(J)) else: # u_jt # u = m.addVars(J, name='shortage', uncertainty=beta_generator) # v_ijkt # v = m.addVars(I, J, K, name='allocation') # w_jt # w = m.addVars(J, name='production') # x_it # x = m.addVars(I, name='purchase', uncertainty=alpha_generator) ## accumulated number of purchased tools updated ## m.addConstrs(X_now[i] == X_past[i] + x[i] for i in range(I)) # time allocation constraint m.addConstrs( gurobipy.quicksum( gurobipy.quicksum(a[i][j][k] * v[(i, j, k)] for k in range(K)) for j in range(J)) <= c[i] * X_now[i] for i in range(I)) # production allocation constraint m.addConstrs( gurobipy.quicksum(v[(i, j, k)] for i in range(I)) >= w[j] for j in range(J) for k in range(K)) # demand constraint m.addConstrs((w[j] + u[j] >= 0 for j in range(J)), uncertainty=d_generator) semiconductor.discretize(n_samples=20) SDDP(semiconductor).solve(max_iterations=10) result = EvaluationTrue(semiconductor) result.run(n_simulations=1000)
gurobipy.quicksum(exchange[(j, 4)] for j in range(5)) - gurobipy.quicksum(exchange[(4, j)] for j in range(5)) == 0) m.addConstrs(stored_now[i] + spill[i] + hydro[i] - stored_past[i] == inflow_now[i] for i in range(4)) if t == 0: m.addConstrs(stored_past[i] == stored_initial[i] for i in range(4)) m.addConstrs(inflow_now[i] == inflow_initial[i] for i in range(4)) 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)]), ) HydroThermal.discretize(n_samples=n_samples, random_state=seed) HT_sddp = SDDP(HydroThermal) HT_sddp.solve( n_processes=6, n_steps=6, max_iterations=n_iterations, ) result = Evaluation(HydroThermal) result.run(random_state=666, n_simulations=n_simulations) resultTrue = EvaluationTrue(HydroThermal) resultTrue.run(random_state=666, n_simulations=n_simulations) model = 'TS' + str(n_samples) if model == 'TS100': fig = HT_sddp.plot_bounds(window=1, smooth=1) fig.tight_layout() fig.savefig("./result/{}_bounds.png".format(model), dpi=1200)
v = m.addVar(obj=1, lb=-gurobipy.GRB.INFINITY, name='wealth') capm = m.addVars(N, lb = -gurobipy.GRB.INFINITY, name='capm') idio = m.addVars(N, name='idio') m.addConstr(v == gurobipy.quicksum(now[j] for j in range(N+1))) m.addConstrs( now[j] == capm[j] + idio[j] for j in range(N) ) for j in range(N): m.addConstr(past[j] == capm[j], uncertainty_dependent={past[j]:j}) m.addConstr(past[j] == idio[j], uncertainty={past[j]:f(alpha[j],sigma[j])}) m.addConstr(now[N] == (1+rf) * past[N]) AssetMgt.discretize( n_samples=100, method='input', Markov_states=Markov_states, transition_matrix=transition_matrix, random_state=888, ) AssetMgt.set_AVaR(lambda_=lambda_, alpha_=0.25) AssetMgt_SDDP = SDDP(AssetMgt) AssetMgt_SDDP.solve(max_iterations=50, n_steps=3, n_processes=3) evaluation = Evaluation(AssetMgt) evaluation.run(n_simulations=1000, random_state=666) evaluationTrue = EvaluationTrue(AssetMgt) evaluationTrue.run(n_simulations=1000, random_state=666) result = { 'mean':numpy.mean(evaluation.pv)-100, 'std':numpy.std(evaluation.pv), 'VAR': numpy.quantile(evaluation.pv,0.05)-100, 'skewness': stats.skew(evaluation.pv),
for j in range(5)) == demand.iloc[t % 12][i]) m.addConstr( gurobipy.quicksum(exchange[(j, 4)] for j in range(5)) - gurobipy.quicksum(exchange[(4, j)] for j in range(5)) == 0) m.addConstrs( (stored_now[i] + spill[i] + hydro[i] - stored_past[i] == 0 for i in range(4)), uncertainty_dependent=[0, 1, 2, 3], ) if t == 0: m.addConstrs(stored_past[i] == stored_initial[i] for i in range(4)) start = time.time() HydroThermal.discretize( method=method, n_Markov_states=n_Markov_states, n_sample_paths=n_sample_paths, ) time_MCA = time.time() - start HT_sddp = SDDP(HydroThermal) HT_sddp.solve( n_processes=6, n_steps=6, max_iterations=n_iterations, ) result = Evaluation(HydroThermal) result.run(random_state=666, n_simulations=3000) resultTrue = EvaluationTrue(HydroThermal) resultTrue.run(random_state=666, n_simulations=3000) model = method + str(n_Markov_states) if model == 'SA100':
for j in range(5)) == demand.iloc[t % 12][i]) m.addConstr( gurobipy.quicksum(exchange[(j, 4)] for j in range(5)) - gurobipy.quicksum(exchange[(4, j)] for j in range(5)) == 0) m.addConstrs( (stored_now[i] + spill[i] + hydro[i] - stored_past[i] == 0 for i in range(4)), uncertainty_dependent=[0, 1, 2, 3], ) if t == 0: m.addConstrs(stored_past[i] == stored_initial[i] for i in range(4)) start = time.time() HydroThermal.discretize( method='input', Markov_states=Markov_states, transition_matrix=transition_matrix, ) time_MCA = time.time() - start HT_sddp = SDDP(HydroThermal) HT_sddp.solve( n_processes=6, n_steps=6, max_iterations=n_iterations, ) result = Evaluation(HydroThermal) result.run(random_state=666, n_simulations=n_simulations) resultTrue = EvaluationTrue(HydroThermal) resultTrue.run(random_state=666, n_simulations=n_simulations) if model == 'SA100': fig = HT_sddp.plot_bounds(window=1, smooth=1)