优化模型代码问题,大佬帮k'k
题目在此:model:
sets:
fact/1..7/ : x,t,w,y,n;
endsets
data:
!i = 1,2,3,4,5,6,7;
!n = 8+7+9+6+6+4+8;
n = 8,7,9,6,6,4,8;
t = 48.7,52.0,61.3,72.0,48.7,52.0,64.0;
w = 2000,3000,1000,500,4000,2000,1000;
enddata
@sum(fact(i) : t(i)*x(i)) < 1020 ;
@sum(fact(i) : t(i)*y(i)) < 1020 ;
!x(i)+y(i) <= n(i);
@for( fact(i): x(i)+y(i) < n(i) ) ; ! 证明每一批次的货都得小于 所拥有的货 ;
@sum(fact(i) : w(i)*x(i)) < 40000 ;
@sum(fact(i) : w(i)*y(i)) < 40000 ;
!@sum(fact(i) #and# i #ge# 5: t(i)*y(i) ) < 302.7 ;
@sum(fact(i) | i #ge# 5 #and# i #le# 7 : t(i)*y(i) ) < 302.7 ;
min= (1020 - @sum(fact(i):x(i)*y(i)) ) + (1020 - @sum(fact(i):t(i)*y(i)) );
@for(fact(i):@gin(x));
@for(fact(i):@gin(y));
end
这个是老师给的答案
我自己尝试写的代码model:
sets:
fact/1..7/ : t,w,x,y,n ;
endsets
data:
n = 8,7,9,6,6,4,8;
t = 48.7,52.0,61.3,72.0,48.7,52.0,64.0;
w = 2000,3000,1000,500,4000,2000,1000;
enddata
@sum(fact(i) : t(i)*x(i)) < 1020 ;
@sum(fact(i) : t(i)*y(i)) < 1020 ;
@for( fact(i) : x(i)+y(i) < n(i) ) ;
@sum(fact(i) : w(i)*x(i)) < 40000 ;
@sum(fact(i) : w(i)*y(i)) < 40000 ;
@sum(fact(i) | i #ge# 5 #and# i #le# 7 : t(i) * ( x(i) * y(i) ) ) < 302.7 ;
min= (1020 - @sum(fact(i):t(i)*x(i)) ) + (1020 - @sum(fact(i):t(i)*y(i)) );
@for(fact(i) : @gin(x));
@for(fact(i) : @gin(y));
end
主要的区别在min上,但结果都在报错,不知道什么回事。
还有一个问题就是,为什么要用gin来规定x,y必须是正整数啊?
我在做另外一道题的时候,好像都没有用gin来保证gin是正整数,但是结果一样正确。
如果这道题没有用调用gin函数的话,结果却错了。
另外一道题没有报错的题目和代码
model:
sets:
item/1..9/:c,x;
endsets
data:
c=5,4,4,3,4,3,2,2,3;
enddata
max=@sum(item(i):c(i)*x(i));
@sum(item(i):x(i))=6; !课程为6门;
x(1)+x(2)+x(3)+x(4)+x(5)>=2;
x(3)+x(5)+x(6)+x(8)+x(9)>=3;
x(4)+x(6)+x(7)+x(9)>=2;
x(3)<=x(1);
x(3)<=x(2);
x(4)<=x(7);
x(5)<=x(1);
x(5)<=x(2);
x(6)<=x(7);
x(8)<=x(5);
x(9)<=x(1);
x(9)<=x(2);
@for(item(i):@bin(x(i)));
end
你老师给的答案?你老师给的目标函数都是错的哦。t*x写成x*y了
model:
sets:
fact/1..7/:t,w,x,y,n;
endsets
data:
n = 8,7,9,6,6,4,8;
t = 48.7,52.0,61.3,72.0,48.7,52.0,64.0;
w = 2000,3000,1000,500,4000,2000,1000;
enddata
@sum(fact:t*x)<=1020;
@sum(fact:t*y)<=1020;
@for(fact:x+y<=n);
@sum(fact:w*x)<=40000;
@sum(fact:w*y)<=40000;
@sum(fact(i)|i#ge#5#and#i#le#7:t(i)*(x(i)*y(i)))<=302.7;
min=(1020-@sum(fact:t*x))+(1020-@sum(fact:t*y));
@for(fact:@gin(x));
@for(fact:@gin(y));
end
Global optimal solution found.
Objective value: 0.4774847E-11
Objective bound: 0.4774847E-11
Infeasibilities: 0.000000
Extended solver steps: 1
Total solver iterations: 541019
Variable Value Reduced Cost
T( 1) 48.70000 0.000000
T( 2) 52.00000 0.000000
T( 3) 61.30000 0.000000
T( 4) 72.00000 0.000000
T( 5) 48.70000 0.000000
T( 6) 52.00000 0.000000
T( 7) 64.00000 0.000000
W( 1) 2000.000 0.000000
W( 2) 3000.000 0.000000
W( 3) 1000.000 0.000000
W( 4) 500.0000 0.000000
W( 5) 4000.000 0.000000
W( 6) 2000.000 0.000000
W( 7) 1000.000 0.000000
X( 1) 4.000000 0.000000
X( 2) 6.000000 0.000000
X( 3) 4.000000 0.000000
X( 4) 3.000000 0.000000
X( 5) 0.000000 0.000000
X( 6) 1.000000 0.000000
X( 7) 0.000000 0.000000
Y( 1) 3.000000 0.000000
Y( 2) 1.000000 0.000000
Y( 3) 4.000000 0.000000
Y( 4) 2.000000 0.000000
Y( 5) 1.000000 0.000000
Y( 6) 0.000000 0.000000
Y( 7) 6.000000 0.000000
N( 1) 8.000000 0.000000
N( 2) 7.000000 0.000000
N( 3) 9.000000 0.000000
N( 4) 6.000000 0.000000
N( 5) 6.000000 0.000000
N( 6) 4.000000 0.000000
N( 7) 8.000000 0.000000
页:
[1]