AMPL минимизирует сумму целых чисел в наборе и количество выбранных элементов

Ранее я публиковал вопрос, в котором спрашивал о том, как выбрать минимальное количество целых чисел из набора и иметь сумму> = константу. Мой код был таким, как показано:

option solver cplex;
set x:= {4, 5, 7, 1};
param c:= 10;
var u{x} binary;
minimize output : sum {i in x} u[i];
subject to constraint: sum {i in x} u[i]*i >= c;
solve;
display u;

Я решил также добавить новую цель - минимизировать сумму. В предыдущем примере cplex производит 12 (7 и 5). Я хочу, чтобы получилось 11 (7 и 4). Для этого я добавил такую ​​цель:

minimize output : sum {i in x} u[i]*i;

К сожалению, у меня есть студенческая версия AMPL, поэтому я не могу использовать две цели. Теперь мой новый код решит проблему, но я хочу спросить, есть ли обходной путь или уловка, чтобы объединить две цели в одну, но с той же функциональностью.

РЕДАКТИРОВАТЬ: Меня больше интересует минимизация количества элементов, чем минимизация суммы.


person user3787524    schedule 04.07.2014    source источник
comment
Чтобы заявить, что ваш вопрос решен, примите ответ, который его решил. Это может быть ваш собственный ответ.   -  person Pascal Cuoq    schedule 05.07.2014
comment
Спасибо, Али, я попробовал, но появилось всплывающее сообщение о том, что я могу принять свой ответ завтра. Я жду до завтра, чтобы принять это.   -  person user3787524    schedule 05.07.2014


Ответы (1)


Я нашел способ решить свою проблему. Я хотел бы поделиться этим с вами, ребята.

option solver cplex;
set x:= {4, 5, 7, 1};                                                #this is the set where I want to chose the integers from.
param c:= 10;                                                        #this is the constant i want the sum to be >= to.
param MinNumberOfELements;                                           #this will be used later. Explanation will be added then.
var u{x} binary;                                                     #binary array, indicates the corresponding elements in x is used.  u[4] = 1 -->  4 is taken in the output
minimize output : sum {i in x} u[i];                                 #here we minimize number of taken elements without caring of minimizing the sum
subject to constraint: sum {i in x} u[i]*i >= c;                     # the sum must be >= to the constant c.
solve;                                                               #this will cause the objective "output" to have some value

let MinNumberOfELements := output;                                   # take the value of "output" and store it in this param.
drop output;                                                         #since we can have only 1 objective, we drop the old one.

minimize output2: sum {i in x} u[i]*i;                               # in this step, we minimize the sum
subject to constraint2: sum {i in x} u[i] = MinNumberOfELements;     #number of elements chosen must be = to MinNumberOfELements
solve;
display output2,u;

Надеюсь, вы сочтете это полезным.

person user3787524    schedule 05.07.2014