Irving2 发表于 2021-1-5 15:27

优化模型代码问题,大佬帮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函数的话,结果却错了。










Irving2 发表于 2021-1-5 15:29

另外一道题没有报错的题目和代码


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



vensonjett 发表于 2022-4-5 19:07

你老师给的答案?你老师给的目标函数都是错的哦。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]
查看完整版本: 优化模型代码问题,大佬帮k'k