数学建模社区-数学中国

标题: 帮忙看看哪里出现问题了?帮忙调试一下,谢谢了! [打印本页]

作者: nashihuakaimm    时间: 2010-5-13 00:39
标题: 帮忙看看哪里出现问题了?帮忙调试一下,谢谢了!

程序1 求初解

clc,clear

A1=eye(6,6);

A2=eye(4,4);

B1=A1(1:5,:);

B2=A2(1,);

X1=[A1;A1;A1;A1;B1];

X4=[A2;A2;A2;A2;A2;A2;A2;B2];

%以下程序用于求解X2X31-9个决策变量

P1=X1;t=0;

While
t<2

X=zeros(29,6);

c11=zeros(1,6);

c1=zeros(1,6);

count=0;

for m=1:9

tag11=0;

for n=1:6

if P1(m,n)==0

if c11(n)<2&tag11==0&count<3

X(m,n)=1;

tag11=1;

c11(n)=c11(n)+1;

c1(n)=c1(n)+1;

if c11(n)==2

count=count+1;

end

elseif c11(n)<1&tag11==0

X(m,n)=1;

tag11=1;

c11(n)=c11(n)+1;

c1(n)=c1(n)+1;

end

end

end

end

%以下程序用于调整X3中前9行中不满足条件的决策变量

ift==1

a=sum(X(1:9,:));

for m=1:9

if a(m)==0

b=m;

break;

end

end

Y=X(1:9,:);

for m=1:9

kk=0;

c=P1(b,:)+Y(m,:);

for n=1:6

if c(n)==2

kk=1;

break

end

end

if kk==0

X(b,:)=Y(m,:);

X(m,:)=Y(b,:);

for n=1:6

if P1(m,n)==0

X(m,n)=1;

break

end

end

break

end

end

end

%以下程序用于求解X2X320-29个决策变量

for m=10:29

tag12=0;

for n=1:6

if P1(m,n)==0

if c1(n)<5&tag12==0

X(m,n)=1;

tag12=1;

c1(n)=c1(n)+1;

else

X(m,n)=0;

end

else

X(m,n)=0;

end

end

end

%以下程序用于调整X320-29个不满足条件的决策变量

if t==1

Y=X

for m=10:29

if P1(m,6)==0

X(m,:)=Y(29,:);

X(29,:)=Y(m,:);

X(m,6)=1;

break

end

end

end

if t==0

X2=X;

else

X3=X;

end

P1=P1+X;

t=t+1;

end

%以下程序用以求得满足约束条件的X5X6X7

t=0;

while t<3

C2=randperm1(A2);

B2= C2(1,:);

Y=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);

randperm1(A2); randperm1(A2); randperm1(A2);B2];

if t==0

X5=Y;

elseif t==1

X6=Y;

else

X7=Y;

end

t=t+1;

end

%将初解保存在文本文件shuju

save shuju X1 X2 X3 X4 X5 X6 X7

程序2 目标函数

function f=F(A,B,C,D,E,F,G)

Q1=A*A-eye(29,29);

Q2=B*B-eye(29,29);

Q3=C*C-eye(29,29);

Q4=D*D-eye(29,29);

Q5=E*E-eye(29,29);

Q6=F*F-eye(29,29);

Q7=G*G-eye(29,29);

Q_sum=Q1+Q2+Q3+Q4+Q5+Q6+Q7;

Q_sum=Q_sum+eye(29,29);

M=Q_sum1==zeros(29,29);

count=sum(sum(M));

g=norm(Q_sum);

f=0.7*count+0.3*g;

程序3 随即变换

function[X]=randperm1(A)

n=size(A,1);

y=randperm(n);

for p=1:n

X(p,:)=A(y(p),:);

end

程序4 退火过程

%模拟退火算法求最优解

tic;

clc;clear

load shuju;

t0=100;

tf=0.01

k=1000;

f=F(X1,X2,X3,X4,X5,X6,X7);

t=t0;

while t>tf

for k=1:k

y=randperm(9);

for m=1:9

X11(m,:)=X1(y(m),:);

X22(m,:)=X2(y(m),:);

X33(m,:)=X3(y(m),:);

end

z=randperm(20);

z=z+9*ones(1,20);

for m=10:29

X11(m,:)=X1(z(m-9),:);

X22(m,:)=X2(z(m-9),:);

X33(m,:)=X3(z(m-9),:);

end

p=randperm(6);

for m=1:6

X11(:,m)=X1(:,p(m));

X22(:,m)=X2(:,p(m));

X33(:,m)=X3(:,p(m));

end

A2=eye(4,4);

C4=randperm1(A2);

B4=C4(1,:);

C5=randperm1(A2);

B5=C5(1,:);

C6=randperm1(A2);

B6=C6(1,:);

C7=randperm1(A2);

B7=C7(1,:);

X44=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);B4];

X55=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);B5];

X66=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);B6];

X77=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);B7];

ff=F(X11,X22,X33,X44,X55,X66,X77);

if ff<f

X1=X11;

X2=X22;

X3=X33;

X4=X44;

X5=X55;

X6=X66;

X7=X77;

elseif exp((f-ff)/t)>rand(1);

X1=X11;

X2=X22;

X3=X33;

X4=X44;

X5=X55;

X6=X66;

X7=X77;

end

f=ff

end

t=0.87*t;

end

toc;

1=toc

save zhi X1 X2 X3 X4 X5 X6 X7
%
将结果保留在zhi

程序5
计算见面次数

load zhi

Q1=X1*X1-eye(29,29);

Q2=X2*X2-eye(29,29);

Q3=X3*X3-eye(29,29);

Q4=X4*X4-eye(29,29);

Q5=X5*X5-eye(29,29);

Q6=X6*X6-eye(29,29);

Q7=X7*X7-eye(29,29);

Q_sum=Q1+Q2+Q3+Q4+Q5+Q6+Q7;

Q_sum1=Q_sum+eye(29,29);

M=Q_sum1==zeros(29,29);

count=sum(sum(M));

g=norm(Q_sum);

f=0.7*count+0.3*g;

f,count,g

count0=0;count1=0;count2=0;count3=0;count4=0;count5=0;count6=0;count7=0;

for m=1:29

for n=1:29

if Q_sum(m,n)==0

count0=count0+1;

elseif Q_sum(m,n)==1

count1=count1+1;

elseif Q_sum(m,n)==2

count2=count2+1;

elseif Q_sum(m,n)==3

count3=count3+1;

elseif Q_sum(m,n)==4

count4=count4+1;

elseif Q_sum(m,n)==5

count5=count5+1;

elseif Q_sum(m,n)==6

count6=count6+1;

elseif Q_sum(m,n)==0

count7=count7+1;

end

end

end

(count0-29)/2,count1/2,count2/2,count3/2,count4/2,count5/2,count6/2,count7/2


作者: nashihuakaimm    时间: 2010-5-13 00:40
randperm1,运行时,说没有这个函数呢?帮忙调试一下,万分感谢!!!
作者: olh2008    时间: 2010-5-13 08:38
randperm(n)作用是产生一个介于1~n的随机序列,比如randperm(6),可能得到序列[6 1 4 2 5 3]。
但randperm1()这个函数在Matlab是没有的,你自己如果没有定义的话就肯定不能执行。你可以把randperm1改成randperm试一试,看结果有没有问题。
作者: 数学者    时间: 2010-5-13 08:45
是生成n个在[1,n]内的无重复的随机整数吗?是randperm,而不是randperm1...
作者: nashihuakaimm    时间: 2010-5-13 10:23
回复 3# olh2008


    randperm1()这个函数在Matlab是没有的,你自己如果没有定义的话就肯定不能执行。……那要怎么定义呢?
作者: nashihuakaimm    时间: 2010-5-13 10:33
回复 4# 数学者


   

%以下程序用以求得满足约束条件的X5X6X7

t=0;

while t<3

C2=randperm1(A2);

B2= C2(1,;

Y=[randperm1(A2); randperm1(A2); randperm1(A2); randperm1(A2);

randperm1(A2); randperm1(A2); randperm1(A2);B2];

if t==0

X5=Y;

elseif t==1

X6=Y;

else

X7=Y;

end

t=t+1;

end

这一段有问题吗?因为这是别人的程序,不懂啊,帮忙看一下!


作者: 数学者    时间: 2010-5-13 14:41
回复 6# nashihuakaimm


    把randperm1改成randperm试试看~




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5