11
11
12
12
public final class Main {
13
13
14
+ /**
15
+ * Main entry point for the application.
16
+ *
17
+ * @param args Command line arguments.
18
+ */
14
19
public static void main (String [] args ) {
15
20
try {
16
21
// Parse arguments.
@@ -43,7 +48,7 @@ public static void main(String[] args) {
43
48
44
49
// Setup Gurobi environment and model.
45
50
GRBEnv env = new GRBEnv (true );
46
- env .set ("OutputFlag" , "0" ); // Disable output if needed
51
+ // env.set("OutputFlag", "0"); // Disable output if needed
47
52
env .start ();
48
53
GRBModel model = new GRBModel (env );
49
54
@@ -53,9 +58,10 @@ public static void main(String[] args) {
53
58
// Create assignment variable for each item in each knapsack.
54
59
// Variables are binary, indicating whether an item is assigned to a knapsack.
55
60
List <GRBVar > variables = new ArrayList <>();
56
- List <Item > inputItems = input .getItems ();
57
- for (Knapsack knapsack : input .getKnapsacks ()) {
58
- for (Item item : inputItems ) {
61
+ List <Item > items = input .getItems ();
62
+ List <Knapsack > knapsacks = input .getKnapsacks ();
63
+ for (Knapsack knapsack : knapsacks ) {
64
+ for (Item item : items ) {
59
65
variables .add (model .addVar (0.0 , 1.0 , 0.0 , GRB .BINARY , knapsack .getId () + "_" + item .getId ()));
60
66
}
61
67
}
@@ -64,29 +70,29 @@ public static void main(String[] args) {
64
70
model .update ();
65
71
66
72
// Create capacity constraint.
67
- for (int i = 0 ; i < input . getKnapsacks () .size (); ++i ) {
68
- Knapsack knapsack = input . getKnapsacks () .get (i );
73
+ for (int i = 0 ; i < knapsacks .size (); ++i ) {
74
+ Knapsack knapsack = knapsacks .get (i );
69
75
GRBLinExpr knapsackExpr = new GRBLinExpr ();
70
- for (int j = 0 ; j < inputItems .size (); ++j ) {
71
- knapsackExpr .addTerm (inputItems .get (j ).getWeight (), variables .get (i * inputItems .size () + j ));
76
+ for (int j = 0 ; j < items .size (); ++j ) {
77
+ knapsackExpr .addTerm (items .get (j ).getWeight (), variables .get (i * items .size () + j ));
72
78
}
73
79
model .addConstr (knapsackExpr , GRB .LESS_EQUAL , knapsack .getCapacity (), "capacity_" + knapsack .getId ());
74
80
}
75
81
76
82
// Ensure that each item can only be assigned once.
77
- for (int j = 0 ; j < inputItems .size (); ++j ) {
83
+ for (int j = 0 ; j < items .size (); ++j ) {
78
84
GRBLinExpr itemExpr = new GRBLinExpr ();
79
- for (int i = 0 ; i < input . getKnapsacks () .size (); ++i ) {
80
- itemExpr .addTerm (1.0 , variables .get (i * inputItems .size () + j ));
85
+ for (int i = 0 ; i < knapsacks .size (); ++i ) {
86
+ itemExpr .addTerm (1.0 , variables .get (i * items .size () + j ));
81
87
}
82
- model .addConstr (itemExpr , GRB .LESS_EQUAL , 1.0 , "item_assignment_" + inputItems .get (j ).getId ());
88
+ model .addConstr (itemExpr , GRB .LESS_EQUAL , 1.0 , "item_assignment_" + items .get (j ).getId ());
83
89
}
84
90
85
91
// Create the objective function.
86
92
GRBLinExpr objectiveExpr = new GRBLinExpr ();
87
- for (int i = 0 ; i < input . getKnapsacks () .size (); ++i ) {
88
- for (int j = 0 ; j < inputItems .size (); ++j ) {
89
- objectiveExpr .addTerm (inputItems .get (j ).getValue (), variables .get (i * inputItems .size () + j ));
93
+ for (int i = 0 ; i < knapsacks .size (); ++i ) {
94
+ for (int j = 0 ; j < items .size (); ++j ) {
95
+ objectiveExpr .addTerm (items .get (j ).getValue (), variables .get (i * items .size () + j ));
90
96
}
91
97
}
92
98
model .setObjective (objectiveExpr , GRB .MAXIMIZE );
@@ -98,13 +104,13 @@ public static void main(String[] args) {
98
104
List <Assignment > assignments = new ArrayList <>();
99
105
Set <String > unassignedItems = new HashSet <>();
100
106
for (int i = 0 ; i < variables .size (); ++i ) {
101
- int knapsackIndex = i / inputItems .size ();
102
- int itemIndex = i % inputItems .size ();
107
+ int knapsackIndex = i / items .size ();
108
+ int itemIndex = i % items .size ();
103
109
if (variables .get (i ).get (GRB .DoubleAttr .X ) > 0.5 ) {
104
110
assignments
105
- .add (new Assignment (inputItems .get (itemIndex ).getId (), input . getKnapsacks () .get (knapsackIndex ).getId ()));
111
+ .add (new Assignment (items .get (itemIndex ).getId (), knapsacks .get (knapsackIndex ).getId ()));
106
112
} else {
107
- unassignedItems .add (inputItems .get (itemIndex ).getId ());
113
+ unassignedItems .add (items .get (itemIndex ).getId ());
108
114
}
109
115
}
110
116
Solution solution = new Solution (assignments , new ArrayList <>(unassignedItems ));
@@ -125,7 +131,11 @@ public static void main(String[] args) {
125
131
"Gurobi" ,
126
132
convertStatus (model .get (GRB .IntAttr .Status )),
127
133
model .get (GRB .IntAttr .NumVars ),
128
- model .get (GRB .IntAttr .NumConstrs ));
134
+ model .get (GRB .IntAttr .NumConstrs ),
135
+ items .size (),
136
+ knapsacks .size (),
137
+ assignments .size (),
138
+ unassignedItems .size ());
129
139
130
140
// Write output.
131
141
Output .write (output , options .getOutputPath ());
@@ -140,6 +150,11 @@ public static void main(String[] args) {
140
150
}
141
151
}
142
152
153
+ /**
154
+ * Prepares the output directory by creating necessary subdirectories.
155
+ *
156
+ * @param outputPath The path to the output directory.
157
+ */
143
158
private static void prepareOutputDirectory (String outputPath ) {
144
159
// Prepare output directory if it does not exist.
145
160
Path solutionsPath = Paths .get (outputPath , "solutions" );
@@ -164,6 +179,12 @@ private static void prepareOutputDirectory(String outputPath) {
164
179
}
165
180
}
166
181
182
+ /**
183
+ * Converts Gurobi status codes to human-readable strings.
184
+ *
185
+ * @param status The Gurobi status code.
186
+ * @return A string representation of the status.
187
+ */
167
188
public static String convertStatus (int status ) {
168
189
switch (status ) {
169
190
case GRB .Status .LOADED :
0 commit comments