示例#1
0
        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);
        }
示例#2
0
        //出票
        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);
        }
示例#3
0
        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);
        }
示例#4
0
 //出票
 internal Ticket PrintTicket(MetaResouceState r, IProduct p)
 {
     return(new Ticket()
     {
         MetaResList = getMetaRes(r, p)
     });
 }
示例#5
0
 public void Update(MetaResouceState r)
 {
     //完成所有更新
     foreach (Bucket b in NeedToRefresh)
     {
         b.RefreshOpenProduct(r);
     }
     NeedToRefresh.Clear();
 }
示例#6
0
        //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);
        }
示例#7
0
        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);
        }
示例#8
0
        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();
        }
示例#9
0
        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);
        }
示例#10
0
文件: OpenAll.cs 项目: Grieverwzn/NRM
        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);
        }
示例#11
0
 //刷新开放产品
 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);
         }
     }
 }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        //查找最零散的可售产品
        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);
        }
示例#16
0
        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);
            }
        }
示例#17
0
 public List <IProduct> OpenProductList(int time, MetaResouceState r, IConOL cl)
 {
     return((cl as CnNestingOL).OpenProductList(r));
 }
示例#18
0
        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);
        }