public EczaneNobetSonucModel Solve(EczaneNobetTekGrupDataModel data) { var model = Model(data); // Get a solver instance, change your solver var solver = new CplexSolver(); try { // solve the model var solution = solver.Solve(model); //var cplexConfiguration = solver.Configuration; var modelStatus = solution.ModelStatus; var solutionStatus = solution.Status; var modelName = solution.ModelName; var bestBound = solution.BestBound; //var confilicts = new ConflictingSet(); //confilicts = solution.ConflictingSet; //ConstraintsUB = new IEnumerable<Constraint>(); //ConstraintsUB = confilicts.ConstraintsUB; if (modelStatus != ModelStatus.Feasible) { throw new Exception("Uygun çözüm bulunamadı!"); } else { // import the results back into the model model.VariableCollections.ForEach(vc => vc.SetVariableValues(solution.VariableValues)); var objective = solution.ObjectiveValues.Single(); var sure = solution.OverallWallTime; Results = new EczaneNobetSonucModel { CozumSuresi = sure, ObjectiveValue = objective.Value, ResultModel = new List <EczaneNobetCozum>() }; foreach (var r in data.EczaneNobetTarihAralik.Where(s => _x[s].Value == 1)) { Results.ResultModel.Add(new EczaneNobetCozum() { TakvimId = r.TakvimId, EczaneNobetGrupId = r.EczaneNobetGrupId, NobetGorevTipId = r.NobetGorevTipId }); } } } catch (Exception ex) { var mesaj = ex.Message; throw new Exception(mesaj); } return(Results); }
public EczaneNobetSonucModel ModelCoz(EczaneNobetModelCoz eczaneNobetModelCoz) { //var nobetGruplarTumu = _nobetGrupService.GetListByNobetUstGrupId(eczaneNobetModelCoz.NobetUstGrupId); var nobetGruplar = eczaneNobetModelCoz.NobetGrupId.ToList(); var nobetGruplarSirali = new List <NobetGruplarCozumSirali>(); var sonuclar = new EczaneNobetSonucModel(); var indis = 1; foreach (var nobetGrupId in nobetGruplar) { nobetGruplarSirali.Add(new NobetGruplarCozumSirali { NobetGrupId = nobetGrupId, SiraId = indis }); indis++; } if (nobetGruplar.Count > 0) { #region başka gruplarla ilişkisi olan gruplar var eczaneGruplar = _eczaneGrupService.GetDetaylarAktifGruplar(eczaneNobetModelCoz.NobetUstGrupId) .Where(d => nobetGruplar.Contains(d.NobetGrupId)).ToList(); //Birbiri ile ilişkili grupların gruplanması var nobetGruplarBagDurumu = _eczaneGrupService.EsGrupluEczanelerinGruplariniBelirleTumu(eczaneGruplar, nobetGruplar); var tumNobetGruplar = from g in nobetGruplarSirali let e = nobetGruplarBagDurumu.SingleOrDefault(x => x.NobetGrupId == g.NobetGrupId) ?? new NobetBagGrup() orderby e.Id, g.SiraId select new NobetGrupBagGrup { BagId = e.Id, NobetGrupId = g.NobetGrupId }; #endregion var nobetGrupBaglar = tumNobetGruplar.Select(s => s.BagId).Distinct().ToList(); #region Karar kuralları var model = new EczaneNobetDataModelParametre { AyBitis = eczaneNobetModelCoz.AyBitis, NobetGorevTipId = eczaneNobetModelCoz.NobetGorevTipId, NobetGrupGorevTipler = eczaneNobetModelCoz.NobetGrupGorevTipler, NobetGrupId = eczaneNobetModelCoz.NobetGrupId, NobetUstGrupId = eczaneNobetModelCoz.NobetUstGrupId, NobetUstGrupBaslangicTarihi = eczaneNobetModelCoz.NobetUstGrupBaslangicTarihi, BuAyVeSonrasi = eczaneNobetModelCoz.BuAyVeSonrasi, BaslangicTarihi = eczaneNobetModelCoz.BaslangicTarihi, BitisTarihi = eczaneNobetModelCoz.BitisTarihi, TimeLimit = eczaneNobetModelCoz.TimeLimit, CalismaSayisi = eczaneNobetModelCoz.CalismaSayisi }; var aylar = _takvimService.GetAylar() .Where(w => w.Id >= model.AyBitis) .OrderBy(o => o.Id).ToList(); var ayIndis = 0; if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 0 && eczaneNobetModelCoz.SonrakiAylarRasgele) {//seçilen ay ve sonrası, gruplar öncelikli - sonraki aylarda gruplar rasgele sıralı foreach (var ay in aylar) { if (eczaneNobetModelCoz.AyBitis == ay.Id) {//ilk ay arayüzdeki sıra foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); //return EczaneNobetCozSonuclaraEkle(data); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } else { foreach (var item in nobetGrupBaglar) { var r = new Random(); var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .OrderBy(x => r.NextDouble()); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } } return(sonuclar); } else if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 0) {//seçilen ay ve sonrası, gruplar öncelikli foreach (var ay in aylar) { ayIndis++; if (tumNobetGruplar.Count() == 1) { model.AyBitis = ay.Id; var data = EczaneNobetDataModel(model); return(EczaneNobetCozSonuclaraEkle(data)); } else { foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId); foreach (var nobetGrupId in nobetGrupIdListe) { var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } } } return(sonuclar); } else if (eczaneNobetModelCoz.BuAyVeSonrasi && eczaneNobetModelCoz.CozumTercih == 1) {//seçilen ay ve sonrası, gruplar önceliksiz foreach (var ay in aylar) { ayIndis++; foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); var tarihBas = model.BaslangicTarihi; var tarihBit = model.BitisTarihi; var aydakiGunSayisi = DateTime.DaysInMonth(tarihBit.Year, ay.Id); var baslangicGunu = 1; if (ayIndis == 1) { baslangicGunu = tarihBas.Day; } model.BaslangicTarihi = new DateTime(tarihBas.Year, ay.Id, baslangicGunu); model.BitisTarihi = new DateTime(tarihBit.Year, ay.Id, aydakiGunSayisi); model.NobetGrupId = nobetGrupIdListe; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } return(sonuclar); } else if (eczaneNobetModelCoz.CozumTercih == 0) {//ay, gruplar öncelikli if (tumNobetGruplar.Count() == 1) { var data = EczaneNobetDataModel(model); return(EczaneNobetCozAktifiGuncelle(data)); } else { foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); foreach (var nobetGrupId in nobetGrupIdListe) { model.NobetGrupId = new int[] { nobetGrupId }; var data = EczaneNobetDataModel(model); var sonuc = EczaneNobetCozSonuclaraEkle(data); sonuclar.ObjectiveValue += sonuc.ObjectiveValue; sonuclar.KararDegikeniSayisi += sonuc.KararDegikeniSayisi; sonuclar.KisitSayisi += sonuc.KisitSayisi; sonuclar.CozumSuresi += sonuc.CozumSuresi; sonuclar.CalismaSayisi += sonuc.CalismaSayisi; sonuclar.IterasyonSayisi += sonuc.IterasyonSayisi; } } return(sonuclar); } } else if (eczaneNobetModelCoz.CozumTercih == 1) {//ay, gruplar önceliksiz foreach (var item in nobetGrupBaglar) { var nobetGrupIdListe = tumNobetGruplar .Where(x => x.BagId == item) .Select(s => s.NobetGrupId) .ToArray(); model.NobetGrupId = nobetGrupIdListe; var data = EczaneNobetDataModel(model); //return EczaneNobetCozAktifiGuncelle(data); sonuclar = EczaneNobetCozAktifiGuncelle(data); } return(sonuclar); } else {//diğer throw new Exception("Nöbet yazdırma kriter seçimi hatalıdır. Lütfen kontrol ediniz."); } #endregion } return(sonuclar); }
public ActionResult ModelCoz(NobetYazViewModel eczaneNobetViewModel) { var stopwatch = new Stopwatch(); stopwatch.Start(); if (eczaneNobetViewModel.TimeLimit > 1200) { throw new Exception($"Süre limiti en fazla {1200} saniye olabilir. Fazlası için lütfen Nöbetyaz yönetim ile irtiata geçiniz."); } var nobetUstGrup = _nobetUstGrupService.GetDetay(eczaneNobetViewModel.NobetUstGrupId); //if (ModelState.IsValid) //{ var nobetGrupGorevTipler = _nobetGrupGorevTipService.GetDetaylarByIdList(eczaneNobetViewModel.NobetGrupGorevTipId.ToList()); var nobetGrupIdList = nobetGrupGorevTipler.Select(s => s.NobetGrupId).Distinct().ToArray(); if (nobetGrupIdList == null) { nobetGrupIdList = new int[1] { 0 } } ; var eczaneNobetModelCoz = new EczaneNobetModelCoz { BuAyVeSonrasi = eczaneNobetViewModel.BuAyVeSonrasi, NobetGrupGorevTipler = nobetGrupGorevTipler, NobetGrupId = nobetGrupIdList, //eczaneNobetViewModel.NobetGrupId, NobetUstGrupId = eczaneNobetViewModel.NobetUstGrupId, RolId = eczaneNobetViewModel.RolId, AyBitis = eczaneNobetViewModel.BitisTarihi.Month, NobetUstGrupBaslangicTarihi = nobetUstGrup.BaslangicTarihi, CozumTercih = eczaneNobetViewModel.CozumTercih, SonrakiAylarRasgele = eczaneNobetViewModel.SonrakiAylarRasgele, BaslangicTarihi = eczaneNobetViewModel.BaslangicTarihi, BitisTarihi = eczaneNobetViewModel.BitisTarihi, TimeLimit = eczaneNobetViewModel.TimeLimit, CalismaSayisi = eczaneNobetViewModel.CalismaSayisi }; var sonucModel = new EczaneNobetSonucModel(); switch (nobetUstGrup.Id) { case 1: sonucModel = _alanyaOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 2: sonucModel = _antalyaMerkezOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 3: sonucModel = _mersinMerkezOptimizationServiceV2.ModelCoz(eczaneNobetModelCoz); break; case 4: sonucModel = _giresunOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 5: sonucModel = _osmaniyeOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 6: sonucModel = _bartinOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 7: sonucModel = _zonguldakOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 8: sonucModel = _iskenderunOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 9: sonucModel = _corumOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 10: sonucModel = _kirikhanOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 11: sonucModel = _diyarbakirOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 12: sonucModel = _manavgatOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 13: sonucModel = _orduMerkezOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 14: sonucModel = _kayseriOptimizationService.ModelCoz(eczaneNobetModelCoz); break; case 15: sonucModel = _antakyaOptimizationService.ModelCoz(eczaneNobetModelCoz); break; default: return(RedirectToAction("Index")); } stopwatch.Stop(); sonucModel.ToplamSure = stopwatch.Elapsed; TempData["EczaneNobetSonuclar"] = sonucModel; if (eczaneNobetModelCoz.BuAyVeSonrasi) { return(RedirectToAction("PivotSonuclar", "EczaneNobetSonuc")); //RedirectToAction("PivotCozum", "EczaneNobetSonuc", //new { area = "EczaneNobet", nobetGrup = eczaneNobetModelCoz.NobetGrupId, yilBaslangic = eczaneNobetModelCoz.BaslangicTarihi.Year, yilBitis = eczaneNobetModelCoz.BitisTarihi.Year }); } else if (eczaneNobetModelCoz.CozumTercih == 0 && eczaneNobetModelCoz.NobetGrupId.Count() > 1) { return(RedirectToAction("PivotSonuclar", "EczaneNobetSonuc")); //return RedirectToAction("PivotCozum", "EczaneNobetSonuc", // new { area = "EczaneNobet", nobetGrup = eczaneNobetModelCoz.NobetGrupId, yilBaslangic = eczaneNobetModelCoz.BaslangicTarihi.Year, yilBitis = eczaneNobetModelCoz.BitisTarihi.Year }); } else if (nobetUstGrup.Id == 6 || nobetUstGrup.Id == 7 || nobetUstGrup.Id == 8) { return(RedirectToAction("PivotSonuclar", "EczaneNobetSonuc")); //return RedirectToAction("PivotCozum", "EczaneNobetSonuc", // new { area = "EczaneNobet", nobetGrup = eczaneNobetModelCoz.NobetGrupId, yilBaslangic = eczaneNobetModelCoz.BaslangicTarihi.Year, yilBitis = eczaneNobetModelCoz.BitisTarihi.Year }); } var routeValues = new PivotSonuclarParams { Area = "EczaneNobet", BaslangicTarihi = eczaneNobetModelCoz.BaslangicTarihi, BitisTarihi = eczaneNobetModelCoz.BitisTarihi }; int sayac = 0; foreach (var item in nobetGrupIdList) { if (sayac == 0) { routeValues.NobetGrupIdList = item.ToString(); } else { routeValues.NobetGrupIdList = routeValues.NobetGrupIdList + "," + item.ToString(); } sayac++; } return(RedirectToAction("PivotSonuclar", "EczaneNobetSonucAktif", routeValues)); //} //var user = _userService.GetByUserName(User.Identity.Name); //var rolIdler = _userService.GetUserRoles(user).OrderBy(s => s.RoleId).Select(u => u.RoleId).ToArray(); //var rolId = rolIdler.FirstOrDefault(); //var nobetUstGruplar = _nobetUstGrupService.GetListByUser(user); //var nobetUstGrup = nobetUstGruplar.FirstOrDefault(); //ViewBag.NobetUstGrupId = new SelectList(items: nobetUstGruplar, dataValueField: "Id", dataTextField: "Adi", selectedValue: nobetUstGrup.Id); //ViewBag.NobetUstGrupSayisi = nobetUstGruplar.Count; //return View("Index", eczaneNobetViewModel); }