The objective function you described is called multilinear.
Although not necessarily the best way of solving this problem, it can be "lifted" into a higher dimensional space, thereby becoming a non-convex quadratic objective subject to non-convex quadratic constraints; specifically becoming a bilinear optimization problem. That is accomplished by introducing new variables for various products of variables in such a manner that there are no products involving more than 2 variables. Such a formulation can then be solved with a bilinear solver, such as Gurobi, which can solve it to global optimality if it doesn't run out of time or memory. (Note that CPLEX's QCQP solver could not be used because it does not allow non-convex quadratic constraints).
In you example, introduce variables x1_2
and x1_2_3
, along with constraints
x1_2 = x1*x2
x1_2_3 = x1_2*x3
The objective can then be written as .3 x1 - .5 x2 + .4 x3 + .9 x1_2 - x1_2_3
.
This formulation can be provided to any solver which can handle any combination of non-convex quadratic objective and quadratic equality constraints (in addition to the linear constraints your problem has).
If you use a more general purpose non-convex global solver, you can provide it either the "lifted" formulation as shown above, or enter your original formulation as is. In such case, it might be better to use the original formulation, and let the solver handle any reformulations.
Another approach is to directly provide one of the above formulations to a local non-convex optimizer, in which case I suspect the original formulation might be best.