24小时热门版块排行榜    

查看: 2956  |  回复: 7

dellluoluo

金虫 (小有名气)

[求助] 求助:遗传算法的matlab编程求解资源优化问题

最近在研究项目资源优化问题,其中一个问题即工期固定,资源均衡问题,用遗传算法来做,使用matlab的遗传算法工具箱自己编程来实现,有详细的文献和例子,只做单资源的,需要将目标函数写成.m 文件,
遇到困难:目标函数是使得资源均衡,满足工序的合适开始时间即基因值
,困难是基因值不体现在目标函数的显式表达式中,而是在约束条件中,不知道怎么处理?
如果有哪位虫友感兴趣并愿意提供帮助,将不胜感激!如果需要,我可以把例子附上。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

恩斯特

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
csgt0: 金币+1, 谢谢 2013-04-10 16:58:40
dbb627: 2013-06-01 11:38:40
dellluoluo(dbb627代发): 金币+10 2013-06-01 11:39:10
其实我也不太看得懂你的需求,不过约束条件可以在区域描述器(Build field descriptor)时来约束变量范围。
因为我是用Sheffield大学的那个工具箱而不是matlab自带的,所以不太清楚matlab自带的是怎样用的,你也可以下sheffield大学的这个工具箱来看看,它自带例子,上手挺简单的
2楼2013-04-09 13:39:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dellluoluo

金虫 (小有名气)

呵呵,是我自己说错了,我也是用的Sheffeild工具箱来编的,可是还是糊涂,我的编码看文献说染色体用实数编码,我的染色体不是显示的体现在目标函数中,我的问题应是单目标优化,属于多元多峰函数的优化,我想在雷英杰那本Matlab遗传算法工具箱那本书的7.3的例子的基础上修改,可是改的很糊涂。
如果您乐意帮助我,咱们可以QQ或邮件交流,我可以将具体问题发给你帮我看看。先感谢你!
3楼2013-04-10 21:04:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dellluoluo

金虫 (小有名气)


fegg7502: 金币+1, 鼓励交流 2013-04-11 10:38:27
想得到您的相助!
下面是我的具体问题
%programm:
%计算工期固定,资源均衡的程序,为资源均衡之前的结果,得到RLI=76
clear;
T0=16;%固定工期,由project软件求得关键路径
n=11;%活动数
for j=1:T0
for i=1:n
     ri=[2 1 4 4 2 4 6 0 2 1 2];%每个活动日资源
  % ri=[2 1 4 4]
     di=[2 4 1 4 3 6 6 1 4 5 1];%每个活动持续工期
   %di=[2 4 1 4]
     esi=[0 0 0 2 4 4 1 7 7 10 15];%每个活动最早开始时间
   %esi=[0 0 0 2]
     efi=esi+di;%每个活动最早完成时间
     xij=zeros(i,j);%系数矩阵
     r_=sum(ri*di')/T0;%每个活动平均日资源需求
     ti=esi;%每个活动实际开始时间
     rij=0;
end;
end;
for j=1:T0
for i=1:n
    if (j>= ti(i)+1)&(j<=ti(i)+di(i))
      xij(i,j)=1;
      rij=ri*xij;
      tii(i)=ti(i);
      RLI=sum(abs(rij-r_));%目标函数,绝对误差和
      end
end
end
x=1:T0;
bar(x,rij);%直方图
xlabel('Time');
ylabel('Daily Resource Demand Before Leveling');
上面这个已经得到结果!下面这个是想要得到的结果:
%programm:想要得到的结果,即想要通过遗传算法的计算,找到一组合适的基因值,也即是
%每个活动合适的实际开始时间ti属于[esi(i);esi(i)+tfi(i)],得到如下的结果,使RLI=25。
clear;
T0=16;%固定工期
n=11;%活动数
for j=1:T0
for i=1:n
     ri=[2 1 4 4 2 4 6 0 2 1 2];%每个活动日资源
  % ri=[2 1 4 4]
     di=[2 4 1 4 3 6 6 1 4 5 1];%每个活动持续工期
   %di=[2 4 1 4]
     esi=[0 0 0 10 7 4 1 14 11 10 15];%每个活动最早开始时间
   %esi=[0 0 0 2]
     efi=esi+di;%每个活动最早完成时间
     xij=zeros(i,j);%系数矩阵
     r_=sum(ri*di')/T0;%每个活动平均日资源需求
     ti=esi;%每个活动实际开始时间%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     %(这个是需要经过遗传算法计算后得到的结果)%
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     rij=0;
end;
end;
for j=1:T0
for i=1:n
    if (j>= ti(i)+1)&(j<=ti(i)+di(i))
      xij(i,j)=1;
      rij=ri*xij;
      tii(i)=ti(i);
      RLI=sum(abs(rij-r_));%目标函数
      end
end
end
x=1:T0;
bar(x,rij);%直方图
xlabel('Time');
ylabel('Daily Resource Demand After Leveling');

下面想用GA求:程序没有写明白?????????????????
%GA programm
T0=16;%固定工期
%T0=6;
n=11;%活动数
for j=1:T0
for i=1:n
     ri=[2 1 4 4 2 4 6 0 2 1 2];%每个活动日资源
  % ri=[2 1 4 4]
     di=[2 4 1 4 3 6 6 1 4 5 1];%每个活动持续工期
   %di=[2 4 1 4]
     esi=[0 0 0 2 4 4 1 7 7 10 15];%每个活动最早开始时间(遗传算法应用之前)
   %esi=[0 0 0 2]
     efi=esi+di;%每个活动最早完成时间
     lsi=[6 0 3 10 8 4 4 14 11 10 15];%最迟开始时间
     tfi=lsi-esi;%总时差
     
     xij=zeros(i,j);%系数矩阵
     r_=sum(ri*di')/T0;%每个活动平均日资源需求
     ti=esi;%每个活动实际开始时间
     rij=0;
end;
end;
for j=1:T0
for i=1:n
    if (j>= ti(i)+1)&(j<=ti(i)+di(i))
      xij(i,j)=1;
      rij=ri*xij;
      tii(i)=ti(i);
      RLI=sum(abs(rij-r_));%目标函数,绝对误差和
      end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%想把上面这一段写成function的形式来调用!不清楚怎么写?%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%定义 遗传算法参数
NVAR=11;%变量维数
NIND=50;%基因规模
PRECI=20;%基因长度
GGAP=0.9;%代沟
Pc=0.5;%交叉率
Pm=0.4;%变异率
MAXGEN=100;%演化代数
%建立区域扫描器%%%%%%%%%%%%
%想在下面这段遗传算法的程序基础上修改,这个程序是雷英杰那个书上的的
%7.3求多元多峰函数优化的实例%%%%%%%%%%%%%,不会写目标函数????
%这个目标函数在遗传算法中不知道怎么写 RLI=sum(abs(rij-r_))
%关键是基因值没有体现在目标函数中,只是隐含在xij中,当ti在活动的
%【esi,esi+tfi】之间时,xij=1,才计算RLI. else xij=0不计算
%最终得到的结果是找到一组合适的ti,使得计算的RLI=25
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
trace = zeros(MAXGEN,NVAR);
for i=1:NVAR
    FieldDR = [rep([PRECI],[2,NVAR]);rep([esi(i);esi(i)+tfi(i)],[2,NVAR]);rep([1;0;1;1],[2,NVAR])];%这句不清楚是否有%问题?
end;
Chrom=crtrp(NIND,FieldDR);%创建初始实值种群
%
gen = 0;
trace=zeros(MAXGEN,2);

ObjV= RLI;%%%%%%%%%%%%%%%%%%这个函数不会写?
while gen     FitnV=ranking(ObjV);
    SelCh=select('sus',Chrom,FitnV,GGAP);
    SelCh=recombin('xovsp',SelCh,0.5);
    SelCh=mut(SelCh,0.4);
   
    ObjVSel=RLI;%%%%%%%%%%%%%%%%%%%%%%%%????????
    [Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
    gen=gen+1;
    %输出最优解
    [Y,I] = min(ObjVSel);

  %  plot(variable(I),Y,'bo');
    trace(gen,1)=min(ObjV);
    trace(gen,2)=sum(ObjV)/length(ObjV);
    if (gen==100)
        figure(2);
        plot(ObjV);hold on;
        plot(ObjV,'b*');grid;
    end
end
figure(3);clf;
plot(trace(:,1));hold on;
plot(trace(:,2)','-.');grid;
%legend('aa','bb').
4楼2013-04-10 21:30:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

恩斯特

金虫 (小有名气)


csgt0: 金币+1, 谢谢 2013-06-03 14:46:09
引用回帖:
4楼: Originally posted by dellluoluo at 2013-04-10 21:30:32
想得到您的相助!
下面是我的具体问题
%programm:
%计算工期固定,资源均衡的程序,为资源均衡之前的结果,得到RLI=76
clear;
T0=16;%固定工期,由project软件求得关键路径
n=11;%活动数
for j=1:T0
for i ...

你的目标函数要是一个可变的函数公式,不是一个定值数组,将RLI换成你的sum(abs(rij-r_)),你也可以用你知道的function来套进去,不会的话可以在论坛或者百度一下。
我总觉得你的区域描述器那步有点做错了,这个你能弄到11维的区域描述器吗?
还有变异概率太大了,在0.01~0.2之间就可以,0.4的话不太能找到最优解
5楼2013-06-03 14:26:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

恩斯特

金虫 (小有名气)

我又看了一下,function的用法是function [a,b,c,d……]=y(x1,x2,x3……),你要得出的是a\b\c那部分,X1,X2,X3就是你要计算的变量,将Chrom放进去,就是function [RLI]=yy(Chrom(1),Chrom(2)...

我还是没搞清楚你的变量是指esi和tfi还是11维的esi还是其他东西……
你将你的变量跟我说明白的话那就好办点,现在我不懂怎样帮你
6楼2013-06-03 14:47:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

czmztt123

铜虫 (初入文坛)

看不懂,感谢分享
7楼2014-04-08 19:49:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小小懵懂先森

金虫 (小有名气)

楼主最后怎么做的呢?我在做“资源受限,工期最短”问题,想请教下??
8楼2017-05-29 19:35:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 dellluoluo 的主题更新
信息提示
请填处理意见