簡體   English   中英

IloCplex.solve()無法滿足所有約束,即使solve()方法返回true

[英]IloCplex.solve() failing to satisfy all constraints, even though solve() method returns true

我剛剛開始弄弄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

}

X變量列表:1:

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"

Y變量列表為1

result = {ArrayList@1098}  size = 2
 0 = {CpxNumVar@1100} "y01"
 1 = {CpxNumVar@1101} "y08"

假設X的值是1的10個變量,請注意,沒有第三個約束,因為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,解決方案未達到預期的效果,因為我使用的數據知道應該發生什么。

我已經調試,求解后,我檢查模型中發生了什么,對var發生了什么,什么沒有發生。 有很多不滿意的IloRange。 為什么會這樣呢? CPLEX Java API是否存在任何已知的錯誤?

調試cplex.jar的反編譯類,我得到的狀態是“最佳”,因此CPLEX認為他找到了最佳值。

附加信息:

我正在使用IDEA 14.1.2社區版本。 為了編譯代碼,我使用Java 8 update 45 64位體系結構。 使用集成的Maven,無需其他插件。 cplex.jar來自在64位linux上完成的安裝。 為了運行該程序,我使用32位體系結構的Java 8 update 31,因為我可以使用的唯一cplex1260.dll是32位。 我的操作系統是:Windows 7 64 bit

編輯:

我開始認為我的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初始化的IloRange

this.constraint = this.model.addLe(expr,Double.POSITIVE_INFINITY);

與第一次嘗試相同的結果只有一個約束,這是可以預期的。

有任何想法嗎?

EDIT3:

我開始認為它與CPLEX Parameters有關,與libs有關。 linux庫中的默認參數不同,因此也有所不同。

誰能告訴我可以更改的參數,以使解決方案滿足所有約束?

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

但是在我的項目中,X和Y如下:

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)

這樣,它將正確舍入整數。

對於這些問題,我的標准方法是讓CPLEX將內部模型作為LP文件轉儲出去,並檢查它是否有意義並符合您的期望。 然后,也許嘗試在獨立的CPLEX中解決LP文件,然后檢查答案。 我猜測某個地方存在錯誤,CPLEX中的模型與您的想法不同。 一旦知道區別所在,就可以更仔細地檢查代碼,甚至可能發現錯誤。 最終,您可能證明這是Java接口中的問題,但很可能是您自己的代碼中的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM