IloCplex.solve() 未能满足所有约束条件,即使 solve() 方法 returns 为真
IloCplex.solve() failing to satisfy all constraints, even though solve() method returns true
我最近才开始 fiddle 使用 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 的 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"
X 应该有 10 个变量,值为 1,
请注意,不满足第三个约束条件,因为不存在值为 1 的 x03** 和 y03。
我正在解决具有相同约束但 objective 不同的多个问题。所以我只是操纵 objective 来维持约束。有时我需要两个添加约束或到,我这样做是这样的:
操纵 objective:
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 的反编译 类 我得到状态是最佳的,所以 CPLEX 认为他找到了最佳值。
附加信息:
我使用的是 IDEA 14.1.2 社区版。
要编译代码,我使用 Java 8 update 45 64 位架构。
使用没有额外插件的集成 Maven。
cplex.jar 取自在 64 位 linux 中完成的安装。
对于 运行 我正在使用 Java 8 update 31 of 32 bit architecture 的程序,因为我唯一能得到的 cplex1260.dll 是 32 位的。
我的OS是:Windows7 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);
与第一次尝试只有一个约束的结果相同,这是意料之中的。
有什么想法吗?
编辑 3:
我开始认为它与 CPLEX 参数有关,而不是与库有关。 linux 库中的默认参数不同,因此存在差异。
任何人都可以告诉我可以更改的参数以使解决方案满足所有约束吗?
编辑4:
我刚刚比较了这段代码 运行 在 windows 上的输出与 运行 在 linux 上的输出(每个都有它的一组库 windows (dll) 和 linux):
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)));
}
检查参数的定义值。他们都是一样的...
我现在又一次将库归咎于此。我还能做什么?
编辑5:
使用导出模型后,我向您展示了 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"
我使用以下代码 return 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;
}
编辑6:
问题是我在做这个:
(int) (this.model.getValue(var))
我变成了
(int) (this.model.getValue(var)+0.5)
这样,它会正确地舍入 int。
对于这类问题,我的标准方法是让 CPLEX 将内部模型转储为 LP 文件,并检查它是否有意义并符合您的预期。然后也许尝试在独立的 CPLEX 中解决 LP 文件,并检查答案。我猜测某处存在错误,CPLEX 中的模型与您的想法不同。一旦您知道了不同之处,您就可以更仔细地检查您的代码,并可能找到错误。最终你可能会证明它是 Java 接口中的问题,但很可能是你自己的代码中的错误。
我最近才开始 fiddle 使用 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 的 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"
X 应该有 10 个变量,值为 1, 请注意,不满足第三个约束条件,因为不存在值为 1 的 x03** 和 y03。
我正在解决具有相同约束但 objective 不同的多个问题。所以我只是操纵 objective 来维持约束。有时我需要两个添加约束或到,我这样做是这样的:
操纵 objective:
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 的反编译 类 我得到状态是最佳的,所以 CPLEX 认为他找到了最佳值。
附加信息:
我使用的是 IDEA 14.1.2 社区版。 要编译代码,我使用 Java 8 update 45 64 位架构。 使用没有额外插件的集成 Maven。 cplex.jar 取自在 64 位 linux 中完成的安装。 对于 运行 我正在使用 Java 8 update 31 of 32 bit architecture 的程序,因为我唯一能得到的 cplex1260.dll 是 32 位的。 我的OS是:Windows7 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);
与第一次尝试只有一个约束的结果相同,这是意料之中的。
有什么想法吗?
编辑 3:
我开始认为它与 CPLEX 参数有关,而不是与库有关。 linux 库中的默认参数不同,因此存在差异。
任何人都可以告诉我可以更改的参数以使解决方案满足所有约束吗?
编辑4:
我刚刚比较了这段代码 运行 在 windows 上的输出与 运行 在 linux 上的输出(每个都有它的一组库 windows (dll) 和 linux):
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)));
}
检查参数的定义值。他们都是一样的...
我现在又一次将库归咎于此。我还能做什么?
编辑5:
使用导出模型后,我向您展示了 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"
我使用以下代码 return 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;
}
编辑6:
问题是我在做这个:
(int) (this.model.getValue(var))
我变成了
(int) (this.model.getValue(var)+0.5)
这样,它会正确地舍入 int。
对于这类问题,我的标准方法是让 CPLEX 将内部模型转储为 LP 文件,并检查它是否有意义并符合您的预期。然后也许尝试在独立的 CPLEX 中解决 LP 文件,并检查答案。我猜测某处存在错误,CPLEX 中的模型与您的想法不同。一旦您知道了不同之处,您就可以更仔细地检查您的代码,并可能找到错误。最终你可能会证明它是 Java 接口中的问题,但很可能是你自己的代码中的错误。