java输出总是目标函数上的背包问题
您好,我正在尝试使用java和cplex 12.8创建并解决一个只有1个箱子的简单背包问题。我不明白为什么它总是在输出中给出目标函数的值。 这是我的全部代码:java输出总是目标函数上的背包问题,java,cplex,knapsack-problem,Java,Cplex,Knapsack Problem,您好,我正在尝试使用java和cplex 12.8创建并解决一个只有1个箱子的简单背包问题。我不明白为什么它总是在输出中给出目标函数的值。 这是我的全部代码: public static void solveModel(){ try { n_obj = 5; int capacity = 4 int[] profits = new int[n_obj]; f
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();
}
}
CPLEX计算出问题的最佳解决方案,目标值为28
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();
}
}
默认情况下,CPLEX以完全确定的方式运行。也就是说,当在相同条件下多次运行时(要解决的问题相同,机器相同等),CPLEX将始终返回完全相同的结果。因此,在多次运行您的程序时,没有理由期待不同的解决方案。好的,对于那些感兴趣或将感兴趣的人来说。。。我自己解决了。
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();
}
}
布尔变量的声明是通过以下方式完成的:
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();
}
}
IloNumVar[] x = new IloNumVar[n_obj];
for (int i = 0; i < n_obj; i++) {
//x[i] = model.numVar(0, Double.POSITIVE_INFINITY, IloNumVarType.Bool, "x[" + i +
//"]");
x[i] = model.boolVar();
}
IloNumVar[]x=新的IloNumVar[n_obj];
对于(int i=0;i
我修改了约束条件:
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();
}
}
IloLinearNumExpr lin = model.linearNumExpr();
for (int i = 0; i < n_obj; i++) {
//model.addLe(model.prod(weight[i], x[i]), capacity);
lin.addTerm(x[i], weight[i]);
}
model.addLe(lin, capacity, "Constraints");
IloLinearNumExpr lin=model.linearNumExpr();
对于(int i=0;i
我知道这是一个简单的背包问题,但我是一个cplex初学者,我希望它对其他人有用
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();
}
}
玩得开心也许我解释错了。问题是,对于任何价值清单,它总是在产出中给出利润的总和。我想我在初始化布尔变量时出错了
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();
}
}