Main question
Context: I specified an ILP encoding like the following:
<some preceding constraints bounding all variables in the objective term>
constraint <objective term> >= c;
solve maximize <objective term>;
Now, the weird thing is that I was able to derive multiple encodings of the form, where increasing the constant c
would increase the final value of <objective term>
. Still, the solver says the solution is optimal (independent of the value chosen for c
). If c
is too high it returns “UNSATISFIABLE”, so it is not unbounded.
Question: I was wondering if there some conditions that need to be met by an encoding for the solver to return a maximal solution. (Something similar to undefined behavior in programming languages like C.)
More context on the encoding
If not, I will add more info on my encoding below. I tried to minify it but this was the smallest one I was able to derive:
var -1e+08..1e+08: v0;
var -1e+08..1e+08: v1;
var -1e+08..1e+08: v2;
var -1e+08..1e+08: v3;
var -1e+08..1e+08: v4;
var -1e+08..1e+08: v5;
var -1e+08..1e+08: v6;
var -1e+08..1e+08: v7;
var -1e+08..1e+08: v8;
var -1e+08..1e+08: v9;
var -1e+08..1e+08: v10;
var -1e+08..1e+08: v11;
var -1e+08..1e+08: v12;
var -1e+08..1e+08: v13;
var -1e+08..1e+08: v14;
var -1e+08..1e+08: v15;
var -1e+08..1e+08: v16;
var -1e+08..1e+08: v17;
var -1e+08..1e+08: v18;
var -1e+08..1e+08: v19;
var -1e+08..1e+08: v20;
var -1e+08..1e+08: v21;
var -1e+08..1e+08: v22;
var -1e+08..1e+08: v23;
var -1e+08..1e+08: v24;
var -1e+08..1e+08: v25;
var -1e+08..1e+08: v26;
var -1e+08..1e+08: v27;
var -1e+08..1e+08: v28;
var -1e+08..1e+08: v29;
var -1e+08..1e+08: v30;
var -1e+08..1e+08: v31;
var -1e+08..1e+08: v32;
var -1e+20..1e+20: v33;
var -1e+20..1e+20: v34;
var -1e+20..1e+20: v35;
var -1e+20..1e+20: v36;
var -1e+20..1e+20: v37;
var -1e+20..1e+20: v38;
var -1e+20..1e+20: v39;
var -1e+20..1e+20: v40;
var -1e+20..1e+20: v41;
var -1e+20..1e+20: v42;
var -1e+20..1e+20: v43;
var -1e+20..1e+20: v44;
var -1e+20..1e+20: v45;
var -1e+20..1e+20: v46;
var -1e+20..1e+20: v47;
var -1e+20..1e+20: v48;
var -1e+20..1e+20: v49;
var -1e+20..1e+20: v50;
var -1e+20..1e+20: v51;
var -1e+20..1e+20: v52;
var -1e+20..1e+20: v53;
var -1e+20..1e+20: v54;
var -1e+20..1e+20: v55;
var -1e+20..1e+20: v56;
var -1e+20..1e+20: v57;
var -1e+20..1e+20: v58;
var -1e+20..1e+20: v59;
var -1e+20..1e+20: v60;
var -1e+20..1e+20: v61;
var -1e+20..1e+20: v62;
var -1e+20..1e+20: v63;
var -1e+20..1e+20: v64;
var -1e+20..1e+20: v65;
var -1e+20..1e+20: v66;
var -1e+20..1e+20: v67;
var -1e+20..1e+20: v68;
var -1e+20..1e+20: v69;
var -1e+20..1e+20: v70;
var -1e+20..1e+20: v71;
var -1e+20..1e+20: v72;
var -1e+20..1e+20: v73;
var -1e+20..1e+20: v74;
var -1e+20..1e+20: v75;
var -1e+20..1e+20: v76;
var -1e+20..1e+20: v77;
var -1e+20..1e+20: v78;
var -1e+20..1e+20: v79;
var -1e+20..1e+20: v80;
var -1e+20..1e+20: v81;
var -1e+20..1e+20: v82;
var -1e+20..1e+20: v83;
var -1e+20..1e+20: v84;
var -1e+20..1e+20: v85;
var -1e+20..1e+20: v86;
var -1e+20..1e+20: v87;
var -1e+20..1e+20: v88;
var -1e+20..1e+20: v89;
var -1e+20..1e+20: v90;
var -1e+20..1e+20: v91;
var -1e+20..1e+20: v92;
var -1e+20..1e+20: v93;
var -1e+20..1e+20: v94;
var -1e+20..1e+20: v95;
var -1e+20..1e+20: v96;
var -1e+20..1e+20: v97;
var -1e+20..1e+20: v98;
var -1e+20..1e+20: v99;
var -1e+20..1e+20: v100;
var -1e+20..1e+20: v101;
var -1e+20..1e+20: v102;
var -1e+20..1e+20: v103;
var -1e+20..1e+20: v104;
var {0,1}: v105;
var {0,1}: v106;
var {0,1}: v107;
var {0,1}: v108;
var {0,1}: v109;
var {0,1}: v110;
var {0,1}: v111;
var {0,1}: v112;
var {0,1}: v113;
var {0,1}: v114;
var {0,1}: v115;
var {0,1}: v116;
var {0,1}: v117;
var {0,1}: v118;
var {0,1}: v119;
var {0,1}: v120;
var {0,1}: v121;
var {0,1}: v122;
constraint 1 <= 1 * v32;
constraint 1 * v32 <= 1;
constraint 0 <= 1 * v105;
constraint 1 * v105 <= 1;
constraint -1 * v33 + 1 * v35 <= 0;
constraint -1 * v34 + 1 * v35 <= 0;
constraint -1e+09 * v32 + 1 * v33 + -1 * v35 + 1e+09 * v105 <= 0;
constraint 1 * v34 + -1 * v35 + -1e+09 * v105 <= 0;
constraint 0 <= 1 * v6 + -1 * v7 + -1 * v14 + 1 * v16 + -1 * v33;
constraint 1 * v6 + -1 * v7 + -1 * v14 + 1 * v16 + -1 * v33 <= 0;
constraint 0 <= 1 * v2 + 1 * v5 + 1 * v6 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v34;
constraint 1 * v2 + 1 * v5 + 1 * v6 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v34 <= 0;
constraint 1 * v35 <= 1;
constraint 0 <= 1 * v106;
constraint 1 * v106 <= 1;
constraint -1 * v37 + 1 * v39 <= 0;
constraint -1 * v38 + 1 * v39 <= 0;
constraint -1e+09 * v32 + 1 * v37 + -1 * v39 + 1e+09 * v106 <= 0;
constraint 1 * v38 + -1 * v39 + -1e+09 * v106 <= 0;
constraint 0 <= 1 * v6 + -1 * v8 + -1 * v11 + 1 * v13 + -1 * v37;
constraint 1 * v6 + -1 * v8 + -1 * v11 + 1 * v13 + -1 * v37 <= 0;
constraint 0 <= 1 * v2 + 1 * v5 + 1 * v6 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v38;
constraint 1 * v2 + 1 * v5 + 1 * v6 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v38 <= 0;
constraint 1 * v39 <= 1;
constraint 0 <= 1 * v107;
constraint 1 * v107 <= 1;
constraint -1 * v41 + 1 * v43 <= 0;
constraint -1 * v42 + 1 * v43 <= 0;
constraint -1e+09 * v32 + 1 * v41 + -1 * v43 + 1e+09 * v107 <= 0;
constraint 1 * v42 + -1 * v43 + -1e+09 * v107 <= 0;
constraint 0 <= 1 * v3 + -1 * v4 + -1 * v41;
constraint 1 * v3 + -1 * v4 + -1 * v41 <= 0;
constraint 0 <= 1 * v2 + 1 * v3 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v42;
constraint 1 * v2 + 1 * v3 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v42 <= 0;
constraint 1 * v43 <= 1;
constraint 0 <= 1 * v108;
constraint 1 * v108 <= 1;
constraint -1 * v45 + 1 * v47 <= 0;
constraint -1 * v46 + 1 * v47 <= 0;
constraint -1e+09 * v32 + 1 * v45 + -1 * v47 + 1e+09 * v108 <= 0;
constraint 1 * v46 + -1 * v47 + -1e+09 * v108 <= 0;
constraint 0 <= -1 * v3 + 1 * v4 + -1 * v45;
constraint -1 * v3 + 1 * v4 + -1 * v45 <= 0;
constraint 0 <= 1 * v2 + 1 * v4 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v46;
constraint 1 * v2 + 1 * v4 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v46 <= 0;
constraint 1 * v47 <= 1;
constraint 0 <= 1 * v109;
constraint 1 * v109 <= 1;
constraint -1 * v49 + 1 * v51 <= 0;
constraint -1 * v50 + 1 * v51 <= 0;
constraint -1e+09 * v32 + 1 * v49 + -1 * v51 + 1e+09 * v109 <= 0;
constraint 1 * v50 + -1 * v51 + -1e+09 * v109 <= 0;
constraint 0 <= 1 * v0 + -1 * v1 + -1 * v49;
constraint 1 * v0 + -1 * v1 + -1 * v49 <= 0;
constraint 0 <= 1 * v0 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v50;
constraint 1 * v0 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v50 <= 0;
constraint 1 * v51 <= 1;
constraint 0 <= 1 * v110;
constraint 1 * v110 <= 1;
constraint -1 * v53 + 1 * v55 <= 0;
constraint -1 * v54 + 1 * v55 <= 0;
constraint -1e+09 * v32 + 1 * v53 + -1 * v55 + 1e+09 * v110 <= 0;
constraint 1 * v54 + -1 * v55 + -1e+09 * v110 <= 0;
constraint 0 <= -1 * v0 + 1 * v1 + -1 * v53;
constraint -1 * v0 + 1 * v1 + -1 * v53 <= 0;
constraint 0 <= 1 * v1 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v54;
constraint 1 * v1 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v54 <= 0;
constraint 1 * v55 <= 1;
constraint 0 <= 1 * v111;
constraint 1 * v111 <= 1;
constraint -1 * v57 + 1 * v59 <= 0;
constraint -1 * v58 + 1 * v59 <= 0;
constraint -1e+09 * v32 + 1 * v57 + -1 * v59 + 1e+09 * v111 <= 0;
constraint 1 * v58 + -1 * v59 + -1e+09 * v111 <= 0;
constraint 0 <= 1 * v7 + -1 * v9 + -1 * v26 + 1 * v28 + -1 * v57;
constraint 1 * v7 + -1 * v9 + -1 * v26 + 1 * v28 + -1 * v57 <= 0;
constraint 0 <= 1 * v2 + 1 * v3 + 1 * v7 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v58;
constraint 1 * v2 + 1 * v3 + 1 * v7 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v58 <= 0;
constraint 1 * v59 <= 1;
constraint 0 <= 1 * v112;
constraint 1 * v112 <= 1;
constraint -1 * v61 + 1 * v63 <= 0;
constraint -1 * v62 + 1 * v63 <= 0;
constraint -1e+09 * v32 + 1 * v61 + -1 * v63 + 1e+09 * v112 <= 0;
constraint 1 * v62 + -1 * v63 + -1e+09 * v112 <= 0;
constraint 0 <= 1 * v7 + -1 * v9 + -1 * v23 + 1 * v25 + -1 * v61;
constraint 1 * v7 + -1 * v9 + -1 * v23 + 1 * v25 + -1 * v61 <= 0;
constraint 0 <= 1 * v0 + 1 * v5 + 1 * v7 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v62;
constraint 1 * v0 + 1 * v5 + 1 * v7 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v62 <= 0;
constraint 1 * v63 <= 1;
constraint 0 <= 1 * v113;
constraint 1 * v113 <= 1;
constraint -1 * v65 + 1 * v67 <= 0;
constraint -1 * v66 + 1 * v67 <= 0;
constraint -1e+09 * v32 + 1 * v65 + -1 * v67 + 1e+09 * v113 <= 0;
constraint 1 * v66 + -1 * v67 + -1e+09 * v113 <= 0;
constraint 0 <= 1 * v8 + -1 * v9 + -1 * v20 + 1 * v22 + -1 * v65;
constraint 1 * v8 + -1 * v9 + -1 * v20 + 1 * v22 + -1 * v65 <= 0;
constraint 0 <= 1 * v2 + 1 * v3 + 1 * v8 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v66;
constraint 1 * v2 + 1 * v3 + 1 * v8 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v66 <= 0;
constraint 1 * v67 <= 1;
constraint 0 <= 1 * v114;
constraint 1 * v114 <= 1;
constraint -1 * v69 + 1 * v71 <= 0;
constraint -1 * v70 + 1 * v71 <= 0;
constraint -1e+09 * v32 + 1 * v69 + -1 * v71 + 1e+09 * v114 <= 0;
constraint 1 * v70 + -1 * v71 + -1e+09 * v114 <= 0;
constraint 0 <= 1 * v8 + -1 * v9 + -1 * v17 + 1 * v19 + -1 * v69;
constraint 1 * v8 + -1 * v9 + -1 * v17 + 1 * v19 + -1 * v69 <= 0;
constraint 0 <= 1 * v0 + 1 * v5 + 1 * v8 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v70;
constraint 1 * v0 + 1 * v5 + 1 * v8 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v70 <= 0;
constraint 1 * v71 <= 1;
constraint 0 <= 1 * v115;
constraint 1 * v115 <= 1;
constraint -1 * v73 + 1 * v75 <= 0;
constraint -1 * v74 + 1 * v75 <= 0;
constraint -1e+09 * v32 + 1 * v73 + -1 * v75 + 1e+09 * v115 <= 0;
constraint 1 * v74 + -1 * v75 + -1e+09 * v115 <= 0;
constraint 0 <= 1 * v26 + -1 * v27 + -1 * v29 + 1 * v31 + -1 * v73;
constraint 1 * v26 + -1 * v27 + -1 * v29 + 1 * v31 + -1 * v73 <= 0;
constraint 0 <= 1 * v2 + 1 * v3 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v26 + 1 * v31 + -1 * v74;
constraint 1 * v2 + 1 * v3 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v26 + 1 * v31 + -1 * v74 <= 0;
constraint 1 * v75 <= 1;
constraint 0 <= 1 * v116;
constraint 1 * v116 <= 1;
constraint -1 * v77 + 1 * v79 <= 0;
constraint -1 * v78 + 1 * v79 <= 0;
constraint -1e+09 * v32 + 1 * v77 + -1 * v79 + 1e+09 * v116 <= 0;
constraint 1 * v78 + -1 * v79 + -1e+09 * v116 <= 0;
constraint 0 <= 1 * v26 + -1 * v27 + -1 * v29 + 1 * v31 + -1 * v77;
constraint 1 * v26 + -1 * v27 + -1 * v29 + 1 * v31 + -1 * v77 <= 0;
constraint 0 <= 1 * v2 + 1 * v4 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v26 + 1 * v31 + -1 * v78;
constraint 1 * v2 + 1 * v4 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v26 + 1 * v31 + -1 * v78 <= 0;
constraint 1 * v79 <= 1;
constraint 0 <= 1 * v117;
constraint 1 * v117 <= 1;
constraint -1 * v81 + 1 * v83 <= 0;
constraint -1 * v82 + 1 * v83 <= 0;
constraint -1e+09 * v32 + 1 * v81 + -1 * v83 + 1e+09 * v117 <= 0;
constraint 1 * v82 + -1 * v83 + -1e+09 * v117 <= 0;
constraint 0 <= 1 * v23 + -1 * v24 + -1 * v29 + 1 * v31 + -1 * v81;
constraint 1 * v23 + -1 * v24 + -1 * v29 + 1 * v31 + -1 * v81 <= 0;
constraint 0 <= 1 * v0 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v23 + 1 * v28 + 1 * v31 + -1 * v82;
constraint 1 * v0 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v23 + 1 * v28 + 1 * v31 + -1 * v82 <= 0;
constraint 1 * v83 <= 1;
constraint 0 <= 1 * v118;
constraint 1 * v118 <= 1;
constraint -1 * v85 + 1 * v87 <= 0;
constraint -1 * v86 + 1 * v87 <= 0;
constraint -1e+09 * v32 + 1 * v85 + -1 * v87 + 1e+09 * v118 <= 0;
constraint 1 * v86 + -1 * v87 + -1e+09 * v118 <= 0;
constraint 0 <= 1 * v23 + -1 * v24 + -1 * v29 + 1 * v31 + -1 * v85;
constraint 1 * v23 + -1 * v24 + -1 * v29 + 1 * v31 + -1 * v85 <= 0;
constraint 0 <= 1 * v1 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v23 + 1 * v28 + 1 * v31 + -1 * v86;
constraint 1 * v1 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v14 + 1 * v19 + 1 * v22 + 1 * v23 + 1 * v28 + 1 * v31 + -1 * v86 <= 0;
constraint 1 * v87 <= 1;
constraint 0 <= 1 * v119;
constraint 1 * v119 <= 1;
constraint -1 * v89 + 1 * v91 <= 0;
constraint -1 * v90 + 1 * v91 <= 0;
constraint -1e+09 * v32 + 1 * v89 + -1 * v91 + 1e+09 * v119 <= 0;
constraint 1 * v90 + -1 * v91 + -1e+09 * v119 <= 0;
constraint 0 <= 1 * v20 + -1 * v21 + -1 * v29 + 1 * v31 + -1 * v89;
constraint 1 * v20 + -1 * v21 + -1 * v29 + 1 * v31 + -1 * v89 <= 0;
constraint 0 <= 1 * v2 + 1 * v3 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v19 + 1 * v20 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v90;
constraint 1 * v2 + 1 * v3 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v19 + 1 * v20 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v90 <= 0;
constraint 1 * v91 <= 1;
constraint 0 <= 1 * v120;
constraint 1 * v120 <= 1;
constraint -1 * v93 + 1 * v95 <= 0;
constraint -1 * v94 + 1 * v95 <= 0;
constraint -1e+09 * v32 + 1 * v93 + -1 * v95 + 1e+09 * v120 <= 0;
constraint 1 * v94 + -1 * v95 + -1e+09 * v120 <= 0;
constraint 0 <= 1 * v20 + -1 * v21 + -1 * v29 + 1 * v31 + -1 * v93;
constraint 1 * v20 + -1 * v21 + -1 * v29 + 1 * v31 + -1 * v93 <= 0;
constraint 0 <= 1 * v2 + 1 * v4 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v19 + 1 * v20 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v94;
constraint 1 * v2 + 1 * v4 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v19 + 1 * v20 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v94 <= 0;
constraint 1 * v95 <= 1;
constraint 0 <= 1 * v121;
constraint 1 * v121 <= 1;
constraint -1 * v97 + 1 * v99 <= 0;
constraint -1 * v98 + 1 * v99 <= 0;
constraint -1e+09 * v32 + 1 * v97 + -1 * v99 + 1e+09 * v121 <= 0;
constraint 1 * v98 + -1 * v99 + -1e+09 * v121 <= 0;
constraint 0 <= 1 * v17 + -1 * v18 + -1 * v29 + 1 * v31 + -1 * v97;
constraint 1 * v17 + -1 * v18 + -1 * v29 + 1 * v31 + -1 * v97 <= 0;
constraint 0 <= 1 * v0 + 1 * v5 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v17 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v98;
constraint 1 * v0 + 1 * v5 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v17 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v98 <= 0;
constraint 1 * v99 <= 1;
constraint 0 <= 1 * v122;
constraint 1 * v122 <= 1;
constraint -1 * v101 + 1 * v103 <= 0;
constraint -1 * v102 + 1 * v103 <= 0;
constraint -1e+09 * v32 + 1 * v101 + -1 * v103 + 1e+09 * v122 <= 0;
constraint 1 * v102 + -1 * v103 + -1e+09 * v122 <= 0;
constraint 0 <= 1 * v17 + -1 * v18 + -1 * v29 + 1 * v31 + -1 * v101;
constraint 1 * v17 + -1 * v18 + -1 * v29 + 1 * v31 + -1 * v101 <= 0;
constraint 0 <= 1 * v1 + 1 * v5 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v17 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v102;
constraint 1 * v1 + 1 * v5 + 1 * v10 + 1 * v11 + 1 * v16 + 1 * v17 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v31 + -1 * v102 <= 0;
constraint 1 * v103 <= 1;
constraint 1 * v2 + 1 * v5 + 1 * v10 + 1 * v13 + 1 * v16 + 1 * v19 + 1 * v22 + 1 * v25 + 1 * v28 + 1 * v29 <= 0;
constraint 1 * v0 + -1 * v2 <= 0;
constraint 1 * v1 + -1 * v2 <= 0;
constraint 1 * v3 + -1 * v5 <= 0;
constraint 1 * v4 + -1 * v5 <= 0;
constraint 1 * v6 + -1 * v10 <= 0;
constraint 1 * v7 + -1 * v10 <= 0;
constraint 1 * v8 + -1 * v10 <= 0;
constraint 1 * v9 + -1 * v10 <= 0;
constraint 1 * v11 + -1 * v13 <= 0;
constraint 1 * v12 + -1 * v13 <= 0;
constraint 1 * v14 + -1 * v16 <= 0;
constraint 1 * v15 + -1 * v16 <= 0;
constraint 1 * v17 + -1 * v19 <= 0;
constraint 1 * v18 + -1 * v19 <= 0;
constraint 1 * v20 + -1 * v22 <= 0;
constraint 1 * v21 + -1 * v22 <= 0;
constraint 1 * v23 + -1 * v25 <= 0;
constraint 1 * v24 + -1 * v25 <= 0;
constraint 1 * v26 + -1 * v28 <= 0;
constraint 1 * v27 + -1 * v28 <= 0;
constraint 1 * v29 + -1 * v31 <= 0;
constraint 1 * v30 + -1 * v31 <= 0;
constraint 1 * v0 + 0 * v1 + 0 * v2 + 1 * v3 + 0 * v4 + 0 * v5 + 1 * v6 + 0 * v7 + 0 * v8 + 0 * v9 + 0 * v10 + 0 * v11 + 1 * v12 + 0 * v13 + 0 * v14 + 1 * v15 + 0 * v16 + 0 * v17 + 1 * v18 + 0 * v19 + 0 * v20 + 1 * v21 + 0 * v22 + 0 * v23 + 1 * v24 + 0 * v25 + 0 * v26 + 1 * v27 + 0 * v28 + 0 * v29 + 1 * v30 + 0 * v31 + 0 * v32 + 0 * v33 + 0 * v34 + 0 * v35 + 0 * v36 + 0 * v37 + 0 * v38 + 0 * v39 + 0 * v40 + 0 * v41 + 0 * v42 + 0 * v43 + 0 * v44 + 0 * v45 + 0 * v46 + 0 * v47 + 0 * v48 + 0 * v49 + 0 * v50 + 0 * v51 + 0 * v52 + 0 * v53 + 0 * v54 + 0 * v55 + 0 * v56 + 0 * v57 + 0 * v58 + 0 * v59 + 0 * v60 + 0 * v61 + 0 * v62 + 0 * v63 + 0 * v64 + 0 * v65 + 0 * v66 + 0 * v67 + 0 * v68 + 0 * v69 + 0 * v70 + 0 * v71 + 0 * v72 + 0 * v73 + 0 * v74 + 0 * v75 + 0 * v76 + 0 * v77 + 0 * v78 + 0 * v79 + 0 * v80 + 0 * v81 + 0 * v82 + 0 * v83 + 0 * v84 + 0 * v85 + 0 * v86 + 0 * v87 + 0 * v88 + 0 * v89 + 0 * v90 + 0 * v91 + 0 * v92 + 0 * v93 + 0 * v94 + 0 * v95 + 0 * v96 + 0 * v97 + 0 * v98 + 0 * v99 + 0 * v100 + 0 * v101 + 0 * v102 + 0 * v103 + 0 * v104 + 0 * v105 + 0 * v106 + 0 * v107 + 0 * v108 + 0 * v109 + 0 * v110 + 0 * v111 + 0 * v112 + 0 * v113 + 0 * v114 + 0 * v115 + 0 * v116 + 0 * v117 + 0 * v118 + 0 * v119 + 0 * v120 + 0 * v121 + 0 * v122 + 0 >= 2;
solve maximize 1 * v0 + 0 * v1 + 0 * v2 + 1 * v3 + 0 * v4 + 0 * v5 + 1 * v6 + 0 * v7 + 0 * v8 + 0 * v9 + 0 * v10 + 0 * v11 + 1 * v12 + 0 * v13 + 0 * v14 + 1 * v15 + 0 * v16 + 0 * v17 + 1 * v18 + 0 * v19 + 0 * v20 + 1 * v21 + 0 * v22 + 0 * v23 + 1 * v24 + 0 * v25 + 0 * v26 + 1 * v27 + 0 * v28 + 0 * v29 + 1 * v30 + 0 * v31 + 0 * v32 + 0 * v33 + 0 * v34 + 0 * v35 + 0 * v36 + 0 * v37 + 0 * v38 + 0 * v39 + 0 * v40 + 0 * v41 + 0 * v42 + 0 * v43 + 0 * v44 + 0 * v45 + 0 * v46 + 0 * v47 + 0 * v48 + 0 * v49 + 0 * v50 + 0 * v51 + 0 * v52 + 0 * v53 + 0 * v54 + 0 * v55 + 0 * v56 + 0 * v57 + 0 * v58 + 0 * v59 + 0 * v60 + 0 * v61 + 0 * v62 + 0 * v63 + 0 * v64 + 0 * v65 + 0 * v66 + 0 * v67 + 0 * v68 + 0 * v69 + 0 * v70 + 0 * v71 + 0 * v72 + 0 * v73 + 0 * v74 + 0 * v75 + 0 * v76 + 0 * v77 + 0 * v78 + 0 * v79 + 0 * v80 + 0 * v81 + 0 * v82 + 0 * v83 + 0 * v84 + 0 * v85 + 0 * v86 + 0 * v87 + 0 * v88 + 0 * v89 + 0 * v90 + 0 * v91 + 0 * v92 + 0 * v93 + 0 * v94 + 0 * v95 + 0 * v96 + 0 * v97 + 0 * v98 + 0 * v99 + 0 * v100 + 0 * v101 + 0 * v102 + 0 * v103 + 0 * v104 + 0 * v105 + 0 * v106 + 0 * v107 + 0 * v108 + 0 * v109 + 0 * v110 + 0 * v111 + 0 * v112 + 0 * v113 + 0 * v114 + 0 * v115 + 0 * v116 + 0 * v117 + 0 * v118 + 0 * v119 + 0 * v120 + 0 * v121 + 0 * v122 + 0;
output ["initial h val =(1 * v0 + 0 * v1 + 0 * v2 + 1 * v3 + 0 * v4 + 0 * v5 + 1 * v6 + 0 * v7 + 0 * v8 + 0 * v9 + 0 * v10 + 0 * v11 + 1 * v12 + 0 * v13 + 0 * v14 + 1 * v15 + 0 * v16 + 0 * v17 + 1 * v18 + 0 * v19 + 0 * v20 + 1 * v21 + 0 * v22 + 0 * v23 + 1 * v24 + 0 * v25 + 0 * v26 + 1 * v27 + 0 * v28 + 0 * v29 + 1 * v30 + 0 * v31 + 0 * v32 + 0 * v33 + 0 * v34 + 0 * v35 + 0 * v36 + 0 * v37 + 0 * v38 + 0 * v39 + 0 * v40 + 0 * v41 + 0 * v42 + 0 * v43 + 0 * v44 + 0 * v45 + 0 * v46 + 0 * v47 + 0 * v48 + 0 * v49 + 0 * v50 + 0 * v51 + 0 * v52 + 0 * v53 + 0 * v54 + 0 * v55 + 0 * v56 + 0 * v57 + 0 * v58 + 0 * v59 + 0 * v60 + 0 * v61 + 0 * v62 + 0 * v63 + 0 * v64 + 0 * v65 + 0 * v66 + 0 * v67 + 0 * v68 + 0 * v69 + 0 * v70 + 0 * v71 + 0 * v72 + 0 * v73 + 0 * v74 + 0 * v75 + 0 * v76 + 0 * v77 + 0 * v78 + 0 * v79 + 0 * v80 + 0 * v81 + 0 * v82 + 0 * v83 + 0 * v84 + 0 * v85 + 0 * v86 + 0 * v87 + 0 * v88 + 0 * v89 + 0 * v90 + 0 * v91 + 0 * v92 + 0 * v93 + 0 * v94 + 0 * v95 + 0 * v96 + 0 * v97 + 0 * v98 + 0 * v99 + 0 * v100 + 0 * v101 + 0 * v102 + 0 * v103 + 0 * v104 + 0 * v105 + 0 * v106 + 0 * v107 + 0 * v108 + 0 * v109 + 0 * v110 + 0 * v111 + 0 * v112 + 0 * v113 + 0 * v114 + 0 * v115 + 0 * v116 + 0 * v117 + 0 * v118 + 0 * v119 + 0 * v120 + 0 * v121 + 0 * v122 + 0)n"];
(It is a lot smaller than the initial 10k+ constraints, but still not really a MWE.)
For me the unexpected behavior occurs with Minizinc 2.8.4 and Cplex 22.1.1. While the behavior is solver specific for this concrete encoding. Other encodings I generated e.g. worked (= always returned the maximal solution) with CPLEX but did not with Coin-BC. So it doesn’t seem to be a solver specific bug to me, but rather something I am misunderstanding when encoding. ( I also tried the native CPLEX API, which makes me think that it can’t be a Minizinc bug. )
In case you are interested to understand the encoding itself:
I am using https://or.stackexchange.com/a/1174 to encode an ILP with minima. (Variable names in the following correspond to the names used in the linked post.)
Variables:
- Variables up to
var32
are the variables of the actual problem one would write down by hand (with min) - Variables
var33
tovar104
are reoccurring versions of the respective x1, x2, X, “unused” - Variables
var105
tovar122
are they
integer variables
The first constraint fixes a variable to be =1. Then the constraints are repeatedly:
- Fixing
y
to 0 <= y <= 1 - The next 4 constraints are the minimization constraints
- Then two constraints encode the values that shall be minimized
- One constraint to fix an upperbound for the minima encoding
After this repetition one constraint fixes a sum of some variables to be <= 0. And then some constraints specify lower bounds for variables.
The constraints end with the constraint for the objective value which I added for debugging.
1