public List <Ticket> PrintTickets(MetaResouceState rs, List <IProduct> pro, IConOL cl) { List <Ticket> res = new List <Ticket>(); foreach (IProduct p in pro)//一张一张卖 { int n = p.Min(i => i.MetaResList.Count); for (int i = 0; i < n; i++) { if (p.All(j => !rs.MetaResDic[j.MetaResList[i]])) { Ticket t = new Ticket() { Product = p }; foreach (IResource r in p) { t.MetaResList.Add(r.MetaResList[i]); } res.Add(t); break; } } } return(res); }
//出票 internal Ticket PrintTicket(MetaResouceState r, IProduct p, out List <Bucket> Rf) { Rf = new List <Bucket>(); Ticket res = new Ticket(); if (LBucket.ProList.Contains(p)) { res = LBucket.PrintTicket(r, p); if (res.MetaResList.Count > 0) { Rf.Add(LBucket); return(res); } } Bucket b = Buckets.FirstOrDefault(i => i.OpenProduct.Contains(p));//先卖的放到上面 if (b != null) { res = b.PrintTicket(r, p); Seat s = (res.MetaResList[0] as MetaResource).Seat; b.Seats.Remove(s); LBucket.Seats.Add(s); Rf.Add(b);//.RefreshOpenProduct(); Rf.Add(LBucket); } else { res = null; } return(res); }
private HashSet <IProduct> CG(int t, MetaResouceState r) { #region 贪婪算法求解组合优化问题 List <IProduct> list = new List <IProduct>(DataAdapter.ProSpace); //优先关闭机会成本低的产品 List <IProduct> tempDecision = new List <IProduct>(); //开放产品集合 //加入第一个元素 IProduct tempProduct = null; double temp = computeValue(t, tempDecision, tempProduct); foreach (IProduct p in list) { if (temp < computeValue(t, tempDecision, p)) { temp = computeValue(t, tempDecision, p); tempProduct = p; } } //tempProduct = list.Where(p =>computeValue(t, tempDecision, p) > temp).OrderBy(p => computeValue(t, tempDecision, p)).FirstOrDefault(); if (tempProduct != null) { tempDecision.Add(tempProduct); list.Remove(tempProduct); } for (; list.Count > 0;) { temp = computeValue(t, tempDecision, null); double temp2 = temp; IProduct tempPro = null; foreach (IProduct p in list) { double temp1 = computeValue(t, tempDecision, p); if (temp2 < temp1) { temp2 = temp1; tempPro = p; } } //tempPro = list.OrderBy(p => computeValue(t, tempDecision, p)).FirstOrDefault(); //temp2 = computeValue(t, tempDecision, tempPro); if (temp2 > temp) { tempDecision.Add(tempPro); list.Remove(tempPro); } else { break; } } #endregion //从u生成decision HashSet <IProduct> tempset = new HashSet <IProduct>(tempDecision); return(tempset); }
//出票 internal Ticket PrintTicket(MetaResouceState r, IProduct p) { return(new Ticket() { MetaResList = getMetaRes(r, p) }); }
public void Update(MetaResouceState r) { //完成所有更新 foreach (Bucket b in NeedToRefresh) { b.RefreshOpenProduct(r); } NeedToRefresh.Clear(); }
//public void GenDS() //{ // _ds.Clear(); // _ds.Add(new Decision()); // IMDPDecisionSpace tempSet = new DecisionSpace(); // for (int i = 0; i < ProSpace.Count; i++) // { // tempSet.Clear(); // foreach (Decision dic in _ds) // { // Decision temp = new Decision(dic); // temp.OpenProductSet.Add(ProSpace[i]); // tempSet.Add(temp); // } // _ds.UnionWith(tempSet); // } //} //public void GenSS() //{ // _ss.Clear(); // IMDPState temp = GenZeroState(); // _ss.Add(temp); // foreach (Resource ts in ResSpace) // { // GenSSOneDemension(ts); // } //} //public void GenSS1()//依赖于InitialState //{ // _ss.Clear(); // State state = new State(); // foreach (Resource ts in (InitialState as State).Keys) // { // state.Add(ts, (InitialState as State)[ts]); // //GenFirstSS(ts, (InitialState as State)[ts]); // } // //_ss.Add(GenZeroState()); // _ss.Add(state); //} //public void GenSS2(ResouceState RecDic) //{ // _ss.Clear(); // State state = new State(); // foreach (Resource ts in RecDic.Keys) // { // state.Add(ts, RecDic[ts]); // //GenFirstSS(ts, RecDic[ts]); // } // //_ss.Add(GenZeroState()); // _ss.Add(state); //} public IMDPState GenInitialState(MetaResouceState s) { State state = new State(); foreach (Resource ts in ResSpace) { state.Add(ts, s.GetRemainNum(ts));//修改正确 } return(state); }
internal List <IProduct> OpenProductList(MetaResouceState r) { List <IProduct> prolist = new List <IProduct>(); foreach (BucketGroup tg in TrainGroupList) { prolist = prolist.Union(tg.OpenProduct(r)).ToList(); } return(prolist); }
private void GenRes() { DataTable Res = _ds.Tables["Res"]; MRS = new MetaResourceSet() { ResSet = new ResourceSet(), SeatSet = new SeatSet() }; InitState = new MetaResouceState(); string temp = ""; List <Seat> tempSeat = null; foreach (DataRow dr in Res.Rows) { Resource r = new Resource() { ResID = Convert.ToInt32(dr["ID"]), Description = dr["Des"].ToString(), Tag = dr["Tag"].ToString() }; ResSet.Add(r); InitState.ResDic.Add(r, 0); int num = Convert.ToInt32(dr["Cap"]); if (temp != r.Tag) { tempSeat = new List <Seat>(); for (int i = MRS.SeatSet.Count; i < MRS.SeatSet.Count + num; i++) { tempSeat.Add(new Seat() { SeatID = i, Tag = r.Tag, IDinTrain = i - MRS.SeatSet.Count }); } MRS.SeatSet.AddRange(tempSeat); } for (int i = 0; i < num; i++) { MetaResource mr = new MetaResource() { Name = r.ResID + "_" + i, ResID = r.ResID, SeatID = i, Resource = r, Seat = tempSeat[i] }; InitState.MetaResDic.Add(mr, false); MRS.Add(mr); r.MetaResList.Add(mr); tempSeat[i].MetaResList.Add(mr); } temp = r.Tag; } InitState.UpdateResDic(); }
internal List <IProduct> ProList = new List <IProduct>(); //所有能出售的产品 //当前开放的产品 internal List <IProduct> OpenProduct(MetaResouceState r) { List <IProduct> prolist = new List <IProduct>(); prolist = prolist.Union(LBucket.OpenProduct).ToList(); foreach (Bucket b in Buckets) { prolist = prolist.Union(b.OpenProduct).ToList(); } return(prolist); }
public List <IProduct> OpenProductList(int time, MetaResouceState r, IConOL cl) { List <IProduct> OpenProductList = new List <IProduct>(); foreach (IProduct p in DataAdapter.ProSpace) { if (r.CanSupportProduct(p)) { OpenProductList.Add(p); } } return(OpenProductList); }
//刷新开放产品 internal void RefreshOpenProduct(MetaResouceState r) { OpenProduct.Clear(); //遍历所有能出售的产品 foreach (IProduct pro in ProList) { //判断产品是否可售 List <IMetaResource> imr = getMetaRes(r, pro); if (imr.Count > 0) { OpenProduct.Add(pro); } } }
public List <Product> OPL(int time, MetaResouceState r) { List <Product> res = new List <Product>(); foreach (Product p in m_DataAdapter.ProSpace) { //Console.WriteLine("产品{0}\t价格{1}\t投标价格{2}", p.Description, p.Fare, p.Sum(i => Solver.DualValue1[time][m_DataAdapter.RS.IndexOf(i as Resource)])); if (r.CanSupportProduct(p) && p.Fare >= Math.Floor((p as List <Resource>).Sum(i => BidPrice[time2index(time)][1 + m_DataAdapter.RS.IndexOf(i as Resource)]))) { res.Add(p); } } return(res); }
public bool Process(PrimalArrivalList arr, out SellingRecordList Srlist, out ControlRecordList Crlist) { //初始化记录 Srlist = new SellingRecordList() { PAL = arr }; Crlist = new ControlRecordList() { PAL = arr }; //初始化资源 MetaResouceState rs = new MetaResouceState(InitState); //生成动态策略 IConOL conol = Controller.GenConOL(); if (conol != null) { conol.Update(rs); } List <IProduct> openProductList = Controller.OpenProductList(0, rs, conol);//初始开放产品 Crlist.UpdateOpenProducts(0, openProductList); for (int i = 0; i < arr.Count; i++)//顺序读取到达列表 { //生成开放产品集 openProductList = Controller.OpenProductList(arr[i].ArriveTime, rs, conol); //模拟旅客购票 List <IProduct> pro = (MarketInfo[arr[i].IndexOfMS] as IChoiceAgent).Select(openProductList, arr[i].ChoosingParam); if (pro == null) { continue; } //出票 List <Ticket> tickets = Controller.PrintTickets(rs, pro, conol); //更新资源状态 rs.UpdateAfterSelling(tickets); if (conol != null) { conol.Update(rs); } //记录产品情况 Crlist.UpdateOpenProducts(arr[i].ArriveTime, openProductList); //加入SellingRecordList Srlist.AddRecord(arr[i].ArriveTime, arr[i], pro, tickets); } return(true); }
public List <Ticket> PrintTickets(MetaResouceState rs, List <IProduct> pro, IConOL cl) { //(cl as CnNestingOL).NeedToRefresh.Clear(); List <Ticket> res = new List <Ticket>(); foreach (IProduct p in pro) { //从一个包含产品的列车中打印车票 BucketGroup tg = (cl as CnNestingOL).TrainGroupList.FirstOrDefault(i => i.ProList.Contains(p)); List <Bucket> temp = null; res.Add(tg.PrintTicket(rs, p, out temp)); (cl as CnNestingOL).NeedToRefresh.AddRange(temp); } return(res); }
//查找最零散的可售产品 private List <IMetaResource> getMetaRes(MetaResouceState r, IProduct p) { List <IMetaResource> res = new List <IMetaResource>(); //找到出售一个产品的资源,如果不可售返回空 foreach (Seat s in Seats) { if (p.All(i => s.getMetaByRes(i) != null && r.MetaResDic[s.getMetaByRes(i)] == false))//有待优化 { foreach (IResource re in p) { res.Add(s.getMetaByRes(re)); } break; } } return(res); }
public IALPState CreateOrFind(MetaResouceState RecDic) { State state = new State(); foreach (Resource ts in this.ResSpace) { state.Add(ts, RecDic.GetRemainNum(ts));//这里没有管安全性 } IMDPState res = _ss.FirstOrDefault(i => i.Equals(state)); if (res == null) { _ss.Add(state); return(state); } else { return(res as IALPState); } }
public List <IProduct> OpenProductList(int time, MetaResouceState r, IConOL cl) { return((cl as CnNestingOL).OpenProductList(r)); }
public double loadFactor() { double a = 0; double b = 0; double c = 0; MetaResouceState rs = new MetaResouceState(DataAdapter.InitState); //List<Product> openProductList; //= DataAdapter.ProSpace; HashSet <IProduct> _ss = new HashSet <IProduct>(); Decision d; //int alpha = DataAdapter.TimeHorizon - BidPrice.Length; for (int interval = 0; interval < DataAdapter.MarketInfo.AggRo.Count; interval++) { //if (DataAdapter.MarketInfo.AggRo[interval].Time <= alpha) //{ int time = DataAdapter.MarketInfo.AggRo[interval].Time; //if (DataAdapter.MarketInfo.AggRo[interval + 1].Time <= alpha) //{ int len = 0; if (interval < DataAdapter.MarketInfo.AggRo.Count - 1) { len = DataAdapter.MarketInfo.AggRo[interval + 1].Time - DataAdapter.MarketInfo.AggRo[interval].Time; } else { len = DataAdapter.TimeHorizon - DataAdapter.MarketInfo.AggRo[interval].Time; } //} //else //{ // len = alpha - DataAdapter.MarketInfo.AggRo[interval].Time; //} //openProductList = CG(time, rs);//this.OPL(time, rs);new HashSet<Product>(openProductList); _ss = CG(time, rs); d = new Decision(_ss); c = (DataAdapter.ResSpace as IALPResourceSpace).Sum(i => DataAdapter.Qti(time, i, d)); a += c * len; //Console.WriteLine("Interval={0},a={1}", interval, a); //} //else //{ // break; //} } //for (int t = alpha + 1; t < DataAdapter.TimeHorizon; t++) //{ // //openProductList = this.OPL(t, rs); // if (findAggRo(t, alpha) == findAggRo(t - 1, alpha)) // { // //TODO: 比较openProduct // //HashSet<Product> temp =new HashSet<Product>(openProductList); // //int count = _ss.Except(temp).ToList().Count;//比较集合相等性 // //int count2 = temp.Except(_ss).ToList().Count;//比较集合相等性 // //if (count == 0 && count2==0) // //{ // _ss = new HashSet<Product>(openProductList); // a += c; // // continue; // //} // } // //openProductList = this.OPL(t, rs); // _ss = new HashSet<Product>(openProductList); // d = new Decision(_ss); // c = DataAdapter.ResSpace.AsParallel().Sum(i => DataAdapter.Qti(t, i, d)); // a+=c; //Console.WriteLine("t={0},a={1}" , t , a); //TODO将b修改正确 b = 1; //b= DataAdapter.ResSpace.Sum(i => i.Capacity); return(a / b); }