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

时间:2015-05-03 20:19:44

标签: java cplex

我最近刚刚开始使用CPLEX Java API,所有这些都很好看,直到LP没有解决,尽管它说它们是......

我有以下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个X变量列表:

result = {ArrayList@1078}  size = 6
 0 = {CpxNumVar@1080} "x0101"
 1 = {CpxNumVar@1081} "x0208"
 2 = {CpxNumVar@1082} "x0508"
 3 = {CpxNumVar@1083} "x0601"
 4 = {CpxNumVar@1084} "x0808"
 5 = {CpxNumVar@1085} "x1008"

1个

的Y变量列表
result = {ArrayList@1098}  size = 2
 0 = {CpxNumVar@1100} "y01"
 1 = {CpxNumVar@1101} "y08"

应该有10个X变量值1, 请注意,不满足第3个约束,因为没有x03 **和y03值为1。

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

操纵目标:

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);
}

这适用于首发LP。

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

我已经调试过,在解决之后,我会检查模型和变量中发生了什么,以及什么不是。 有很多不满意的IloRange。为什么会出现这种情况?是否有任何已知的CPLEX Java API错误?

调试cplex.jar的反编译类我得到状态为Optimal,因此CPLEX认为他找到了最佳值。

其他信息:

我正在使用IDEA 14.1.2社区版。 要编译代码我正在使用Java 8 update 45 64位架构。 使用集成maven而无需额外的插件。 cplex.jar取自在64位linux中完成的安装。 为了运行该程序,我使用的是32位架构的Java 8更新31,因为我能得到的唯一的cplex1260.dll是32位。 我的操作系统是:Windows 7 64位

编辑:

我开始认为我的DLL出了问题。我在哪里可以找到另一个?

EDIT2(现在在linux上):

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

我有以下代码:

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);

与只有一个约束的第一次尝试相同的结果发生,这是可以预期的。

有什么想法吗?

EDIT3:

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

有人可以告诉我有关可以更改的参数,以使解决方案满足所有约束条件吗?

EDIT4:

我刚刚比较了在Windows上运行的这个代码的输出与在linux上运行的代码的输出(每个都有它的windows(dll)和linux的libs集合):

        for(Field field : IloCplex.IntParam.class.getDeclaredFields()){
            System.out.println(field.getName() + " " + this.model.getParam((IloCplex.IntParam)field.get(this)));
        }
        for(Field field : IloCplex.BooleanParam.class.getDeclaredFields()){
            System.out.println(field.getName() + " " + this.model.getParam((IloCplex.BooleanParam)field.get(this)));
        }
        for(Field field : IloCplex.DoubleParam.class.getDeclaredFields()){
            System.out.println(field.getName() + " " + this.model.getParam((IloCplex.DoubleParam)field.get(this)));
        }
        for(Field field : IloCplex.StringParam.class.getDeclaredFields()){
            System.out.println(field.getName() + " " + this.model.getParam((IloCplex.StringParam)field.get(this)));
        }
        for(Field field : IloCplex.LongParam.class.getDeclaredFields()){
            System.out.println(field.getName() + " " + this.model.getParam((IloCplex.LongParam)field.get(this)));
        }

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

我现在再次指责这个库。我还能做什么?

EDIT5:

使用导出模型后,我向您展示Interactive Optimizer输出的输出如下:

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"

我使用以下代码返回X和Y:

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;
}

EDIT6:

问题在于我是这样做的:

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

我变成了

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

这样,它正确地舍入了int。

1 个答案:

答案 0 :(得分:2)

我对这些问题的标准方法是让CPLEX将内部模型转储为LP文件,并检查它是否合理并符合您的预期。然后可以尝试在独立的CPLEX中解决LP文件,并检查答案。我猜测某处有一个错误,CPLEX内部的模型与您的想法不同。一旦你知道差异在哪里,你可以更仔细地检查你的代码,也许会发现错误。最终,您可能会证明它是Java界面中的问题,但很可能是您自己的代码中的错误。