Skip to content

Commit 7d6be79

Browse files
committed
Update index
1 parent 8c45d85 commit 7d6be79

24 files changed

+1519
-747
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ The first two notebook cells are modified to ensure that requirements are instal
154154
|Supply chain network|[![supply_chain_simple_routes.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/supply_chain/supply_chain_simple_routes.ipynb)|
155155
|Transportation problem|[![transp_lecture.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/ampl-lecture/transp_lecture.ipynb)|
156156
|Travelling Salesman Problem with subtour elimination|[![tsp_simple_cuts_generic.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/mapgccv/callbacks/tsp_simple_cuts_generic.ipynb)|
157+
|Unit Commitment MINLP with Knitro|[![unit_commitment_minlp_mp2nl.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/marcos-dv/energy/unit_commitment_minlp_mp2nl.ipynb)|
157158
|Unit Commitment Problem with AMPL and Python - Power Grid Lib|[![pglib_uc.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/nfbvs/pglib_uc/pglib_uc.ipynb)|
158159
|Unit Commitment for Colombia's Energy Market|[![unit_commitment_colombia.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/jpbohorquez/uc-colombia/unit_commitment_colombia.ipynb)|
159160
|Unit Commitment for Electrical Power Generation|[![unit_commitment.ipynb](https://img.shields.io/badge/github-%23121011.svg?logo=github)](https://github.com/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|[![Open In Deepnote](https://deepnote.com/buttons/launch-in-deepnote-small.svg)](https://deepnote.com/launch?url=https://github.com/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|[![Open In Kaggle](https://kaggle.com/static/images/open-in-kaggle.svg)](https://kaggle.com/kernels/welcome?src=https://github.com/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|[![Open In Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://console.paperspace.com/github/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/ampl/colab.ampl.com/blob/master/authors/gomfy/energy/unit_commitment.ipynb)|

authors/marcos-dv/energy/minlp.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from amplpy import AMPL
2+
import pandas as pd
3+
import numpy as np
4+
5+
# Unit Commitment data
6+
generators = ['G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'G7']
7+
8+
# Generators data
9+
generators_data = pd.DataFrame({
10+
'min_output': [20, 30, 25, 15, 10, 40, 0],
11+
'max_output': [100, 120, 90, 60, 50, 150, 30],
12+
'ramp_up_limit': [40, 50, 30, 25, 20, 60, 10],
13+
'ramp_down_limit': [40, 50, 30, 25, 20, 60, 10],
14+
'linear_cost': [20, 16, 18, 22, 24, 14, 12],
15+
'quadratic_cost': [0.04, 0.05, 0.06, 0.03, 0.04, 0.036, 0.1],
16+
'startup_cost': [400, 300, 360, 200, 160, 600, 160],
17+
'emission_rate': [0.7, 0.5, 0.6, 0.4, 0.3, 0.8, 0.0]
18+
}, index=generators)
19+
20+
# Generate random demand
21+
num_time_periods = 24*2
22+
time_periods = list(range(1, num_time_periods+1))
23+
24+
np.random.seed(None)
25+
base_demand = 150 + 40 * np.sin(np.linspace(0, 3*np.pi, num_time_periods))
26+
noise = np.random.normal(0, 10, num_time_periods)
27+
demand = (base_demand + noise).clip(min=100).round().astype(int)
28+
29+
# Optimization model and data
30+
ampl = AMPL()
31+
ampl.read('unit_commitment.mod') # This model should reflect renamed sets/vars/params
32+
33+
ampl.set['TIME'] = time_periods
34+
ampl.set['GENERATORS'] = generators
35+
ampl.param['demand'] = demand
36+
ampl.set_data(generators_data, 'GENERATORS')
37+
38+
# Hierarchical Multi-objective configuration
39+
# Higher priority first
40+
ampl.eval('let Total_Cost.objpriority := 2;')
41+
# Set 5% degradation tolerance for total cost
42+
ampl.eval('let Total_Cost.objreltol := 0.05;')
43+
# Second objective (less priority)
44+
ampl.eval('let Total_Emissions.objpriority := 1;')
45+
46+
SOLVER='knitro'
47+
#SOLVER='gurobi'
48+
#SOLVER='xpress'
49+
50+
max_seconds = 10
51+
52+
if SOLVER == 'knitro':
53+
ampl.solve(solver='mp2nl',
54+
knitro_options='maxtime='+str(max_seconds),
55+
verbose=True,
56+
mp2nl_options='solver=knitro obj:multi=2')
57+
else:
58+
ampl.solve(solver=SOLVER,
59+
mp_options='obj:multi=2 outlev=1 timelim='+str(max_seconds),
60+
verbose=True)
61+
62+
is_committed = ampl.get_data('is_committed')
63+
produce = ampl.get_data('power_generated')
64+
startup = ampl.get_data('is_startup')
65+
66+
# Flatten the dataframe values and count 1s and 0s
67+
values = is_committed.to_pandas().values.flatten()
68+
num_ones = (values == 1).sum()
69+
num_zeros = (values == 0).sum()
70+
71+
print(f"Total ON periods (1s): {num_ones}")
72+
print(f"Total OFF periods (0s): {num_zeros}")
73+
74+
print("=== Objective Values ===")
75+
total_cost = ampl.obj['Total_Cost'].value()
76+
total_emissions = ampl.obj['Total_Emissions'].value()
77+
78+
print(f'Total cost: {total_cost:.2f}$')
79+
print(f'Total emissions: {total_emissions:.2f} tons CO₂')
80+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
set GENERATORS;
2+
set TIME ordered;
3+
4+
param demand {TIME} >= 0; # Power demand at each time
5+
param min_output {GENERATORS} >= 0; # Minimum power output
6+
param max_output {g in GENERATORS} >= min_output[g]; # Maximum power output
7+
param ramp_up_limit {GENERATORS} >= 0;
8+
param ramp_down_limit {GENERATORS} >= 0;
9+
10+
param linear_cost {GENERATORS}; # Linear cost coefficient
11+
param quadratic_cost {GENERATORS} >= 0; # Quadratic cost coefficient
12+
param startup_cost {GENERATORS} >= 0; # Startup cost
13+
14+
param emission_rate {GENERATORS} >= 0; # Tons CO2 per MW produced
15+
16+
var is_committed {GENERATORS, TIME} binary; # 1 if generator is ON
17+
var power_generated {gen in GENERATORS, TIME} >= 0 <= max_output[gen]; # MW produced
18+
var is_startup {GENERATORS, TIME} binary; # 1 if generator starts up
19+
20+
# Generation only if committed
21+
subject to Generation_Commitment {gen in GENERATORS, t in TIME}:
22+
power_generated[gen,t] > 0 <==> is_committed[gen,t] = 1;
23+
24+
# Meet demand in each period
25+
subject to Demand_Satisfaction {t in TIME}:
26+
sum {gen in GENERATORS} power_generated[gen,t] >= demand[t];
27+
28+
# Startup in first period
29+
subject to Startup_First {gen in GENERATORS}:
30+
is_startup[gen, first(TIME)] == is_committed[gen, first(TIME)];
31+
32+
# Startup logic in subsequent periods
33+
subject to Startup_Transition {gen in GENERATORS, t in TIME: ord(t) > 1}:
34+
is_startup[gen,t] <==> (is_committed[gen,t] and !is_committed[gen,prev(t)]);
35+
36+
subject to Min_Gen_If_On {gen in GENERATORS, t in TIME}:
37+
power_generated[gen,t] == 0 or power_generated[gen,t] >= min_output[gen];
38+
39+
# Ramp-up limits
40+
subject to Ramp_Up {gen in GENERATORS, t in TIME: ord(t) > 1}:
41+
power_generated[gen,t] - power_generated[gen,prev(t)] <= ramp_up_limit[gen];
42+
43+
# Ramp-down limits
44+
subject to Ramp_Down {gen in GENERATORS, t in TIME: ord(t) > 1}:
45+
power_generated[gen,prev(t)] - power_generated[gen,t] <= ramp_down_limit[gen];
46+
47+
# Objective 1: Minimize total operating + startup cost
48+
minimize Total_Cost:
49+
sum {gen in GENERATORS, t in TIME}
50+
(linear_cost[gen] * power_generated[gen,t] +
51+
quadratic_cost[gen] * power_generated[gen,t]^2)
52+
+ sum {gen in GENERATORS, t in TIME} startup_cost[gen] * is_startup[gen,t];
53+
54+
# Objective 2: Minimize total emissions
55+
minimize Total_Emissions:
56+
sum {gen in GENERATORS, t in TIME} emission_rate[gen] * power_generated[gen,t];
57+
58+
# Multi-objective support
59+
suffix objpriority;
60+
suffix objabstol;
61+
suffix objreltol;

0 commit comments

Comments
 (0)