Dear Staff,
I need help writing the following constraint using the AIMMS language.
I have two indexes:
c
a
Where "a" indicates years.
I have a variable y(c,a)
I would like to define a summation over "c" and over "a" as less than or equal to a value. But the summation over "a" should be done only from the first year until the current year.
I am trying this formulation but something is wrong with it:
sum((c, a1|(a1="A01") and (a1=ord(a))), y(c,a1)) <= Value
Can you please help me writing this correctly using the AIMMS syntax?
Thank you,
Page 1 / 1
Hi, @Chibo .
If your year set is for instance { 2016, 2017, 2018, 2019 } and for each year you want to create the summation, I would write:
Constraint_SumYears
Index Domain: (a)
Definition:
With this approach you will create 4 constraints, 1 for each year.
2016 : sum(c, y(c,2016)) <= value
2017: sum(c, y(c,2016)) + sum(c, y(c,2017)) <= value
2018: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) <= value
2019: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) + sum(c, y(c,2019)) <= value
But if you want to create the constraint only for 2019
Constraint_SumYears
IndexDomain:
Definition:
So, if your ElementParameter_CurrentYear is '2019' you will create: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) + sum(c, y(c,2019)) <= value
Remark: Check if your year set is ordered, in case it's not a calendar.
Tips:
Hope it helps!
If your year set is for instance { 2016, 2017, 2018, 2019 } and for each year you want to create the summation, I would write:
Constraint_SumYears
Index Domain: (a)
Definition:
code:
sum((c,a_aux) | (ord(a_aux) <= ord(a)), y(c,a_aux)) <= value
With this approach you will create 4 constraints, 1 for each year.
2016 : sum(c, y(c,2016)) <= value
2017: sum(c, y(c,2016)) + sum(c, y(c,2017)) <= value
2018: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) <= value
2019: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) + sum(c, y(c,2019)) <= value
But if you want to create the constraint only for 2019
Constraint_SumYears
IndexDomain:
Definition:
code:
sum((c,a) | (ord(a) <= ord(ElementParameter_CurrentYear)), y(c,a))
<= value
So, if your ElementParameter_CurrentYear is '2019' you will create: sum(c, y(c,2016)) + sum(c, y(c,2017)) + sum(c, y(c,2018)) + sum(c, y(c,2019)) <= value
Remark: Check if your year set is ordered, in case it's not a calendar.
Tips:
- In the second approach you can create a parameterOrdCurrentYear := ord(ElementParameter_CurrentYear) and use it instead.
- In your code, you should refer to element A01 with single quotation mark 'A01'
Hope it helps!
Thank you so much! You are right, it is very straightforward with your formulation. I am trying the first one and it seems it is working fine.
Thank you very very much for your help! Very kind of you
Thank you very very much for your help! Very kind of you
Reply
Sign up
Already have an account? Login
Please use your business or academic e-mail address to register
Login to the community
No account yet? Create an account
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.