1

以前、セットから最小数の整数を選択し、合計 >= 定数を持つ方法について尋ねた質問を投稿しました。私のコードは次のとおりでした:

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 の学生版を持っているので、2 つの目標を使用することはできません。これで、私の新しいコードで問題は解決しますが、回避策や、2 つの目的を 1 つにまとめて同じ機能を維持するためのトリックがあるかどうかを尋ねたいと思います。

編集:合計を最小化するよりも、要素の数を最小化することに関心があります。

4

1 に答える 1

0

私は自分の問題を解決する方法を見つけました。皆さんと共有したいと思います。

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;

お役に立てば幸いです。

于 2014-07-05T14:24:05.240 に答える