在第二步中,当所有的(1)都被早晚之后才开始进行(2)的进行,如果第二步进行完之后,所画圈的数字个数,和阶数相同,则找到目标矩阵
代码如下
c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
c=c(:);% 把矩阵c转化为向量 [3;8;2;10;3......]
a=zeros(10,25);% 创建10*25的零矩阵 可以将zeros换为ones\twos... 5行+5列=10 列向量25个
for i=1:5
a(i,(i-1)*5+1:5*i)=1;
%对应转化为列向量之后的c,确保每一个约束条件之和为1,例如i=1时
%上面一行代码 将第一行化为1 1 1 1 1 0 0 0 0...
%意义是X1+X2+X3+X4+X5=1确保约束条件为1
a(5+i,i:5:25)=1;
%确保每一行的第n个元素系数为1,且约束条件之和为1
%例如第六行控制第一列(每一行第一个元素)系数为一,第六列约束条件之和为1
% 参考下方的a
end
% a = [ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
% 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
% 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0;
% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0;
% 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1;
% 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0;
% 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0;
% 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0;
% 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0;
% 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1];
b=ones(10,1); %表示矩阵a*列矩阵c结果都为1,即每一行每一列的约束条件之和都是1
[x,y]=linprog(c,[],[],a,b,zeros(25,1),ones(25,1));% 0为下界,1为上界
X=reshape(x,5,5);%重塑解向量,将x排列成5*5的矩阵
opt=y;%最优解耗费的最小值
模板代码如下