Java IloCplex.solve()无法满足所有约束,即使solve()方法返回true

Java IloCplex.solve()无法满足所有约束,即使solve()方法返回true,java,cplex,Java,Cplex,我最近才开始摆弄CPLEX Java API,在LP没有解决之前,一切看起来都很好,尽管它说它们是 我有以下文件: IloModel { IloMinimize : (0.0*x0101 + 9.0*x0102 + 74.0*x0103 + 6.0*x0104 + 47.0*x0105 + 72.0*x0106 + 15.0*x0107 + 96.0*x0108 + 76.0*x0109 + 33.0*x0110 + 95.0*x0201 + 0.0*x0202 + 69.0*x0203 +

我最近才开始摆弄CPLEX Java API,在LP没有解决之前,一切看起来都很好,尽管它说它们是

我有以下文件:

IloModel  {
IloMinimize  : (0.0*x0101 + 9.0*x0102 + 74.0*x0103 + 6.0*x0104 + 47.0*x0105 + 72.0*x0106 + 15.0*x0107 + 96.0*x0108 + 76.0*x0109 + 33.0*x0110 + 95.0*x0201 + 0.0*x0202 + 69.0*x0203 + 3.0*x0204 + 84.0*x0205 + 39.0*x0206 + 7.0*x0207 + 3.0*x0208 + 33.0*x0209 + 1.0*x0210 + 60.0*x0301 + 49.0*x0302 + 0.0*x0303 + 81.0*x0304 + 43.0*x0305 + 16.0*x0306 + 11.0*x0307 + 15.0*x0308 + 23.0*x0309 + 9.0*x0310 + 15.0*x0401 + 77.0*x0402 + 2.0*x0403 + 0.0*x0404 + 67.0*x0405 + 22.0*x0406 + 93.0*x0407 + 72.0*x0408 + 97.0*x0409 + 84.0*x0410 + 67.0*x0501 + 29.0*x0502 + 62.0*x0503 + 64.0*x0504 + 0.0*x0505 + 56.0*x0506 + 87.0*x0507 + 29.0*x0508 + 12.0*x0509 + 92.0*x0510 + 13.0*x0601 + 93.0*x0602 + 22.0*x0603 + 25.0*x0604 + 60.0*x0605 + 0.0*x0606 + 32.0*x0607 + 42.0*x0608 + 61.0*x0609 + 4.0*x0610 + 7.0*x0701 + 24.0*x0702 + 12.0*x0703 + 86.0*x0704 + 27.0*x0705 + 52.0*x0706 + 0.0*x0707 + 71.0*x0708 + 12.0*x0709 + 56.0*x0710 + 97.0*x0801 + 69.0*x0802 + 45.0*x0803 + 10.0*x0804 + 85.0*x0805 + 25.0*x0806 + 72.0*x0807 + 0.0*x0808 + 38.0*x0809 + 78.0*x0810 + 23.0*x0901 + 97.0*x0902 + 12.0*x0903 + 81.0*x0904 + 56.0*x0905 + 99.0*x0906 + 71.0*x0907 + 71.0*x0908 + 0.0*x0909 + 35.0*x0910 + 56.0*x1001 + 2.0*x1002 + 60.0*x1003 + 77.0*x1004 + 96.0*x1005 + 9.0*x1006 + 31.0*x1007 + 4.0*x1008 + 10.0*x1009 + 0.0*x1010)
IloRange  : 1.0 <= (1.0*x0102 + 1.0*x0103 + 1.0*x0104 + 1.0*x0105 + 1.0*x0106 + 1.0*x0107 + 1.0*x0108 + 1.0*x0109 + 1.0*x0110 + 1.0*y01) <= 1.0
IloRange  : 1.0 <= (1.0*x0201 + 1.0*x0203 + 1.0*x0204 + 1.0*x0205 + 1.0*x0206 + 1.0*x0207 + 1.0*x0208 + 1.0*x0209 + 1.0*x0210 + 1.0*y02) <= 1.0
IloRange  : 1.0 <= (1.0*x0301 + 1.0*x0302 + 1.0*x0304 + 1.0*x0305 + 1.0*x0306 + 1.0*x0307 + 1.0*x0308 + 1.0*x0309 + 1.0*x0310 + 1.0*y03) <= 1.0
IloRange  : 1.0 <= (1.0*x0401 + 1.0*x0402 + 1.0*x0403 + 1.0*x0405 + 1.0*x0406 + 1.0*x0407 + 1.0*x0408 + 1.0*x0409 + 1.0*x0410 + 1.0*y04) <= 1.0
IloRange  : 1.0 <= (1.0*x0501 + 1.0*x0502 + 1.0*x0503 + 1.0*x0504 + 1.0*x0506 + 1.0*x0507 + 1.0*x0508 + 1.0*x0509 + 1.0*x0510 + 1.0*y05) <= 1.0
IloRange  : 1.0 <= (1.0*x0601 + 1.0*x0602 + 1.0*x0603 + 1.0*x0604 + 1.0*x0605 + 1.0*x0607 + 1.0*x0608 + 1.0*x0609 + 1.0*x0610 + 1.0*y06) <= 1.0
IloRange  : 1.0 <= (1.0*x0701 + 1.0*x0702 + 1.0*x0703 + 1.0*x0704 + 1.0*x0705 + 1.0*x0706 + 1.0*x0708 + 1.0*x0709 + 1.0*x0710 + 1.0*y07) <= 1.0
IloRange  : 1.0 <= (1.0*x0801 + 1.0*x0802 + 1.0*x0803 + 1.0*x0804 + 1.0*x0805 + 1.0*x0806 + 1.0*x0807 + 1.0*x0809 + 1.0*x0810 + 1.0*y08) <= 1.0
IloRange  : 1.0 <= (1.0*x0901 + 1.0*x0902 + 1.0*x0903 + 1.0*x0904 + 1.0*x0905 + 1.0*x0906 + 1.0*x0907 + 1.0*x0908 + 1.0*x0910 + 1.0*y09) <= 1.0
IloRange  : 1.0 <= (1.0*x1001 + 1.0*x1002 + 1.0*x1003 + 1.0*x1004 + 1.0*x1005 + 1.0*x1006 + 1.0*x1007 + 1.0*x1008 + 1.0*x1009 + 1.0*y10) <= 1.0
IloRange  : -infinity <= (1.0*x0102 - 1.0*y02) <= 0.0
IloRange  : -infinity <= (1.0*x0103 - 1.0*y03) <= 0.0
IloRange  : -infinity <= (1.0*x0104 - 1.0*y04) <= 0.0
IloRange  : -infinity <= (1.0*x0105 - 1.0*y05) <= 0.0
IloRange  : -infinity <= (1.0*x0106 - 1.0*y06) <= 0.0
IloRange  : -infinity <= (1.0*x0107 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0108 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0109 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0110 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0201) <= 0.0
IloRange  : -infinity <= (1.0*x0203 - 1.0*y03) <= 0.0
IloRange  : -infinity <= (1.0*x0204 - 1.0*y04) <= 0.0
IloRange  : -infinity <= (1.0*x0205 - 1.0*y05) <= 0.0
IloRange  : -infinity <= (1.0*x0206 - 1.0*y06) <= 0.0
IloRange  : -infinity <= (1.0*x0207 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0208 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0209 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0210 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0301) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0302) <= 0.0
IloRange  : -infinity <= (1.0*x0304 - 1.0*y04) <= 0.0
IloRange  : -infinity <= (1.0*x0305 - 1.0*y05) <= 0.0
IloRange  : -infinity <= (1.0*x0306 - 1.0*y06) <= 0.0
IloRange  : -infinity <= (1.0*x0307 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0308 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0309 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0310 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0401) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0402) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0403) <= 0.0
IloRange  : -infinity <= (1.0*x0405 - 1.0*y05) <= 0.0
IloRange  : -infinity <= (1.0*x0406 - 1.0*y06) <= 0.0
IloRange  : -infinity <= (1.0*x0407 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0408 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0409 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0410 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0501) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0502) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0503) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x0504) <= 0.0
IloRange  : -infinity <= (1.0*x0506 - 1.0*y06) <= 0.0
IloRange  : -infinity <= (1.0*x0507 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0508 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0509 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0510 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0601) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0602) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0603) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x0604) <= 0.0
IloRange  : -infinity <= (-1.0*y05 + 1.0*x0605) <= 0.0
IloRange  : -infinity <= (1.0*x0607 - 1.0*y07) <= 0.0
IloRange  : -infinity <= (1.0*x0608 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0609 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0610 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0701) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0702) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0703) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x0704) <= 0.0
IloRange  : -infinity <= (-1.0*y05 + 1.0*x0705) <= 0.0
IloRange  : -infinity <= (-1.0*y06 + 1.0*x0706) <= 0.0
IloRange  : -infinity <= (1.0*x0708 - 1.0*y08) <= 0.0
IloRange  : -infinity <= (1.0*x0709 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0710 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0801) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0802) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0803) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x0804) <= 0.0
IloRange  : -infinity <= (-1.0*y05 + 1.0*x0805) <= 0.0
IloRange  : -infinity <= (-1.0*y06 + 1.0*x0806) <= 0.0
IloRange  : -infinity <= (-1.0*y07 + 1.0*x0807) <= 0.0
IloRange  : -infinity <= (1.0*x0809 - 1.0*y09) <= 0.0
IloRange  : -infinity <= (1.0*x0810 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x0901) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x0902) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x0903) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x0904) <= 0.0
IloRange  : -infinity <= (-1.0*y05 + 1.0*x0905) <= 0.0
IloRange  : -infinity <= (-1.0*y06 + 1.0*x0906) <= 0.0
IloRange  : -infinity <= (-1.0*y07 + 1.0*x0907) <= 0.0
IloRange  : -infinity <= (-1.0*y08 + 1.0*x0908) <= 0.0
IloRange  : -infinity <= (1.0*x0910 - 1.0*y10) <= 0.0
IloRange  : -infinity <= (-1.0*y01 + 1.0*x1001) <= 0.0
IloRange  : -infinity <= (-1.0*y02 + 1.0*x1002) <= 0.0
IloRange  : -infinity <= (-1.0*y03 + 1.0*x1003) <= 0.0
IloRange  : -infinity <= (-1.0*y04 + 1.0*x1004) <= 0.0
IloRange  : -infinity <= (-1.0*y05 + 1.0*x1005) <= 0.0
IloRange  : -infinity <= (-1.0*y06 + 1.0*x1006) <= 0.0
IloRange  : -infinity <= (-1.0*y07 + 1.0*x1007) <= 0.0
IloRange  : -infinity <= (-1.0*y08 + 1.0*x1008) <= 0.0
IloRange  : -infinity <= (-1.0*y09 + 1.0*x1009) <= 0.0
IloRange  : 0.0 <= (-1.0*y01 + 1.0*x0101) <= 0.0
IloRange  : 0.0 <= (-1.0*y02 + 1.0*x0202) <= 0.0
IloRange  : 0.0 <= (-1.0*y03 + 1.0*x0303) <= 0.0
IloRange  : 0.0 <= (-1.0*y04 + 1.0*x0404) <= 0.0
IloRange  : 0.0 <= (-1.0*y05 + 1.0*x0505) <= 0.0
IloRange  : 0.0 <= (-1.0*y06 + 1.0*x0606) <= 0.0
IloRange  : 0.0 <= (-1.0*y07 + 1.0*x0707) <= 0.0
IloRange  : 0.0 <= (-1.0*y08 + 1.0*x0808) <= 0.0
IloRange  : 0.0 <= (-1.0*y09 + 1.0*x0909) <= 0.0
IloRange  : 0.0 <= (-1.0*y10 + 1.0*x1010) <= 0.0
IloRange  : -infinity <= (-2.0*y01 + 1.0*x0201 + 1.0*x0301 + 1.0*x0401 + 1.0*x0501 + 1.0*x0601 + 1.0*x0701 + 1.0*x0801 + 1.0*x0901 + 1.0*x1001 + 1.0*x0101) <= 0.0
IloRange  : -infinity <= (1.0*x0102 - 2.0*y02 + 1.0*x0302 + 1.0*x0402 + 1.0*x0502 + 1.0*x0602 + 1.0*x0702 + 1.0*x0802 + 1.0*x0902 + 1.0*x1002 + 1.0*x0202) <= 0.0
IloRange  : -infinity <= (1.0*x0103 + 1.0*x0203 - 4.0*y03 + 1.0*x0403 + 1.0*x0503 + 1.0*x0603 + 1.0*x0703 + 1.0*x0803 + 1.0*x0903 + 1.0*x1003 + 1.0*x0303) <= 0.0
IloRange  : -infinity <= (1.0*x0104 + 1.0*x0204 + 1.0*x0304 - 4.0*y04 + 1.0*x0504 + 1.0*x0604 + 1.0*x0704 + 1.0*x0804 + 1.0*x0904 + 1.0*x1004 + 1.0*x0404) <= 0.0
IloRange  : -infinity <= (1.0*x0105 + 1.0*x0205 + 1.0*x0305 + 1.0*x0405 - 4.0*y05 + 1.0*x0605 + 1.0*x0705 + 1.0*x0805 + 1.0*x0905 + 1.0*x1005 + 1.0*x0505) <= 0.0
IloRange  : -infinity <= (1.0*x0106 + 1.0*x0206 + 1.0*x0306 + 1.0*x0406 + 1.0*x0506 - 5.0*y06 + 1.0*x0706 + 1.0*x0806 + 1.0*x0906 + 1.0*x1006 + 1.0*x0606) <= 0.0
IloRange  : -infinity <= (1.0*x0107 + 1.0*x0207 + 1.0*x0307 + 1.0*x0407 + 1.0*x0507 + 1.0*x0607 - 5.0*y07 + 1.0*x0807 + 1.0*x0907 + 1.0*x1007 + 1.0*x0707) <= 0.0
IloRange  : -infinity <= (1.0*x0108 + 1.0*x0208 + 1.0*x0308 + 1.0*x0408 + 1.0*x0508 + 1.0*x0608 + 1.0*x0708 - 5.0*y08 + 1.0*x0908 + 1.0*x1008 + 1.0*x0808) <= 0.0
IloRange  : -infinity <= (1.0*x0109 + 1.0*x0209 + 1.0*x0309 + 1.0*x0409 + 1.0*x0509 + 1.0*x0609 + 1.0*x0709 + 1.0*x0809 - 5.0*y09 + 1.0*x1009 + 1.0*x0909) <= 0.0
IloRange  : -infinity <= (1.0*x0110 + 1.0*x0210 + 1.0*x0310 + 1.0*x0410 + 1.0*x0510 + 1.0*x0610 + 1.0*x0710 + 1.0*x0810 + 1.0*x0910 - 5.0*y10 + 1.0*x1010) <= 0.0
IloRange  : 619.0 <= (36.0*x0102 + 296.0*x0103 + 24.0*x0104 + 188.0*x0105 + 288.0*x0106 + 60.0*x0107 + 384.0*x0108 + 304.0*x0109 + 132.0*x0110 + 58.0*y01 + 380.0*x0201 + 276.0*x0203 + 12.0*x0204 + 336.0*x0205 + 156.0*x0206 + 28.0*x0207 + 12.0*x0208 + 132.0*x0209 + 4.0*x0210 + 58.0*y02 + 240.0*x0301 + 196.0*x0302 + 324.0*x0304 + 172.0*x0305 + 64.0*x0306 + 44.0*x0307 + 60.0*x0308 + 92.0*x0309 + 36.0*x0310 + 116.0*y03 + 60.0*x0401 + 308.0*x0402 + 8.0*x0403 + 268.0*x0405 + 88.0*x0406 + 372.0*x0407 + 288.0*x0408 + 388.0*x0409 + 336.0*x0410 + 116.0*y04 + 268.0*x0501 + 116.0*x0502 + 248.0*x0503 + 256.0*x0504 + 224.0*x0506 + 348.0*x0507 + 116.0*x0508 + 48.0*x0509 + 368.0*x0510 + 116.0*y05 + 52.0*x0601 + 372.0*x0602 + 88.0*x0603 + 100.0*x0604 + 240.0*x0605 + 128.0*x0607 + 168.0*x0608 + 244.0*x0609 + 16.0*x0610 + 145.0*y06 + 28.0*x0701 + 96.0*x0702 + 48.0*x0703 + 344.0*x0704 + 108.0*x0705 + 208.0*x0706 + 284.0*x0708 + 48.0*x0709 + 224.0*x0710 + 145.0*y07 + 388.0*x0801 + 276.0*x0802 + 180.0*x0803 + 40.0*x0804 + 340.0*x0805 + 100.0*x0806 + 288.0*x0807 + 152.0*x0809 + 312.0*x0810 + 145.0*y08 + 92.0*x0901 + 388.0*x0902 + 48.0*x0903 + 324.0*x0904 + 224.0*x0905 + 396.0*x0906 + 284.0*x0907 + 284.0*x0908 + 140.0*x0910 + 145.0*y09 + 224.0*x1001 + 8.0*x1002 + 240.0*x1003 + 308.0*x1004 + 384.0*x1005 + 36.0*x1006 + 124.0*x1007 + 16.0*x1008 + 40.0*x1009 + 145.0*y10) <= 619.0
IloRange  : -infinity <= (2.0*y01 + 2.0*y02 + 4.0*y03 + 4.0*y04 + 4.0*y05 + 5.0*y06 + 5.0*y07 + 5.0*y08 + 5.0*y09 + 5.0*y10) <= 14.0

}
为1的Y变量列表

result = {ArrayList@1098}  size = 2
 0 = {CpxNumVar@1100} "y01"
 1 = {CpxNumVar@1101} "y08"
假设有10个X变量的值为1, 请注意,由于没有值为1的x03**或y03,因此不满足第三个约束

我用相同的约束条件解决多个问题,但目标不同。所以我只是操纵目标,保持约束。有时我需要两个添加约束或,我这样做:

操纵目标:

this.model.getObjective().setExpr(expr);
以及这些限制^

IloRange equality = this.model.eq(expr,value);
IloRange constraint = this.model.le(expr,value);
this.model.add(equality);
this.model.add(constraint);
while(this.model.solve()){
    //do stuff with solution
    this.model.remove(constraint);
    constraint = this.model.le(expr,newValue);
    this.model.add(constraint);
}
这对开始的LPs有效

这个特殊的LP,解决方案并没有像预期的那样出现,因为我使用的数据,我知道应该发生什么

我已经调试过了,在解算之后,我检查了模型和变量中发生了什么,以及没有发生什么。 很多人都不满意。为什么会这样?CPLEX Java API有任何已知的bug吗

调试cplex.jar的反编译类时,我发现状态是最优的,所以cplex认为他找到了一个最优值

其他信息:

我使用的是IDEA 14.1.2社区版。 为了编译代码,我使用Java8Update4564位体系结构。 使用集成maven,无需额外插件。 这个cplex.jar是从64位linux中安装的。 为了运行这个程序,我正在使用32位体系结构的Java8Update 31,因为我能得到的唯一cplex1260.dll是32位的。 我的操作系统是:Windows 7 64位

编辑:

我很想知道我的DLL有问题。我在哪里可以找到另一个

EDIT2(现在在linux上):

我已经设法解决了这个特殊的LP。但现在其他LPs也出现了同样的症状:

我有以下代码:

IloRange constraint = this.model.addLe(expr, value);
this.model.solve();
//use solution for something
this.model.remove(constraint);
我迭代这个值,使它变得越来越小。因此,我不需要删除约束,只需继续添加它们。因此,我将代码更改为:

this.plbo.getModel().addLe(expr, value);
this.plbo.getModel().solve();
//use solution for something
令人惊讶的是,他又花了两次迭代才解决了一个LP

我也尝试过:

this.constraint.setUB(newUB);
this.model.solve();
//use solution for something
其中
constraint
是一个
IloRange
初始化为:

this.constraint = this.model.addLe(expr,Double.POSITIVE_INFINITY);
与第一次尝试相同的结果只发生一个约束,这是意料之中的

有什么想法吗

编辑3:

我开始认为它与CPLEX参数有关,而不是libs。linux libs中的默认参数不同,因此存在差异

有谁能告诉我,为了使解决方案满足所有约束条件,我可以更改哪些参数

编辑4:

我刚刚比较了在windows上运行的这段代码的输出与在linux上运行的代码的输出(每个代码都有一组用于windows(dll)和linux的libs):

检查参数的定义值。他们都一样

我现在又一次把责任归咎于libs。我还能做什么

编辑5:

使用导出模型后,我向您展示了交互式优化器的输出如下:

Variable Name           Solution Value
x0210                         1.000000
x0310                         1.000000
x0509                         1.000000
x0610                         1.000000
x0701                         1.000000
x0804                         1.000000
y01                           1.000000
y04                           1.000000
y09                           1.000000
y10                           1.000000
x0101                         1.000000
x0404                         1.000000
x0909                         1.000000
x1010                         1.000000
但在我的项目中,Xs和Ys如下所示:

result = {ArrayList@1230}  size = 8
 0 = {CpxNumVar@1233} "x0101"
 1 = {CpxNumVar@1234} "x0210"
 2 = {CpxNumVar@1235} "x0310"
 3 = {CpxNumVar@1236} "x0404"
 4 = {CpxNumVar@1237} "x0610"
 5 = {CpxNumVar@1238} "x0701"
 6 = {CpxNumVar@1239} "x0804"
 7 = {CpxNumVar@1240} "x1010"

result = {ArrayList@1252}  size = 3
 0 = {CpxNumVar@1254} "y01"
 1 = {CpxNumVar@1255} "y04"
 2 = {CpxNumVar@1256} "y10"
我使用以下代码返回Xs和Ys:

public List<IloIntVar> getXs() throws IloException {
    List<IloIntVar> vars = new ArrayList<>();
    for (int i = 0; i < this.dim; i++) {
        for (int j = 0; j < this.dim; j++) {
            if (this.model.getValue(this.xVars[i][j]) == 1) {
                vars.add(this.xVars[i][j]);
            }
        }
    }
    return vars;
}

public List<IloIntVar> getYs() throws IloException {
    List<IloIntVar> vars = new ArrayList<>();
    for (int i = 0; i < this.dim; i++) {
        if (this.model.getValue(this.yVars[i]) == 1) {
            vars.add(this.yVars[i]);
        }
    }
    return vars;
}
我变成了

(int) (this.model.getValue(var)+0.5)

通过这种方式,它可以正确地对int进行取整。

对于这类问题,我的标准方法是让CPLEX将内部模型作为LP文件转储,并检查它是否有意义,是否符合您的预期。然后,可以尝试在独立CPLEX中解决LP文件,并检查答案。我猜在某个地方有一个错误,CPLEX中的模型与您所想的不同。一旦您知道差异所在,您就可以更仔细地检查代码,并可能找到错误。最终,您可能会证明这是Java接口中的一个问题,但很可能是您自己的代码中的一个错误。

我理解您的意思,感谢您的建议。尽管如此,在本例中,我解决了LP,最后一个约束也是:我已经使用独立CPLEX解决了相同的PLs。我用Java写一个文件,调用bash命令来运行CPLEX,读取文件,解写输出,然后读取输出。使用Java API,速度会快得多,这正是我现在想要实现的。我曾尝试使用其他DLL,在本例中,我尝试在linux安装中使用libs,同时在同一linux中运行程序。此LP已正确求解:)。唉,在其他一些LP中,同样的问题开始发生,即使是linux LIB。我开始相信这确实是Cplex的Java I实现中的一个问题。我不理解你的第二个评论。您是手动(使用java)生成LP文件以提供给Cplex,还是使用Cplex的java API构建模型并使用Cplex生成LP文件。exportModel()为之前没有发现此问题表示歉意。您认为“整数”或布尔变量在内部建模为双精度或类似变量是正确的。该声明只是强制解算器将它们设置为某个公差级别的整数值。需要始终注意浮点精度,即使是整数!
public List<IloIntVar> getXs() throws IloException {
    List<IloIntVar> vars = new ArrayList<>();
    for (int i = 0; i < this.dim; i++) {
        for (int j = 0; j < this.dim; j++) {
            if (this.model.getValue(this.xVars[i][j]) == 1) {
                vars.add(this.xVars[i][j]);
            }
        }
    }
    return vars;
}

public List<IloIntVar> getYs() throws IloException {
    List<IloIntVar> vars = new ArrayList<>();
    for (int i = 0; i < this.dim; i++) {
        if (this.model.getValue(this.yVars[i]) == 1) {
            vars.add(this.yVars[i]);
        }
    }
    return vars;
}
(int) (this.model.getValue(var))
(int) (this.model.getValue(var)+0.5)