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,
Solved
Writing a constraint in AIMMS
Best answer by mateusarakawa
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:
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'
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.