首页 日志

关于一个汽车调度的排车问题

来园子很多年了,一直都是看别人写文章,也在园子里学到不少的东西。废话就不多说了,直接上内容。

公司最近在做一个车辆租赁的项目,其中有个预排的功能,要求如下:

 

为了描述方便,我把时间用数字来表示

假如A型号的车在时间段10开始20结束,有甲客户订了,在另一时间段30-40有乙客户订了,因为时间不相交,所以只需要1辆就可以满足这两个客户的要求。如果又来一个丙客户在时间段10-40,订同样型号的车,因为时间段跟前面那辆车的时间相交,所以需要另一台A型号的车才能满足要求。现在问题是希望从数据库中读取所有的A型号车下单的客户开始和结束时间,通过程序判断至少需要几辆车才能满足客户的要求?

 

我的思路是

1、首先按订车的开始时间从小到大放入集合中进行排序。

2、将第1个项从集合中删除,需要的车辆数加1(默认初始化为0)

3、第1项的结束时间跟剩下的集合开始时间依次从小到大进行比较,如果碰到比第1项结束时间要大的,删除该项,将该项结束时间跟剩下的

集合开始时间比较,依次类推,直到集合结尾。

4、将需要的车辆数加1,重新从集合第一个元素依照上面的步骤,依次循环,直到集合中没有任何元素为止。

下面给出Linq的实现代码

 
class TestDate
{
public int Index { get; set; } //唯一标识
public int Start { get; set; } //开始时间
public int End { get; set; } //结束时间
}
class Program
{
static void Main(string[] args)
{
int Count = 0;
List<TestDate> TestList = new List<TestDate>();
TestList.Add(new TestDate { Index = 0, Start = 10, End = 20 });
TestList.Add(new TestDate { Index = 1, Start = 30, End = 40 });
TestList.Add(new TestDate { Index = 2, Start = 50, End = 60 });
TestList.Add(new TestDate { Index = 3, Start = 30, End = 80 });
var Temp1=TestList.OrderBy(s => s.Start);
TestDate t;
while (TestList.Count > 0)
{
Count++;
t = Temp1.FirstOrDefault();
TestList.Remove(t);
while (t != null)
{
t = TestList.FirstOrDefault(s => t.End < s.Start);
TestList.Remove(t);
}
}
Console.Write("需要车辆总数为:"+Count);
Console.Read();
}
}



这是后来重新用DataTable实现的

 

 
class Program
{
static void Main(string[] args)
{
int Count = 0;//定义需要车辆总数
//填充表
DataTable dt = new DataTable("Table_AX");
dt.Columns.Add("start", System.Type.GetType("System.Int32"));
dt.Columns.Add("end", System.Type.GetType("System.Int32"));
DataRow dr = dt.NewRow();
dr["start"] = 10; dr["end"] = 20; dt.Rows.Add(dr.ItemArray);
dr["start"] = 30; dr["end"] = 40; dt.Rows.Add(dr.ItemArray);
dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray);
dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray);
dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray);
dr["start"] = 10; dr["end"] = 40; dt.Rows.Add(dr.ItemArray);
//按开始时间升序排
dt.DefaultView.Sort = "start asc";
dt.DefaultView.ToString();
while(dt.Rows.Count>0)
{
Count++;
int endTemp = Convert.ToInt32(dt.Rows[0]["end"]);
dt.Rows.RemoveAt(0);
int m = dt.Rows.Count;
int k = 0;
while(m>k)
{
if (Convert.ToInt32(dt.Rows[k][0]) > endTemp)
{
endTemp = Convert.ToInt32(dt.Rows[k][1]);
dt.Rows.RemoveAt(k);
m--;
}
else
k++;
}
}
Console.Write(Count);
Console.Read();
}

posted on 2011-12-01 23:23  zly2000a  阅读(1606)  评论(2编辑  收藏  举报

导航