任务安排问题

alen1985 2009-04-06 09:59:41
1.设有A,B,C,D,E五人从事J1,J2,J3,J4,J5五项工作,每人只能从事一项工作,他们的工作效益如下:
用分枝定界法编程求出5人的最佳工作安排。

A B C D E
J1 13 11 10 4 7

J2 13 10 10 3 5

J3 5 9 7 7 4

J4 15 12 10 11 5

J5 10 11 8 8 4



求解题思路或最好有代码
...全文
499 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq675927952 2009-04-12
  • 打赏
  • 举报
回复
不懂,只能友情up了
acdbxzyw 2009-04-12
  • 打赏
  • 举报
回复
规模小 穷举A(5,5)就。。。
呵呵
alen1985 2009-04-11
  • 打赏
  • 举报
回复
例1:设有A,B,C,D,E 5人从事j1,j2,j3,j4,j5 5项工作每人只能从事一项,它们的

效益表如下:
  j1 j2 j3 j4 j5
A 13 11 10 4 7
B 13 10 10 8 5
C 5 9 7 7 4
D 15 12 10 11 5
E 10 11 8 8 4

求最佳安排,使效益最高?



原文代码重写如下,希望增加点可读性。



program PlanJob;

const MAX_SIZE = 20;

type
TIntArray = array[1..MAX_SIZE] of Integer;
PNode = ^Node;
Node = record
Job2Man: TIntArray; // Job2Man[n] = m, job-n assign to person-m
Man2Job: TIntArray; // Man2Job[n] = m, person-n assign to job-m
UpperVal: Integer; // upper value
JobsDep: Integer; // jobs decided, as search depth
Next: PNode;
end;

var
CurNode: PNode; // Current node
NewNode: PNode; // New branch node
DelNode: PNode; // for delete
GoalNode: PNode; // the goal
GoalMaxVal: Integer; // goal max value
CurMan, CurJob: Integer; // Current Man and Job of current Node

Size: Integer; // Person number, also task number
Values: array[1..MAX_SIZE, 1..MAX_SIZE] of Integer;

function CalUpperValue(ANode: PNode): Integer;
var
Res: Integer;
Man, Job: Integer;
JobMaxVal: Integer;
begin
Res := 0;
with ANode^ do
begin
for Job := 1 to Size do
begin
if Job <= JobsDep then
begin
Man := Job2Man[Job];
Res := Res + Values[Man, Job];
Continue;
end;

// else find the max value for Job
JobMaxVal := 0;
for Man := 1 to Size do
begin
if (JobMaxVal < Values[Man,Job]) and (Man2Job[Man] = 0) then
JobMaxVal := Values[Man,Job];
end;
Res := Res + JobMaxVal;
end; // for Job
end; // with ANode^
CalUpperValue := Res;
end;

function InitNode(): PNode;
var
Man, Job: Integer;
FInput: Text;
Res: PNode;
begin
Assign(FInput, 'input.txt');
Reset(FInput);
Read(FInput, Size);
Readln(FInput);
for Man := 1 to Size do
begin
for Job := 1 to Size do
Read(FInput, Values[Man,Job]);
Readln(FInput);
end;

New(Res);
with Res^ do
begin
for Man := 1 to Size do
begin
Man2Job[Man] := 0;
Job2Man[Man] := 0;
end;
JobsDep := 0;
UpperVal := CalUpperValue(Res);
Next := nil;
end;
InitNode := Res;
end;

procedure Insert(ANode: PNode; From: PNode);
var
PrevNode, NextNode: PNode;
begin
NextNode := From;
repeat
PrevNode := NextNode;
NextNode := PrevNode^.Next;
until (NextNode = nil) or (ANode^.UpperVal >= NextNode^.UpperVal);
PrevNode^.Next := ANode;
ANode^.Next := NextNode;
end;

procedure PrintNode(ANode: PNode);
var
Man, Job: Integer;
AllJobAssigned: Boolean;
begin
AllJobAssigned := true;
for Job := 1 to Size do
begin
Man := ANode^.Job2Man[Job];
if 0 <> Man then
Writeln('Job ', Job, ' assign to man ',
Man, ', value ', Values[Man, Job])
else
AllJobAssigned := false;
end;
Writeln;
if AllJobAssigned then
Writeln('Value = ', ANode^.UpperVal)
else
Writeln('UpperVal = ', ANode^.UpperVal);
end;

begin
CurNode := InitNode();
GoalMaxVal := 0;

repeat
CurJob := CurNode^.JobsDep + 1;
for CurMan := 1 to Size do
begin
if CurNode^.Man2Job[CurMan] <> 0 then
Continue;

// New search branch
New(NewNode);
NewNode^ := CurNode^;
NewNode^.JobsDep := CurJob;
NewNode^.Man2Job[CurMan] := CurJob;
NewNode^.Job2Man[CurJob] := CurMan;
NewNode^.UpperVal := CalUpperValue(NewNode);

if NewNode^.UpperVal < GoalMaxVal then
Dispose(NewNode) // discard this branch if smaller than limit
else
Insert(NewNode, CurNode);

if CurJob < Size then Continue; // for CurMan

// all job assigned, update goal
if NewNode^.UpperVal > GoalMaxVal then
begin
GoalNode := NewNode;
GoalMaxVal := GoalNode^.UpperVal
end; // if
end; // for CurMan

DelNode := CurNode;
CurNode := CurNode^.Next;
Dispose(DelNode);
until (CurNode^.UpperVal <= GoalMaxVal)
or (CurNode = nil); // end of repeat

PrintNode(GoalNode);
Readln;
end.




input.txt:

5
13 11 10 4 7
13 10 10 8 5
5 9 7 7 4
15 12 10 11 5
10 11 8 8 4

output:

Job 1 assign to man 4, value 15
Job 2 assign to man 5, value 11
Job 3 assign to man 2, value 10
Job 4 assign to man 3, value 7
Job 5 assign to man 1, value 7

Value = 50


这是用pascal写的代码吧?请高手翻译成C或者C++,顶就散分了!
  • 打赏
  • 举报
回复
既然题目已经限制你用分支定界法,那么就照着这个模式来套吧。
用当前已产生的效益为依据,先从效益大的分支优先找起~

另:这实际上是个指派(二分图最佳匹配)的问题,当然有KM或者网络流之类更高效的方法。
  • 打赏
  • 举报
回复
A选任务为第一步.
B选为第2步.
..
..
一步一步套入动态规划模型应该能做吧.

http://www.cppblog.com/Fox/archive/2008/05/07/Dynamic_programming.html
liliangbao 2009-04-06
  • 打赏
  • 举报
回复
算法~
学习,关注!
  • 打赏
  • 举报
回复
动态规划问题..

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧