人工智能问题,求个算法?非高手不许看啊(90分)

  • 主题发起人 主题发起人 lunni
  • 开始时间 开始时间
L

lunni

Unregistered / Unconfirmed
GUEST, unregistred user!
有个算法的问题,能不能帮我解决一下
有一仓库有N吨货物,现有M辆车可用,但每车的载重量不定,
(N,M均为未知数),让计算机自动分配货物,能够让使用的车辆最少
而且不造成太大的浪费(如果有10吨货物,有15吨的车和9吨的车和8吨的车,则用15吨的车拉;如果有8吨的车和5吨的车和2吨的车,则用8吨和2吨的拉)
 
怎么没有人回答啊,还是看不明白啊
注意只有一种货物,
 
怎么光有人看,没有人答啊,我说了不是高手不要来吗,这个问题已经问倒了N个高手啦
,有人能答的话, 我再出300分
 
暂时只想到穷举法。
先用一辆车,按吨位从小到大试,如果能装下,完成。否则:
用二辆车,按吨位从小到大试。
依此类推。
办法虽然笨了点,但只要你的车没几百万辆,效率决不成问题。
 
小车拉也不定好啊,多个人不要吃饭吗?还是把你的问提写清楚点吧,N个是被蒙住了
 
这是整数规划的问题吧?常规的方法是:分支定界法(效率不高)
提供一个网址你可以找到一些相关的资料:
http://vip.xminfo.net.cn/tree/bottom.htm
 
to science:我想最后再考虑穷举法
to silverwolf:你给我的URL,我什么也没有找到啊
to wangnen:能大车一车装走的,就不要小车啦啊,多个司机要多发工资啊,,N是一个具体值,但这个
值要根据当时仓库的出货量而定,这不是问题的关键
 
procedure TForm6.BitBtn1Click(Sender: TObject);
const
m=10;
type
TCapacityArr=array[0..m-1] of integer;
PCapacityArr=^TCapacityArr;
var
C:TCapacityArr;
pC:PCapacityArr;
n:integer;
MinDX:integer;
Indexes:TCapacityArr;
Schemes:TList;
procedure P(X,i,IndI:integer);
var
j:integer;
begin
X:=X+C;
Indexes[IndI]:=i;
if X>=N then
begin
if X-N<=MinDX then
begin
if X-N<MinDX then
begin
MinDX:=X-N;
Schemes.Clear;
end;
New(pC);
pC^:=Indexes;
if IndI<m-1 then
pC^[IndI+1]:=-1;
Schemes.Add(pC);
end
end
else
for j:=i+1 to m-1 do
P(X,j,IndI+1);
end;

procedure ShowScheme(var Scheme:TCapacityArr);
var
i:integer;
s:string;
begin
s:=IntToStr(Scheme[0]);
for i:=1 to m-1 do
begin
if Scheme>=0 then
s:=s+','+IntToStr(Scheme)
else
Break;
end;
Memo1.Lines.Add(s);
end;

var
i:integer;
begin
for i:=0 to m-1 do
C:=Random(50)+1;
N:=2+Random(100);
ShowScheme(C);
Memo1.Lines.Add('N='+IntToStr(N));
MinDX:=MaxInt;
Schemes:=TList.Create;
try
for i:=0 to m-1 do
P(0,i,0);
for i:=Schemes.Count-1 do
wnto 0 do
begin
pC:=PCapacityArr(Schemes);
ShowScheme(pC^);
Dispose(pC);
end;
finally
Schemes.Free;
end;
end;
 
刚才跑了些内存
procedure TForm6.BitBtn1Click(Sender: TObject);
const
m=10;
type
TCapacityArr=array[0..m-1] of integer;
PCapacityArr=^TCapacityArr;
var
C:TCapacityArr;
pC:PCapacityArr;
n:integer;
MinDX:integer;
Indexes:TCapacityArr;
Schemes:TList;
procedure ClearSchemes;
var
i:integer;
begin
for i:=Schemes.Count-1 do
wnto 0 do
begin
pC:=PCapacityArr(Schemes);
Dispose(pC);
end;
Schemes.Clear;
end;

procedure P(X,i,IndI:integer);
var
j:integer;
begin
X:=X+C;
Indexes[IndI]:=i;
if X>=N then
begin
if X-N<=MinDX then
begin
if X-N<MinDX then
begin
MinDX:=X-N;
ClearSchemes;
end;
New(pC);
pC^:=Indexes;
if IndI<m-1 then
pC^[IndI+1]:=-1;
Schemes.Add(pC);
end
end
else
for j:=i+1 to m-1 do
P(X,j,IndI+1);
end;

procedure ShowScheme(var Scheme:TCapacityArr);
var
i:integer;
s:string;
begin
s:=IntToStr(Scheme[0]);
for i:=1 to m-1 do
begin
if Scheme>=0 then
s:=s+','+IntToStr(Scheme)
else
Break;
end;
Memo1.Lines.Add(s);
end;

var
i:integer;
begin
for i:=0 to m-1 do
C:=Random(50)+1;
N:=2+Random(100);
ShowScheme(C);
Memo1.Lines.Add('N='+IntToStr(N));
MinDX:=MaxInt;
Schemes:=TList.Create;
try
for i:=0 to m-1 do
P(0,i,0);
for i:=0 to Schemes.Count-1 do
ShowScheme(PCapacityArr(Schemes)^);
ClearSchemes;
finally
Schemes.Free;
end;
end;
 
我给的网址那是个搜索引擎,那里有历年来的科技论文,你在搜索框内输入
“整数规划”,就能搜索到近年来较新的算法。
http://vip.xminfo.net.cn
(上次多拷贝了后面的,sorry)
 
这个,用取余数法,
好像车的吨位有这几种,15,10,8,5,3,2.5,1.5,0.75
第一步,N/15,车数C,取余数N1
第二步,N1/10,车数C,取余数N1
...
所有C的和就是车数

 
kifo的算法只适合每种吨位的车都有一群的情况。
to lunni:每种吨位的车是有一群,还是只有一辆?
如果只有一辆,就往下看。
下面这个算法可以确定需要几辆车。
将车的吨位从大到小排列:w1,w2,w3,.........
设货物重量为w0
如果 w1>=w0,只需1 辆,结束。
如果 w1<w0,1 辆不够,继续。
如果 w1+w2>=w0, 只需 2 辆,结束。
如果 w1+w2<w0,2 辆不够,继续。
依此类推。
确定车数后选哪几辆车,就看你的要求了。
要车的吨位和最小,可以使用一些查找的算法。
要是不在乎吨位,直接取最大的。
 
我的算法有问题?什么问题?
有问题你就说呀,你不说我怎么知道?
要不,就给分呀
 
我的算法有问题?什么问题?
有问题你就说呀,你不说我怎么知道?
要不,就给分呀
 
to science:
车的载重量是不定的,也就是说相同载重量的车可以是一辆也可能是一群
 
[:)]可以采用银行家算法来解决这个问题。
 
我觉得你可以将车辆按从大到小排队,
先让最大的装! 装 N 车!
如果还有剩余的话
在其余的小点的车装
如果都不能一次装完的话
先用剩下的车最大的装
如果可以一次装完,则选择吨位最接近的装!
 
to 凡1979, 你的算法最合我心意。
我目前就是用这个解决的,还有一点漏洞就完成了
 
to lunni,
凡1979的算法和我的一样啊,如何他的算法就最合了你心意呢。
况且你这么个问题也不能算是算法问题啊。扳扳手指就想出来了。
 
我的贪得无厌算法居然没人欣赏,不识货
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部