是否可以在fmincon中使用二进制和连续变量?

时间:2016-06-20 14:31:59

标签: matlab optimization nonlinear-optimization

您好我是Matlab Optimization的初学者。我想根据两个变量矩阵(x(1)-x(72)继续变量和x(73)-x(90)二进制变量)最小化函数。代码如下。我不确定我是否可以在fmincon函数中使用二进制和连续变量。如何合并二进制变量?请注意,约束是线性的。任何帮助都将非常感激。

 function [c, ceq] = confun(x)
dA1=5;
dA2=9;
dB1=7;
dB2=7;
dC1=10;
dC2=5;
k=2;
 % Nonlinear inequality constraints
c = [   x(73)+x(74)+x(75)+x(76)+x(77)+x(78)-k;
  x(79)+x(80)+x(81)+x(82)+x(83)+x(84)-k;
  x(85)+x(86)+x(87)+x(88)+x(89)+x(90)-k;
   x(1)-dA1*x(73);
   x(2)-dA1*x(79);
   x(13)-dA1*x(74);
   x(14)-dA1*x(80);
   x(25)-dA1*x(75);
   x(26)-dA1*x(81);
   x(37)-dA1*x(76);
   x(38)-dA1*x(79);
   x(49)-dA1*x(77);
   x(50)-dA1*x(83);
   x(61)-dA1*x(78);
   x(62)-dA1*x(84); 
   x(3)-dB1*x(73);
   x(4)-dB1*x(79); 
   x(15)-dB1*x(74);  
   x(16)-dB1*x(80);  
   x(27)-dB1*x(75);  
   x(28)-dB1*x(81);  
   x(39)-dB1*x(76);  
   x(40)-dB1*x(82);  
   x(51)-dB1*x(77);  
   x(52)-dB1*x(83);  
   x(63)-dB1*x(78);  
   x(64)-dB1*x(84);
   x(5)-dC1*x(73);
   x(6)-dC1*x(79);
   x(17)-dC1*x(74);
   x(18)-dC1*x(80);
   x(29)-dC1*x(75);
   x(30)-dC1*x(81);
   x(41)-dC1*x(76);
   x(42)-dC1*x(82);
   x(53)-dC1*x(77);
   x(54)-dC1*x(83);
   x(65)-dC1*x(78);
   x(66)-dC1*x(84); 
   x(7)-dA2*x(79);
   x(8)-dA2*x(85);
   x(19)-dA2*x(80);
   x(20)-dA2*x(86);
   x(31)-dA2*x(81);
   x(32)-dA2*x(87);
   x(43)-dA2*x(82);
   x(44)-dA2*x(88);
   x(55)-dA2*x(83);
   x(56)-dA2*x(89);
   x(67)-dA2*x(84);
   x(68)-dA2*x(90); 
   x(9)-dB2*x(79);
   x(10)-dB2*x(85);
   x(21)-dB2*x(80);
   x(22)-dB2*x(86);
   x(33)-dB2*x(81);
   x(34)-dB2*x(87);
   x(45)-dB2*x(82);
   x(46)-dB2*x(88);
   x(57)-dB2*x(83);
   x(58)-dB2*x(89);
   x(69)-dB2*x(84);
   x(70)-dB2*x(90); 
   x(11)-dC2*x(79);
   x(12)-dC2*x(85);
   x(23)-dC2*x(80);
   x(24)-dC2*x(86);
   x(35)-dC2*x(81);
   x(36)-dC2*x(87);
   x(47)-dC2*x(82);
   x(48)-dC2*x(88);
   x(59)-dC2*x(83);
   x(60)-dC2*x(89);
   x(71)-dC2*x(84);
   x(72)-dC2*x(90); 
   x(1) + x(3) + x(5)-15;
   x(7) + x(9) + x(11) + x(2) + x(4)+ x(6)-15;
   x(8) + x(10) + x(12)-15; 
   x(13) + x(15) + x(17)-15;
   x(19) + x(21) + x(23) + x(14) + x(16)+ x(18)-15;
   x(20) + x(22) + x(24)-15; 
   x(25) + x(27) + x(29)-15;
   x(31) + x(33) + x(35) + x(26) + x(28)+ x(30)-15;
   x(32) + x(34) + x(36)-15; 
   x(37) + x(39) + x(41)-15;
   x(43) + x(45) + x(47) + x(38) + x(40)+ x(42)-15;
   x(44) + x(46) + x(48)-15; 
   x(49) + x(51) + x(53)-15;
   x(55) + x(57) + x(59) + x(50) + x(52)+ x(54)-15;
   x(56) + x(58) + x(60)-15; 
   x(61) + x(63) + x(65)-15;
   x(67) + x(69) + x(71) + x(62) + x(64)+ x(66)-15;
   x(68) + x(70) + x(72)-15; 
   x(1)+x(2)+ x(13)+x(14)+x(25)+x(26)+ x(37)+x(38)+ x(49)+x(50)+ x(61)+x(62)-dA1;
   x(7)+x(8)+ x(19)+x(20)+x(31)+x(32)+ x(43)+x(44)+ x(55)+x(56)+ x(67)+x(68)-dA2;
   x(3)+x(4)+ x(15)+x(16)+x(27)+x(28)+ x(39)+x(40)+ x(51)+x(52)+ x(63)+x(64)-dB1;
   x(9)+x(10)+ x(21)+x(22)+x(33)+x(34)+ x(45)+x(46)+ x(57)+x(58)+ x(69)+x(70)-dB2 ];

  % Nonlinear equality constraints
  ceq = [];

  end


   function f = objfun(x)
   f = (339*x(1)*x(2))/6050 + (68*x(7)*x(8))/3969 + (339*x(1)*x(13))/6050 + (339*x(1)*x(14))/6050 + (339*x(2)*x(13))/6050 + (339*x(2)*x(14))/6050 + (68*x(7)*x(19))/3969 + (68*x(7)*x(8))/3969 + (68*x(8)*x(19))/3969 + (68*x(8)*x(20))/3969 + (339*x(1)*x(25))/6050 ...

  end
  clc;
  clear;
  close all;
  ub = [Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf;Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf;Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf; Inf;Inf;Inf;1;1;1; 1;1;1; 1;1;1; 1;1;1; 1;1;1; 1;1;1];   
   x0 = ones(90,1);     
   options = optimset('Algorithm','active-set');
   %options = optimoptions(@fmincon,'Algorithm','sqp');
   [x,fval] = fmincon(@objfun,x0,[],[],[],[],[],ub,@confun,options);


  I get these warnings and errors:
      Attempt to reference field of non-structure array.
      Error in confun (line 10)
      c = [   x(73)+x(74)+x(75)+x(76)+x(77)+x(78)-k;
      Error in fmincon (line 651)
       [ctmp,ceqtmp] = feval(confcn{3},X,varargin{:});
       Error in nonlinear (line 23)
       [x,fval] = fmincon(@objfun,x0,[],[],[],[],[],ub,@confun,options);
        Caused by:
          Failure in initial user-supplied nonlinear constraint function evaluation. FMINCON cannot continue

1 个答案:

答案 0 :(得分:0)

您无法使用fmincon(),因为它不会处理整数参数。你需要一个求解混合整数编程的解算器,它涉及带有实数和整数值的参数。如果您可以将问题表示为混合整数线性程序(看起来并非如此),那么您可以使用intlinprog()。请参阅herehere。遗传算法(使用Mathworks全局优化工具箱)可能能够解决问题。见here。否则,您可以查看外部工具箱。 CPLEX和GUROBI有Matlab接口。这些是商业软件,但可以免费获得学术许可。