Integer programming with indicators I have the following question, and I need to write it as an integer programming problem:
A manager of a company wants to by presents to his 100 employers. He can buy the presents from two different suppliers:

Every present costs 110\$. For any present above 500, the manager would have to pay 5\$ extra for insurance (for example, for 502 presents, there will be 10\$ extra for insurance).
Every present costs 120$. For any present above 300, there is a discount of 30% (each present above 300 costs 84\$).

I need to find how many presents he should buy from each supplier, in order to spend the minimal amount of money.
I defined:
$x_1, x_2$ - The number of presents to buy from each supplier.
$z_1$ - Indicator which represents whether or not $x_1 \ge501$
$z_2$ - Indicator which represents whether or not $x_2 \ge301$
I know how to represents the indicators using linear functions, but I don't know how to find a linear objective function.
My best suggestion is:
$$ 110x_1+5z_1(x_1-500)+120x_2-36z_2(x_2-300) $$
However, this is not a linear function, because I multiply the decision variables.
How can I turn it into a linear function?
You can multiply variables in ILP with https://blog.adamfurmanek.pl/2015/08/29/ilp-part-2/ and https://blog.adamfurmanek.pl/2015/09/26/ilp-part-6/ and https://blog.adamfurmanek.pl/2015/10/03/ilp-part-7/
You don't need multiplication, though. Your objective function is effectively:
$
\min(500, x_1) \cdot 110 + \max(x_1 - 500, 0) \cdot 115 + \min(300, x_2) \cdot 120 + \max(x_2 - 300, 0) \cdot 84
$
You can represent max/min functions as comparison + absolute value, as explained in https://blog.adamfurmanek.pl/2015/09/19/ilp-part-5/