运筹学指派问题的匈牙利法Word文档下载推荐.docx

上传人:b****3 文档编号:13476965 上传时间:2022-10-11 格式:DOCX 页数:18 大小:85.07KB
下载 相关 举报
运筹学指派问题的匈牙利法Word文档下载推荐.docx_第1页
第1页 / 共18页
运筹学指派问题的匈牙利法Word文档下载推荐.docx_第2页
第2页 / 共18页
运筹学指派问题的匈牙利法Word文档下载推荐.docx_第3页
第3页 / 共18页
运筹学指派问题的匈牙利法Word文档下载推荐.docx_第4页
第4页 / 共18页
运筹学指派问题的匈牙利法Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

运筹学指派问题的匈牙利法Word文档下载推荐.docx

《运筹学指派问题的匈牙利法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《运筹学指派问题的匈牙利法Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

运筹学指派问题的匈牙利法Word文档下载推荐.docx

2.算法流程或步骤:

1.将原始效益矩阵C的每行、每列各元素都依次减去该行、该列的最小元素,使每行、每列都至少出现一个0元素,以构成等价的效益矩阵C’。

2.圈0元素。

在C’中未被直线通过的含0元素最少的行(或列)中圈出一个0元素,通过这个0元素作一条竖(或横)线。

重复此步,若这样能圈出不同行不同列的n个0元素,转第四步,否则转第三步。

3.调整效益矩阵。

在C’中未被直线穿过的数集D中,找出最小的数d,D中所有数都减去d,C’中两条直线相交处的数都加的d。

去掉直线,组成新的等价效益矩阵仍叫C’,返回第二步。

4.令被圈0元素对应位置的=1,其余=0,这就是一种最优分配。

最低总耗费是C中使=1的各位置上各元素的和。

算法流程图:

Y

N

3.算法源程序:

#include<

iostream.h>

typedefstructmatrix

{

floatcost[101][101];

intzeroelem[101][101];

floatcostforout[101][101];

intmatrixsize;

intpersonnumber;

intjobnumber;

}matrix;

matrixsb;

intresult[501][2];

voidtwozero(matrix&

sb);

voidjudge(matrix&

sb,intresult[501][2]);

voidrefresh(matrix&

voidcirclezero(matrix&

matrixinput();

voidoutput(intresult[501][2],matrixsb);

voidzeroout(matrix&

matrixinput()

matrixsb;

intm;

intpnumber,jnumber;

inti,j;

floatk;

charw;

cout<

<

"

指派问题的匈牙利解法:

endl;

求最大值,请输入1;

求最小值,请输入0:

cin>

>

m;

while(m!

=1&

&

m!

=0)

{

cout<

请输入1或0:

cin>

}

请输入人数(人数介于1和100之间):

pnumber;

while(pnumber<

1||pnumber>

100)

{

请输入合法数据:

请输入工作数(介于1和100之间):

jnumber;

while(jnumber<

1||jnumber>

请输入"

pnumber<

行"

jnumber<

列的矩阵,同一行内以空格间隔,不同行间以回车分隔,以$结束输入:

\n"

;

for(i=1;

i<

=pnumber;

i++)

for(j=1;

j<

=jnumber;

j++)

{

cin>

sb.cost[i][j];

sb.costforout[i][j]=sb.cost[i][j];

}

w;

if(jnumber>

pnumber)

for(i=pnumber+1;

for(j=1;

{

sb.cost[i][j]=0;

sb.costforout[i][j]=0;

}

else

if(pnumber>

jnumber)

for(i=1;

for(j=jnumber+1;

{

sb.cost[i][j]=0;

sb.costforout[i][j]=0;

}

sb.matrixsize=pnumber;

if(pnumber<

sb.matrixsize=jnumber;

sb.personnumber=pnumber;

sb.jobnumber=jnumber;

if(m==1)

k=0;

for(i=1;

=sb.matrixsize;

if(sb.cost[i][j]>

k)

k=sb.cost[i][j];

sb.cost[i][j]=k-sb.cost[i][j];

returnsb;

}

sb)

intp;

for(i=0;

sb.cost[i][0]=0;

for(j=1;

sb.cost[0][j]=0;

if(sb.cost[i][j]==0)

sb.cost[i][0]++;

sb.cost[0][j]++;

sb.cost[0][0]++;

for(j=0;

sb.zeroelem[i][j]=0;

k=sb.cost[0][0]+1;

while(sb.cost[0][0]<

k=sb.cost[0][0];

if(sb.cost[i][0]==1)

for(j=1;

if(sb.cost[i][j]==0&

sb.zeroelem[i][j]==0)

break;

sb.zeroelem[i][j]=1;

sb.cost[i][0]--;

sb.cost[0][j]--;

sb.cost[0][0]--;

if(sb.cost[0][j]>

0)

for(p=1;

p<

p++)

if(sb.cost[p][j]==0&

sb.zeroelem[p][j]==0)

{

sb.zeroelem[p][j]=2;

sb.cost[p][0]--;

sb.cost[0][j]--;

sb.cost[0][0]--;

}

if(sb.cost[0][j]==1)

for(i=1;

if(sb.cost[i][0]>

if(sb.cost[i][p]==0&

sb.zeroelem[i][p]==0)

sb.zeroelem[i][p]=2;

sb.cost[i][0]--;

sb.cost[0][p]--;

if(sb.cost[0][0]>

twozero(sb);

judge(sb,result);

intp,q;

intm,n;

matrixst;

if(sb.cost[i][0]>

break;

if(i<

=sb.matrixsize)

st=sb;

if(sb.cost[i][j]==0&

for(q=1;

q<

q++)

if(sb.cost[i][q]==0&

sb.zeroelem[i][q]==0)

{

sb.zeroelem[i][q]=2;

sb.cost[i][0]--;

sb.cost[0][q]--;

sb.cost[0][0]--;

}

for(p=1;

if(sb.cost[p][j]==0&

sb.zeroelem[p][j]=2;

sb.cost[p][0]--;

sb.cost[0][j]--;

k=sb.cost[0][0]+1;

while(sb.cost[0][0]<

k=sb.cost[0][0];

for(p=i+1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1