如何在matlab中使用遗传算法求解多变量?

如何在matlab中使用遗传算法求解多变量?,matlab,genetic-algorithm,Matlab,Genetic Algorithm,这是我的模型: 为了解决这个问题,我在matlab中使用了GA function F = sim_fit(q,k,m) %retailer a(1,1)=3;a(2,1)=2;a(3,1)=3;a(1,2)=1;a(2,2)=1.1;a(3,2)=9; d(1,1)=1850;d(2,1)=2000;d(3,1)=3000;d(1,2)=2100;d(2,2)=1300;d(3,2)=900; hr(1,1)=2.4;hr(2,1)=1.3;hr(3,1)=38;hr(1,2)=4.5;hr(

这是我的模型:

为了解决这个问题,我在matlab中使用了GA

function F = sim_fit(q,k,m)
%retailer
a(1,1)=3;a(2,1)=2;a(3,1)=3;a(1,2)=1;a(2,2)=1.1;a(3,2)=9;
d(1,1)=1850;d(2,1)=2000;d(3,1)=3000;d(1,2)=2100;d(2,2)=1300;d(3,2)=900;
hr(1,1)=2.4;hr(2,1)=1.3;hr(3,1)=38;hr(1,2)=4.5;hr(2,2)=3.6;hr(3,2)=45;
so(1,1)=3.5;so(2,1)=1.5;so(3,1)=2.5;so(1,2)=0.3;so(2,2)=0.6;so(3,2)=6.3;
t(1,1)=1;t(2,1)=1;t(3,1)=3;t(1,2)=1;t(2,2)=1;t(3,2)=3;
E(1,1)=2;E(2,1)=2;E(3,1)=10;E(1,2)=2;E(2,2)=2;E(3,2)=10;
Y(1,1)=3;Y(2,1)=3;Y(3,1)=11;Y(1,2)=3;Y(2,2)=3;Y(3,2)=11;

%vendor
S=100;
hv(1)=3.5;hv(2)=4;
C(1)=10; C(2)=50;
Cv(1)=2.4; Cv(2)=3;
Cf(1)=3; Cf(2)=1.2;
s(1)=0.3; s(2)=0.1;
the(1)=0.01; the(2)=0.03;
dv(1)=sum(d(1,1)+d(1,2));dv(2)=sum(d(2,1)+d(2,2));
Q(1)=sum(q(1,1)+q(1,2));Q(2)=sum(q(2,1)+q(2,2));
P(1)=10000; P(2)=8000;


%function
for j=1:2
 for i=1:2   
F= S*dv(i)/(Q(i)*m(i,j))+(hv(i)*Q(i)*((m(i)-1)*(1-dv(i)/P(i))+dv(i)/P(i)))/2+...
dv(i)*(m(i)*C(i)+m(i)*Q(i)*Cv(i)+Cf(i))+m(i)*s(i)*dv(i)*Q(i)*the(i)/2+...
a(i,j).*d(i,j)./q(i,j)+(hr(i,j).*((1-k(i,j)).^2).*q(i,j))./2+...
k(i,j).^2.*so(i,j).*q(i,j)./2+(m(i)*t(i,j).*d(i,j))./q(i,j)+(m(i)*E(i,j).*d(i,j))./q(i,j)+...
Y(i,j).*d(i,j);
 end
end
end


function [C, ceq] = sim_constraint(q,k,m)
B(:,1)=200;B(:,2)=300;
W(:,1)=100;W(:,2)=100;
b(1)=10; b(2)=14;
w(1)=1; w(2)=1.5;
P(1)=10000; P(2)=8000;
C=[(m(1).*q(1,1).*b(1)+m(2).*q(2,1).*b(2))-B(:,1);
    (m(1).*q(1,2).*b(1)+m(2).*q(2,2).*b(2))-B(:,2);
  (m(1).*q(1,1).*w(1)+m(2).*q(2,1).*w(2))-W(:,1);
    (m(1).*q(1,2).*w(1)+m(2).*q(2,2).*w(2))-W(:,2);
    m(1)*Q(1)-P(1);m(2)*Q(2)-P(2)
    k(1,1)-1;k(1,2)-1;k(2,1)-1;k(2,2)-1];
ceq=[d(1,1)+d(1,2)-dv(1);(d(2,1)+d(2,2))-dv(2);
(q(1,1)+q(1,2))-Q(1);(q(2,1)+q(2,2))-Q(2)];
end
首先,我不知道如何在sim_适应度函数中输入二进制变量Xij

其次,为了解决这个问题,我使用了优化工具箱。 错误消息说“需要更多的输入变量。”


我该如何修复它?

这不是对你问题的回答。但是,请,请开始使用matlab,因为它是有意的:)如果它是这么麻烦,那么人们就不会使用它

如果您将现有代码更改为以下内容,人类的净幸福感将会增加:

function F = sim_fit(q,k,m)
   %retailer
   a=[3 2 3; 1 1.1 9].'; %or a=[3 1; 2 1.1; 3 9];
   d=[1850 2000 3000; 2100 1300 900].';
   hr=[2.4 1.3 38; 4.5 3.6 45].';
   so=[3.5 1.5 2.5; 0.3 0.6 6.3].';
   t=[1 1 3; 1 1 3].';
   E=[2 2 10; 2 2 10].';
   Y=[3 3 11; 3 3 11].';

   %vendor
   S=100;
   hv=[3.5 4];
   C=[10 50];
   Cv=[2.4 3];
   Cf=[3 1.2];
   s=[0.3 0.1];
   the=[0.01 0.03];
   dv=sum(d(1:2,:),2).'; %row vector like the earlier ones
   Q=sum(q(1:2,:),2).';
   P=[10000 8000];


   %function
   for j=1:2
      for i=1:2   
         F= S*dv(i)/(Q(i)*m(i,j))+(hv(i)*Q(i)*((m(i)-1)*(1-dv(i)/P(i))+dv(i)/P(i)))/2+...
            dv(i)*(m(i)*C(i)+m(i)*Q(i)*Cv(i)+Cf(i))+m(i)*s(i)*dv(i)*Q(i)*the(i)/2+...
            a(i,j).*d(i,j)./q(i,j)+(hr(i,j).*((1-k(i,j)).^2).*q(i,j))./2+...
            k(i,j).^2.*so(i,j).*q(i,j)./2+(m(i)*t(i,j).*d(i,j))./q(i,j)+(m(i)*E(i,j).*d(i,j))./q(i,j)+...
            Y(i,j).*d(i,j);
      end
   end

end


function [C, ceq] = sim_constraint(q,k,m)
   B=[200 300];
   W=[100 100];
   b=[10 14];
   w=[1 1.5];
   P=[10000 8000];

   mtmp=reshape(m(1:2),1,[]); %since I don't know its size, be on the safe side
   qtmp=q(1:2,1:2); %same thing here

   %WHAT IS Q?
   %WHAT IS d?
   %WHAT IS dv?

   C=[((mtmp.*b)*qtmp - B).';
      ((mtmp.*w)*qtmp - W).';
      (mtmp.*Q-P).'; %assuming Q is of size [1, 2]
      reshape(k(1:2,1:2).',4,1)-1];

   ceq=[sum(d(1:2,1:2),2)-dv.';
        sum(q(1:2,1:2),2)-Q.']; %assuming Q is of size [1, 2]

end
很抱歉,我没有能力解密
F
的表达式。我强烈建议您熟悉matlab的基本数组语法,并检查自己在代码转换过程中是否犯了任何错误。如果您学会了如何使用矩阵和向量,那么像
F
这样的表达式可以从根本上简化


此外,第二个函数中似乎缺少变量
Q
d
dv
的定义。这些不是全局的,是吗?

你是如何使用优化工具箱的?哪一行产生了错误?而且,你的MATLAB版本听起来很像《短路》中的小机器人:-)哇,耶,太多了!我缺少上一个函数中的
Q
d
dv
的定义。