02整數規划
蒙特卡洛法(隨機取樣法)
編寫文件mengte.m,目標函數f和約束向量g
function[f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-... 2*x(5); g=[ sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800 2*x(1)+x(2)+6*x(3)-200 x(3)+x(4)+5*x(5)-200 ];
主函數
format compact; rand('state',sum(clock)); % 初始化隨機數發生器 p0=0; tic % 計時開始 for i=1:10^6 x=randi([0,99],1,5); % 產生1行5列的區間[0,99]上的隨機整數 [f,g]=mengte(x); if all(g<=0) if p0<f x0=0;p0=f; % 記錄下當前較好的解 end end end x0,p0 toc % 計時結束
指派問題
clear C=[2 10 9 7 15 4 14 8 13 14 16 11 4 15 13 9]; A = perms(1:4);%perm顯示1,2,3,4四個數的全排列 L = length(A) for i=1:L a = zeros(4,4); b = A(i,:);%遍歷全排列中的每一種 c = 1:4; a(sub2ind(size(a), b, c))=1;%a矩陣指定的位置賦值為1 D{i}=a; S(i)=sum(sum(a.*C));%求出費用和 end [a,b]=find(S==min(S)) D{b} S(b)
%適用於任意n階系數矩陣 clear all; C=[2 10 9 7, 15 4 14 8, 13 14 16 11, 4 15 13 9, ];%效率矩陣C n=size(C,1);%計算C的行列數n C=C(:);%計算目標函數系數,將矩陣C按列排成一個列向量即可。 A=[];B=[];%沒有不等式約束 Ae=zeros(2*n,n^2);%計算等約束的系數矩陣a for i=1:n for j=(i-1)*n+1:n*i Ae(i,j)=1; end for k=i:n:n^2 Ae(n+i,k)=1; end end Be=ones(2*n,1);%等式約束右端項b Xm=zeros(n^2,1);%決策變量下界Xm XM=ones(n^2,1);%決策變量上界XM [x,z]=linprog(C,A,B,Ae,Be,Xm,XM);%使用linprog求解 x=reshape(x,n,n);%將列向量x按列排成一個n階方陣 disp('最優解矩陣為:');%輸出指派方案和最優值 Assignment=round(x)%使用round進行四舍五入取整 disp('最優解為:'); z
混合整數規划
format compact % min z = -3x1-2x2-x3 % x1+x2+x3 <=7 % 4x1+2x2+x3=12 % x1,x2>=0 % x3=0或1 clc,clear f=[-3;-2;-1];intcon=3; % 整數變量的地址 a=ones(1,3);b=7; aeq=[4 2 1];beq=12; lb=zeros(3,1);ub=[inf;inf;1]; % x(3)為0-1變量 x=intlinprog(f,intcon,a,b,aeq,beq,lb,ub)