Привет , я пытаюсь создать и решить простую проблему с рюкзаком, используя только 1 бункер, используя java и cplex 12.8.Я не понимаю, почему это всегда дает на выходе значение целевой функции.Вот мой полный код:
public static void solveModel(){
try {
n_obj = 5;
int capacity = 4
int[] profits = new int[n_obj];
for(int i = 0; i < n_obj; i++ ){
weight[i] = ThreadLocalRandom.current().nextInt(1, n_obj/2 + 1);
profits[i] = ThreadLocalRandom.current().nextInt(1, 12);
}
for(int i = 0; i < weight.length; i++){
System.out.println("Weight " + i + ":\t" + weight[i]);
System.out.println("Profit " + i + ":\t" + profits[i]);
}
IloCplex model = new IloCplex();
IloNumVar x = model.boolVar();
IloLinearNumExpr obj = model.linearNumExpr();
for(int i = 0; i < n_obj; i++){
obj.addTerm(profits[i], x);
}
//obj function
model.addMaximize(obj);
//constraints
for(int i = 0; i < n_obj; i++){
model.addLe(model.prod(weight[i], x), capacity) ;
model.addEq(x, 1);
}
if (model.solve()) {
System.out.println("Obj = " + model.getObjValue());
}
else {
System.out.println("Problem not solved");
}
model.end();
} catch (IloException e) {
e.printStackTrace();
}
}
Я установил n_obj и емкость на фиксированные значения, чтобы сделать его максимально простым.Каждый раз вывод такой:
Weight 0: 1
Profit 0: 2
Weight 1: 1
Profit 1: 11
Weight 2: 2
Profit 2: 2
Weight 3: 1
Profit 3: 7
Weight 4: 2
Profit 4: 6
Found incumbent of value 28.000000 after 0.00 sec. (0.00 ticks)
Root node processing (before b&c):
Real time = 0.00 sec. (0.00 ticks)
Parallel b&c, 8 threads:
Real time = 0.00 sec. (0.00 ticks)
Sync time (average) = 0.00 sec.
Wait time (average) = 0.00 sec.
------------
Total (root+branch&cut) = 0.00 sec. (0.00 ticks)
Obj = 28.0