void EtrendFeltetelKiolvas() { try { var e = ABKezelo.Kiolvasas().Where(x => x is EtrendFeltetel).ToList(); if (e.Count != 0) { EtrendFeltetel et = e.First() as EtrendFeltetel; dateTimePicker1.Value = et.Datum1; comboBox1.SelectedIndex = (int)et.Etkezes1; dateTimePicker2.Value = et.Datum2; comboBox2.SelectedIndex = (int)et.Etkezes2; comboBox3.SelectedItem = et.Penz.Megnevezes; numericUpDown1.DecimalPlaces = et.Penz.TizedesekSzama; numericUpDown1.Value = (decimal)et.Maxpenz; checkBox1.Checked = et.Koltsegmin; checkBox2.Checked = et.Orommax; checkBox3.Checked = et.Solverelrejt; checkBox4.Checked = et.Folytonosmodell; checkBox5.Checked = et.NaptarbaMent; numericUpDown2.Value = et.Numvaltozatossag; numericUpDown3.Value = et.Maxfutasiido; } } catch (Exception exception) { MessageBox.Show(exception.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
void EtrendFeltetelMentes() { try { string fnevhash = ABKezelo.GetCurrentUser(); Penznem p = (Penznem)ABKezelo.Kiolvasas().Where(x => (x is Penznem) && (x as Penznem).Megnevezes == comboBox3.SelectedItem.ToString()).First(); EtrendFeltetel e = new EtrendFeltetel(fnevhash, dateTimePicker1.Value, (EtkezesTipus)comboBox1.SelectedIndex, dateTimePicker2.Value, (EtkezesTipus)comboBox2.SelectedIndex, checkBox1.Checked, checkBox2.Checked, (double)numericUpDown1.Value, p, checkBox3.Checked, checkBox4.Checked, (int)numericUpDown2.Value, (int)numericUpDown3.Value, checkBox5.Checked); if (ABKezelo.Kiolvasas().Where(x => x is EtrendFeltetel).ToList().Count == 0) { ABKezelo.Beszuras(e); } else { ABKezelo.Modositas(e); } } catch (Exception exception) { MessageBox.Show(exception.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void Button4_Click(object sender, EventArgs e) { try { if (listBox1.SelectedIndex != -1) { Penznem p = (Penznem)listBox1.SelectedItem; bool torolheto = true; foreach (Elelmiszer item in ABKezelo.Kiolvasas().Where(x => x is Elelmiszer)) { if (item.Penz.Megnevezes == p.Megnevezes) { torolheto = false; break; } } if (!torolheto) { throw new WarningException("This currency is not deletable, because there is a food using it!"); } EtrendFeltetel et = (EtrendFeltetel)ABKezelo.Kiolvasas().Where(x => x is EtrendFeltetel).ToList().First(); if (et.Penz.Megnevezes == p.Megnevezes) { throw new WarningException("This currency is not deletable, bceause Form1 is using it!"); } if (((Penznem)listBox1.SelectedItem).Torolheto) { if (MessageBox.Show("Really want to delete the currency?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string nev = ((Penznem)listBox1.SelectedItem).Megnevezes; ABKezelo.Torol((Penznem)listBox1.SelectedItem); Logolas.Ment("Currency deleted, name: " + nev); ListBoxRefresh(); } } else { throw new WarningException("This currency is not deletable!"); } } else { throw new WarningException("To delete a currency choose one!"); } } catch (Exception ex) { if (ex is WarningException) { MessageBox.Show(ex.Message, "Attention!", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
public static void XMLRead(string filename, bool check = false, string hash = null, bool msg = true) { try { if (File.Exists(filename)) { List <ABHiba> hibak = new List <ABHiba>(); XDocument xml = XDocument.Load(filename); List <Penznem> penznemek = (from p in xml.Root.Elements("Penznem") select new Penznem(p)).ToList(); List <EtrendAdat> e = new List <EtrendAdat>(); foreach (Penznem item in penznemek) { if (check && item.FelhasznaloNevHash != hash) { throw new ArgumentException("Other user saved this, you have no right to use it!"); } e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <Mertekegyseg> mertekegysegek = (from m in xml.Root.Elements("Mertekegyseg") select new Mertekegyseg(m)).ToList(); foreach (Mertekegyseg item in mertekegysegek) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <Tapanyag> tapanyagok = (from t in xml.Root.Elements("Tapanyag") select new Tapanyag(t, mertekegysegek)).ToList(); foreach (Tapanyag item in tapanyagok) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <Etel> etelek = (from etel in xml.Root.Elements("Etel") select new Etel(etel, penznemek, mertekegysegek)).ToList(); foreach (Etel item in etelek) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <Ital> italok = (from ital in xml.Root.Elements("Ital") select new Ital(ital, penznemek, mertekegysegek)).ToList(); foreach (Ital item in italok) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <Menu> menuk = (from menu in xml.Root.Elements("Menu") select new Menu(menu, penznemek, mertekegysegek)).ToList(); foreach (Menu item in menuk) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); e = new List <EtrendAdat>(); List <ElelmiszerTapanyag> elelmiszertapanyag = (from et in xml.Root.Elements("ElelmiszerTapanyag") select new ElelmiszerTapanyag(et, tapanyagok)).ToList(); List <Elelmiszer> elelmiszerek = new List <Elelmiszer>(); foreach (Etel item in etelek) { elelmiszerek.Add(item); } foreach (Ital item in italok) { elelmiszerek.Add(item); } foreach (Tapanyag t in tapanyagok) { ABKezelo.BeszurTapanyagElelmiszerekbe((Tapanyag)Csere(t, hash), elelmiszerek); } foreach (Elelmiszer item in ABKezelo.Kiolvasas().Where(x => x is Elelmiszer).ToList()) { foreach (ElelmiszerTapanyag item2 in elelmiszertapanyag.Where(x => x.ElelmiszerMegnevezes == item.Megnevezes).ToList()) { item.TapanyagTartalom[item2.Tapanyag] = item2.Ertek; } ABKezelo.Modositas(item); } elelmiszerek = new List <Elelmiszer>(); foreach (Etel item in etelek) { elelmiszerek.Add(item); } foreach (Ital item in italok) { elelmiszerek.Add(item); } e = new List <EtrendAdat>(); List <ElelmiszerElelmiszer> elelmiszerelelmiszer = (from et in xml.Root.Elements("ElelmiszerElelmiszer") select new ElelmiszerElelmiszer(et, elelmiszerek)).ToList(); foreach (Menu item in menuk) { ABKezelo.BeszurElelmiszerElelmiszerekbe((Elelmiszer)Csere(item, hash)); } foreach (Menu item in ABKezelo.Kiolvasas().Where(x => x is Menu).ToList()) { foreach (ElelmiszerElelmiszer item2 in elelmiszerelelmiszer.Where(x => x.ElelmiszerMegnevezes == item.Megnevezes).ToList()) { item.Osszetevo[item2.Elelmiszer] = item2.Ertek; } ABKezelo.Modositas(item); } EtrendFeltetel etrendfeltetel = (from x in xml.Root.Elements("EtrendFeltetel") select new EtrendFeltetel(x)).ToList().First(); ABKezelo.Beszuras(Csere(etrendfeltetel, hash)); e = new List <EtrendAdat>(); List <EtkezesFeltetel> etkezesfeltetel = (from x in xml.Root.Elements("EtkezesFeltetel") select new EtkezesFeltetel(x)).ToList(); foreach (EtkezesFeltetel item in etkezesfeltetel) { e.Add(item); } hibak.AddRange(ABKezelo.Csoportosbeszuras(Csere(e, hash))); var etrendidopont = (from x in xml.Root.Elements("EtrendIdopont") select new EtrendIdopont(x)).ToList(); if (etrendidopont.Count > 0) { ABKezelo.Beszuras(Csere(etrendidopont.First(), hash)); } if (hibak.Count > 0) { string szoveg = ""; foreach (ABHiba item in hibak) { szoveg += item + " " + item.Hibas + Environment.NewLine; } throw new Exception(szoveg); } if (msg) { MessageBox.Show("Successful import!", "Info!", MessageBoxButtons.OK, MessageBoxIcon.Information); Logolas.Ment("Successful XML import!"); } } else { throw new FileNotFoundException("Not existing file!"); } } catch (Exception ex) { if (msg) { Logolas.Ment("Unsuccessful XML import!"); } throw ex; } }
private void Button6_Click(object sender, EventArgs eventargs) { try { if (numericUpDown3.Value <= 0 || numericUpDown3.Value > Konstans.maxValaszthatoFutasiIdo) { throw new ArgumentException("Running time is positive and at most " + Konstans.maxValaszthatoFutasiIdo + " !"); } Logolas.Ment("Diet making/running with the Glpk program."); EtrendMegold e0 = new EtrendMegold(); List <object> ans = e0.Megoldas(); if ((bool)ans[0]) { EtrendFeltetel e = (EtrendFeltetel)ABKezelo.Kiolvasas().Where(x => x is EtrendFeltetel).First(); var l = ABKezelo.Kiolvasas().Where(x => x is EtrendElelmiszer).ToList(); DateTime e1 = e.Datum1; DateTime e2 = e.Datum2; e1 = new DateTime(e1.Year, e1.Month, e1.Day, 0, 0, 0); e2 = new DateTime(e2.Year, e2.Month, e2.Day, 0, 0, 0); DateTime d = e1; string str = ""; if (checkBox1.Checked) { str += String.Format("Minimum cost: {0} {1}", ans[1], (ans[2] as Penznem).Megnevezes) + Environment.NewLine; } else if (checkBox2.Checked) { str += String.Format("Maximum joy: {0}", ans[1]) + Environment.NewLine; } while (d <= e2) { str += String.Format("{0:yyyy.MM.dd.}", d) + Environment.NewLine; for (int i = 0; i < 3; i++) { if (d == e1 && i < (int)e.Etkezes1) { continue; } if (d == e2 && i > (int)e.Etkezes2) { continue; } var l2 = l.Where(x => (x as EtrendElelmiszer).Datum == d && (int)(x as EtrendElelmiszer).Etkezes == i).ToList(); str += " " + (EtkezesTipus)i + ":" + Environment.NewLine; foreach (EtrendElelmiszer item in l2) { Elelmiszer elelmiszer = item.Elelmiszer; if (elelmiszer is Etel) { str += String.Format(" {0:0.00} {1} {2}", item.Tomeg, item.Tomegmertekegyseg.Megnevezes, elelmiszer.Megnevezes); } else if (elelmiszer is Ital) { str += String.Format(" {0:0.00} {1} {2}", item.Urmertek, item.Urmertekegyseg.Megnevezes, elelmiszer.Megnevezes); } else { str += String.Format(" {0:0.00} {1} [{2:0.00} {3}, {4:0.00} {5}]", item.Val, elelmiszer.Megnevezes, item.Tomeg, item.Tomegmertekegyseg.Megnevezes, item.Urmertek, item.Urmertekegyseg.Megnevezes); } str += Environment.NewLine; } } d = d.AddDays(1); } textBox1.Text = str; File.AppendAllText("diets.txt", "Solution:" + Environment.NewLine + str + Environment.NewLine); if (checkBox5.Checked) { Naptar.NaptarbaRak(); // google calendar-ba mentés, ha checkbox be van jelölve } } else { MessageBox.Show("The linear program has no solution!", "Attention!", MessageBoxButtons.OK, MessageBoxIcon.Information); textBox1.Text = "No solution!"; } } catch (Exception exception) { MessageBox.Show(exception.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } Logolas.Ment("Glpk's run has finished."); }
public static void NaptarbaRak() { try { UserCredential credential; using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) { string credPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); credPath = Path.Combine(credPath, ".credentials/calendar-dotnet-quickstart.json"); credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result; } var service = new CalendarService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); Event evnt = new Event(); EtrendFeltetel e = (EtrendFeltetel)ABKezelo.Kiolvasas().Where(x => x is EtrendFeltetel).First(); var l = ABKezelo.Kiolvasas().Where(x => x is EtrendElelmiszer).ToList(); DateTime e1 = e.Datum1; DateTime e2 = e.Datum2; e1 = new DateTime(e1.Year, e1.Month, e1.Day, 0, 0, 0); e2 = new DateTime(e2.Year, e2.Month, e2.Day, 0, 0, 0); DateTime d = e1; int[] ido = new int[3]; var v = ABKezelo.Kiolvasas().Where(x => x is EtrendIdopont).ToList(); if (v.Count > 0) { EtrendIdopont et = (EtrendIdopont)v.First(); for (int i = 0; i < 3; i++) { ido[i] = 60 * et.Datum[i].Hour + et.Datum[i].Minute; } } else { for (int i = 0; i < 3; i++) { ido[i] = 60 * (7 + 6 * i) + 30; } } int num = 0; while (d <= e2) { for (int i = 0; i < 3; i++) { if (d == e1 && i < (int)e.Etkezes1) { continue; } if (d == e2 && i > (int)e.Etkezes2) { continue; } var l2 = l.Where(x => (x as EtrendElelmiszer).Datum == d && (int)(x as EtrendElelmiszer).Etkezes == i).ToList(); string str = ((EtkezesTipus)i).ToString() + ":"; foreach (EtrendElelmiszer item in l2) { Elelmiszer elelmiszer = item.Elelmiszer; if (elelmiszer is Etel) { str += String.Format("{0:0.0} {1} {2};", item.Tomeg, item.Tomegmertekegyseg.Megnevezes, elelmiszer.Megnevezes); } else if (elelmiszer is Ital) { str += String.Format("{0:0.0} {1} {2};", item.Urmertek, item.Urmertekegyseg.Megnevezes, elelmiszer.Megnevezes); } else { str += String.Format("{0:0.0} {1} [{2:0.0} {3}, {4:0.0} {5}];", item.Val, elelmiszer.Megnevezes, item.Tomeg, item.Tomegmertekegyseg.Megnevezes, item.Urmertek, item.Urmertekegyseg.Megnevezes); } } evnt.Summary = str; evnt.Description = ((EtkezesTipus)i).ToString(); DateTime d1 = d + TimeSpan.FromMinutes(ido[i]); DateTime d2 = d1 + TimeSpan.FromMinutes(30); //30 perc hosszú étkezés // időpontok beállitása evnt.Start = new EventDateTime() { DateTime = d1 }; evnt.End = new EventDateTime() { DateTime = d2 }; String calendarId = "primary"; service.Events.Insert(evnt, calendarId).Execute(); } d = d.AddDays(1); } Logolas.Ment("Successful save to calendar"); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public List <object> Megoldas() { e0 = ABKezelo.Kiolvasas().ToList(); mertekegysegek = new List <Mertekegyseg>(); tapanyagok = new List <Tapanyag>(); penznemek = new List <Penznem>(); elelmiszerek = new List <Elelmiszer>(); elelmiszerhasznalt = new List <Elelmiszer>(); etkezesfeltetelek = new List <EtkezesFeltetel>(); EtrendFeltetel etrendfeltetel = null; foreach (EtrendAdat item in e0) { if (item is Mertekegyseg) { mertekegysegek.Add((Mertekegyseg)item); } else if (item is Tapanyag && (item as Tapanyag).Hasznalhato) { tapanyagok.Add((Tapanyag)item); } else if (item is Penznem) { penznemek.Add((Penznem)item); } else if (item is EtkezesFeltetel) { etkezesfeltetelek.Add((EtkezesFeltetel)item); } else if (item is Elelmiszer) { elelmiszerek.Add((Elelmiszer)item); if (((Elelmiszer)item).Hasznalhato) { elelmiszerhasznalt.Add((Elelmiszer)item); } } else if (item is EtrendFeltetel) { etrendfeltetel = (EtrendFeltetel)item; } } if (elelmiszerhasznalt.Count == 0) { throw new ArgumentException("Currently you have no usable food!"); } DateTime datum1 = etrendfeltetel.Datum1; datum1 = new DateTime(datum1.Year, datum1.Month, datum1.Day, 0, 0, 0); DateTime datum2 = etrendfeltetel.Datum2; datum2 = new DateTime(datum2.Year, datum2.Month, datum2.Day, 0, 0, 0); int E1 = 1 + (int)etrendfeltetel.Etkezes1; //E1,E2 eggyel el van tolva int E2 = 1 + (int)etrendfeltetel.Etkezes2; if (datum1 > datum2 || (datum1 == datum2 && E1 > E2)) { throw new ArgumentException("The mealtime is empty!"); } int sz = 3 * ((datum2 - datum1).Days - 1) + E2 + 4 - E1; // étkezések száma if (sz > Konstans.maxEtkezesekSzama) { throw new ArgumentException(String.Format("{0} given mealtime, the maximal is {1} !", sz, (int)Konstans.maxEtkezesekSzama)); } int maxfutasiido = 1000 * etrendfeltetel.Maxfutasiido;//msec-ben int E = elelmiszerhasznalt.Count; int T = tapanyagok.Count; int N = 1 + (datum2 - datum1).Days; //napok száma bool valtozatos = etrendfeltetel.Numvaltozatossag >= 2; bool folytonos = etrendfeltetel.Folytonosmodell; int valtozatosEtkezesSzam = etrendfeltetel.Numvaltozatossag; if (!valtozatos) { valtozatosEtkezesSzam = 0; } string input_filename = "etkezesprogram.txt"; string output_filename = "solution.txt"; string str = ""; Penznem p = elelmiszerhasznalt[0].Penz; Penznem p0 = etrendfeltetel.Penz; try { foreach (Elelmiszer item in elelmiszerhasznalt) { if (item is Menu) { (item as Menu).update(); } } // egészértétű lineáris program megírása str += "/* Automatikusan generált program, ne módosítsa a fájlt! */" + Environment.NewLine; str += Environment.NewLine; str += String.Format("param NagySzam := {0};", nagySzam) + Environment.NewLine; str += String.Format("param NagySzam2 := {0};", nagySzam2) + Environment.NewLine; str += "/* élelmiszerek száma */" + Environment.NewLine; str += String.Format("param E := {0};", E) + Environment.NewLine; str += "/* napok száma */" + Environment.NewLine; str += String.Format("param N := {0};", N) + Environment.NewLine; str += "/* tápanyagok száma */" + Environment.NewLine; str += String.Format("param T := {0};", T) + Environment.NewLine; str += "/* Változatosság */" + Environment.NewLine; str += String.Format("param D := {0};", valtozatosEtkezesSzam) + Environment.NewLine; str += "/* Első étkezés */" + Environment.NewLine; str += String.Format("param E1:= {0};", E1) + Environment.NewLine; /* első étkezés, 1-el eltolva */ str += "/* Utolsó étkezés */" + Environment.NewLine; str += String.Format("param E2:= {0};", E2) + Environment.NewLine; /* utolsó étkezés, 1-el eltolva */ str += Environment.NewLine; //maxpénz beállítása if (!etrendfeltetel.Koltsegmin) { str += String.Format("param Maxpenz:= {0};", etrendfeltetel.Maxpenz * p0.Arfolyam / p.Arfolyam).Replace(',', '.') + Environment.NewLine; } str += "param V{0..15,0..2};" + Environment.NewLine; //étkezésfeltételek str += "param W{1..E,1..18};" + Environment.NewLine; if (T > 0) { str += "param U{1..E,1..T};" + Environment.NewLine; str += "param NapiMaxTapanyag{1..T};" + Environment.NewLine; str += "param NapiMinTapanyag{1..T};" + Environment.NewLine; } str += Environment.NewLine; str += "var x{n in 1..N,i in 1..4,e in 1..E}, >=0;" + Environment.NewLine; str += "var y{n in 1..N,i in 1..3,e in 1..E} integer, >=0;" + Environment.NewLine; str += "var b{n in 1..N,i in 1..4,e in 1..E} binary;" + Environment.NewLine; str += "var c{n in 1..N,i in 1..4,e in 1..E} binary;" + Environment.NewLine; str += "var Adat{n in 1..N,i in 1..4,j in 0..3}, >=0;" + Environment.NewLine; if (T > 0) { str += "var Tapanyag{n in 1..N,t in 1..T}, >=0;" + Environment.NewLine; } str += "var Tomeg{n in 1..N,i in 1..4,e in 1..E}, >=0;" + Environment.NewLine; str += "var Urmertek{n in 1..N,i in 1..4,e in 1..E}, >=0;" + Environment.NewLine; str += "var Penz >=0;" + Environment.NewLine; str += "var Orom >=0;" + Environment.NewLine; str += Environment.NewLine; int reggelinelFogyaszthatoE; int ebednelFogyaszthatoE; int vacsoranalFogyaszthatoE; int valtozatosE; int egysegTobbszorose; int maxDarab; int etelSzam; double etelTomeg; double minEtelTomeg; double maxEtelTomeg; int italSzam; double italUrmertek; double minItalUrmertek; double maxItalUrmertek; double ar, orom; int maxTomegE; int maxUrmertekE; string str2 = "param W: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18:=" + Environment.NewLine; int i = 0, j; foreach (Elelmiszer item in elelmiszerhasznalt) { i++; maxTomegE = 0; maxUrmertekE = 0; maxEtelTomeg = 0; maxItalUrmertek = 0; if (item is Etel) { Etel e = item as Etel; reggelinelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[0]); ebednelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[1]); vacsoranalFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[2]); valtozatosE = valtozatosEtkezesSzam; if (!e.Valtozatossag || !valtozatos) { valtozatosE = 0; } egysegTobbszorose = Convert.ToByte(e.EgysegTobbszorose); if (folytonos) { egysegTobbszorose = 0; } maxDarab = -1; etelSzam = 1; etelTomeg = e.EgysegTomegMennyiseg * e.TomegMertek.Valtoszam; minEtelTomeg = e.MinTomeg * e.TomegMertek.Valtoszam; if (e.MaxTomegE) { maxEtelTomeg = e.MaxTomeg * e.TomegMertek.Valtoszam; maxTomegE = 1; } italSzam = 0; italUrmertek = 0; minItalUrmertek = 0; maxItalUrmertek = nagySzam; ar = e.Ar * e.Penz.Arfolyam / p.Arfolyam; orom = 0.001 * etelTomeg * e.Orom; } else if (item is Ital) { Ital e = item as Ital; reggelinelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[0]); ebednelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[1]); vacsoranalFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[2]); valtozatosE = valtozatosEtkezesSzam; if (!e.Valtozatossag || !valtozatos) { valtozatosE = 0; } egysegTobbszorose = Convert.ToByte(e.EgysegTobbszorose); if (folytonos) { egysegTobbszorose = 0; } maxDarab = -1; etelSzam = 0; etelTomeg = 0; minEtelTomeg = 0; maxEtelTomeg = 0; italSzam = 1; italUrmertek = e.EgysegUrTartalomMennyiseg * e.Urmertek.Valtoszam; minItalUrmertek = e.MinUrTartalom * e.Urmertek.Valtoszam; if (e.MaxUrTartalomE) { maxItalUrmertek = e.MaxUrTartalom * e.Urmertek.Valtoszam; maxUrmertekE = 1; } ar = e.Ar * e.Penz.Arfolyam / p.Arfolyam; orom = italUrmertek * e.Orom; } else { Menu e = item as Menu; reggelinelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[0]); ebednelFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[1]); vacsoranalFogyaszthatoE = Convert.ToByte(e.Fogyaszthato[2]); valtozatosE = valtozatosEtkezesSzam; if (!e.Valtozatossag || !valtozatos) { valtozatosE = 0; } egysegTobbszorose = Convert.ToByte(e.EgysegTobbszorose); if (folytonos) { egysegTobbszorose = 0; } maxDarab = e.MaxDarab; // annyi ételnek/italnak felel meg amennyi ételt/italt tartalmaz etelSzam = 0; italSzam = 0; foreach (KeyValuePair <Elelmiszer, double> item2 in e.Osszetevo) { if (item2.Value > 0) { if (item2.Key is Etel) { etelSzam++; } else { italSzam++; } } } etelTomeg = e.EgysegTomegMennyiseg * e.TomegMertek.Valtoszam; minEtelTomeg = 0; maxEtelTomeg = nagySzam; italUrmertek = e.EgysegUrTartalomMennyiseg * e.Urmertek.Valtoszam; minItalUrmertek = 0; maxItalUrmertek = nagySzam; ar = e.Ar * e.Penz.Arfolyam / p.Arfolyam; orom = e.Orom * (0.001 * etelTomeg + italUrmertek); // 1 l=1 kg-nak felel meg } str2 += String.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18}", i, reggelinelFogyaszthatoE, ebednelFogyaszthatoE, vacsoranalFogyaszthatoE, valtozatosE, egysegTobbszorose, maxDarab, etelSzam, etelTomeg, minEtelTomeg, maxEtelTomeg, italSzam, italUrmertek, minItalUrmertek, maxItalUrmertek, ar, orom, maxTomegE, maxUrmertekE ).Replace(',', '.') + ((i == E) ? ";" : "") + Environment.NewLine; } //étkezésfeltételek str2 += Environment.NewLine + "param V: 0 1 2 :=" + Environment.NewLine; double[] f1 = new double[16]; double[] f2 = new double[16]; int[] b0 = new int[16]; for (i = 0; i < 16; i++) { f1[i] = 0; f2[i] = 0; b0[i] = 0; } foreach (EtkezesFeltetel item in etkezesfeltetelek) { int pos = 8 * ((int)item.Eltipus2) + 2 * ((int)item.Ettipus2) + (int)item.Szamlalo; f1[pos] = item.Minval; f2[pos] = item.Maxval; if (item.Eltipus2 == ElelmiszerTipus2.drink && item.Szamlalo == Szamlalo.quantity) { f1[pos] /= 10; f2[pos] /= 10; // deciliter volt } b0[pos] = item.MaxvalE ? 1 : 0; } for (i = 0; i < 16; i++) { str2 += string.Format("{0} {1} {2} {3}", i, f1[i], b0[i], f2[i]).Replace(',', '.') + (i == 15 ? ";" : "") + Environment.NewLine; } i = 0; if (tapanyagok.Count > 0) { //tápanyagtömb neve U lesz str2 += Environment.NewLine + "param U: "; for (i = 1; i <= tapanyagok.Count; i++) { str2 += string.Format(" {0}", i); } str2 += " :=" + Environment.NewLine; i = 0; foreach (Elelmiszer item in elelmiszerhasznalt) { i++; j = 0; str2 += String.Format("{0}", i); foreach (Tapanyag item2 in tapanyagok) { j++; str2 += String.Format(" {0}", item.TapanyagTartalom[item2]).Replace(',', '.'); } str2 += ((i == E) ? ";" : "") + Environment.NewLine; } str2 += Environment.NewLine; str2 += "param NapiMaxTapanyag:=" + Environment.NewLine; for (i = 1; i <= tapanyagok.Count; i++) { double v = tapanyagok[i - 1].NapiMax ? tapanyagok[i - 1].NapiMaxBevitel : -1; str2 += String.Format("{0} {1}", i, v).Replace(',', '.') + (i < T ? "," : ";") + Environment.NewLine; } str2 += Environment.NewLine; str2 += "param NapiMinTapanyag:=" + Environment.NewLine; for (i = 1; i <= tapanyagok.Count; i++) { str2 += string.Format("{0} {1}", i, tapanyagok[i - 1].NapiMinBevitel).Replace(',', '.') + (i < T ? "," : ";") + Environment.NewLine; } str2 += Environment.NewLine; } str += "/* napi élelmiszeradagok kiszámítása */" + Environment.NewLine; str += "s.t. feltetel0{n in 1..N,e in 1..E}:x[n,4,e]=x[n,1,e]+x[n,2,e]+x[n,3,e];" + Environment.NewLine; str += Environment.NewLine; str += "/* ha nem fogyaszható, akkor x=0 */" + Environment.NewLine; str += "s.t. feltetel1{n in 1..N,i in 1..3,e in 1..E:W[e,i]=0 or (n=1 and i<E1) or (n=N and i>E2)}:x[n,i,e]=0;" + Environment.NewLine; str += Environment.NewLine; /* pénz és öröm kiszámítása */ str += "/* pénz kiszámítása */" + Environment.NewLine; str += "s.t. feltetel2: sum{n in 1..N,i in 1..3,e in 1..E}x[n,i,e]*W[e,15]=Penz;" + Environment.NewLine; str += Environment.NewLine; str += "/* öröm kiszámítása */" + Environment.NewLine; str += "s.t. feltetel3: sum{n in 1..N,i in 1..3,e in 1..E}x[n,i,e]*W[e,16]=Orom;" + Environment.NewLine; str += Environment.NewLine; /* maxdarab feltételek */ str += "/* maxdarab feltételek */" + Environment.NewLine; str += "s.t. feltetel4{n in 1..N,i in 1..3,e in 1..E:W[e,6]!=-1}:x[n,i,e]<=W[e,6];" + Environment.NewLine; str += Environment.NewLine; /* egység többszöröse */ str += "/* egység többszöröseire feltétel */" + Environment.NewLine; str += "s.t. feltetel5{n in 1..N,i in 1..3,e in 1..E:W[e,5]=1}:x[n,i,e]=y[n,i,e];" + Environment.NewLine; str += Environment.NewLine; str += "s.t. feltetel5a{n in 1..N,i in 1..3,e in 1..E:W[e,5]=1}:b[n,i,e]<=y[n,i,e];" + Environment.NewLine; str += Environment.NewLine; str += "s.t. feltetel5b{n in 1..N,i in 1..3,e in 1..E:W[e,5]=1}:c[n,i,e]<=y[n,i,e];" + Environment.NewLine; str += Environment.NewLine; str += "/* tömege,űrmértéke az élelmiszereknek */" + Environment.NewLine; str += "s.t. feltetel6{n in 1..N,i in 1..4,e in 1..E}:x[n,i,e]*W[e,8]=Tomeg[n,i,e];" + Environment.NewLine; str += "s.t. feltetel7{n in 1..N,i in 1..4,e in 1..E}:x[n,i,e]*W[e,12]=Urmertek[n,i,e];" + Environment.NewLine; str += Environment.NewLine; str += "/* nagyszam>=tömeg,űrmérték>=1/nagyszam minden élelmiszerre */" + Environment.NewLine; str += "s.t. feltetel8{n in 1..N,i in 1..4,e in 1..E}:Tomeg[n,i,e]<=NagySzam*b[n,i,e];" + Environment.NewLine; str += "s.t. feltetel9{n in 1..N,i in 1..4,e in 1..E}:Tomeg[n,i,e]*NagySzam2>=b[n,i,e];" + Environment.NewLine; str += "s.t. feltetel10{n in 1..N,i in 1..4,e in 1..E}:Urmertek[n,i,e]<=NagySzam*c[n,i,e];" + Environment.NewLine; str += "s.t. feltetel11{n in 1..N,i in 1..4,e in 1..E}:Urmertek[n,i,e]*NagySzam2>=c[n,i,e];" + Environment.NewLine; str += Environment.NewLine; str += "/* tömeg,űrmértékekre feltételek minden élelmiszerre */" + Environment.NewLine; str += "s.t. feltetel12{n in 1..N,i in 1..3,e in 1..E}:Tomeg[n,i,e]>=W[e,9]*b[n,i,e];" + Environment.NewLine; str += "s.t. feltetel13{n in 1..N,i in 1..3,e in 1..E:W[e,17]=1}:Tomeg[n,i,e]<=W[e,10]*b[n,i,e];" + Environment.NewLine; str += "s.t. feltetel14{n in 1..N,i in 1..3,e in 1..E}:Urmertek[n,i,e]>=W[e,13]*c[n,i,e];" + Environment.NewLine; str += "s.t. feltetel15{n in 1..N,i in 1..3,e in 1..E:W[e,18]=1}:Urmertek[n,i,e]<=W[e,14]*c[n,i,e];" + Environment.NewLine; str += Environment.NewLine; if (T > 0) { //tápanyagokra feltétel str += "/* napi max,min bevitel a tápanyagokra */" + Environment.NewLine; str += "s.t. feltetel16{n in 1..N,t in 1..T}:sum{e in 1..E}x[n,4,e]*U[e,t]=Tapanyag[n,t];" + Environment.NewLine; if (true) { str += "s.t. feltetel17{n in 1..N,t in 1..T:NapiMaxTapanyag[t]!=-1}:Tapanyag[n,t]<=NapiMaxTapanyag[t];" + Environment.NewLine; } str += "s.t. feltetel18{n in 1..N,t in 1..T}:Tapanyag[n,t]>=NapiMinTapanyag[t];" + Environment.NewLine; str += Environment.NewLine; } //ételszám,tömeg,italszám,űrmérték feltételek adott étkezésre, illetve teljes napra [i=4 <=> egész napra feltétel] //itt is lehetne egy sokkal tömörebb felírás, de inkább szétszedjük a feltételeket több esetre str += "/* ételszám,tömeg,italszám,űrmérték számítása */" + Environment.NewLine; str += "s.t. feltetel19{n in 1..N,i in 1..4}:sum{e in 1..E}b[n,i,e]*W[e,7]=Adat[n,i,0];" + Environment.NewLine; str += "s.t. feltetel20{n in 1..N,i in 1..4}:sum{e in 1..E}x[n,i,e]*W[e,8]=Adat[n,i,1];" + Environment.NewLine; str += "s.t. feltetel21{n in 1..N,i in 1..4}:sum{e in 1..E}c[n,i,e]*W[e,11]=Adat[n,i,2];" + Environment.NewLine; str += "s.t. feltetel22{n in 1..N,i in 1..4}:sum{e in 1..E}x[n,i,e]*W[e,12]=Adat[n,i,3];" + Environment.NewLine; str += Environment.NewLine; // ételszámokra feltétel str += "s.t. feltetel23{n in 1..N,i in 1..4:i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2)}:Adat[n,i,0]>=V[2*(i-1),0];" + Environment.NewLine; str += "s.t. feltetel24{n in 1..N,i in 1..4:V[2*(i-1),1]=1 and (i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2))}:Adat[n,i,0]<=V[2*(i-1),2];" + Environment.NewLine; // ételtömegre feltétel str += "s.t. feltetel25{n in 1..N,i in 1..4:i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2)}:Adat[n,i,1]>=V[2*(i-1)+1,0];" + Environment.NewLine; str += "s.t. feltetel26{n in 1..N,i in 1..4:V[2*(i-1)+1,1]=1 and (i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2))}:Adat[n,i,1]<=V[2*(i-1)+1,2];" + Environment.NewLine; // italszámokra feltétel str += "s.t. feltetel27{n in 1..N,i in 1..4:i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2)}:Adat[n,i,2]>=V[2*(i-1)+8,0];" + Environment.NewLine; str += "s.t. feltetel28{n in 1..N,i in 1..4:V[2*(i-1)+8,1]=1 and (i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2))}:Adat[n,i,2]<=V[2*(i-1)+8,2];" + Environment.NewLine; // italűrmértékre feltétel str += "s.t. feltetel29{n in 1..N,i in 1..4:i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2)}:Adat[n,i,3]>=V[2*(i-1)+9,0];" + Environment.NewLine; str += "s.t. feltetel30{n in 1..N,i in 1..4:V[2*(i-1)+9,1]=1 and (i=4 or (3*n+i>=3+E1 and 3*n+i<=3*N+E2))}:Adat[n,i,3]<=V[2*(i-1)+9,2];" + Environment.NewLine; str += Environment.NewLine; //változatosságra feltétel //num tudjuk, hogy ételt vagy italt tartalmaz-e az adott élelmiszer, így külön szedjük a 2 esetet str += "/* változatosságra feltétel */" + Environment.NewLine; str += "s.t. feltetel31{n in 1..N,i in 1..3,e in 1..E:W[e,4]>1}:sum{m in 1..N,j in 1..3:3*m+j>=3*n+i and 3*m+j<3*n+i+D}b[m,j,e]<=1;" + Environment.NewLine; str += "s.t. feltetel32{n in 1..N,i in 1..3,e in 1..E:W[e,4]>1}:sum{m in 1..N,j in 1..3:3*m+j>=3*n+i and 3*m+j<3*n+i+D}c[m,j,e]<=1;" + Environment.NewLine; str += Environment.NewLine; // célfüggvény megadása, illetve még egy plusz feltétel is egy ágban if (etrendfeltetel.Koltsegmin) { str += "minimize cost:Penz;" + Environment.NewLine + Environment.NewLine; } else if (etrendfeltetel.Orommax) { str += "s.t. feltetel33:Penz<=Maxpenz;" + Environment.NewLine; str += "maximize cost:Orom;" + Environment.NewLine + Environment.NewLine; } else { str += "s.t. feltetel33:Penz<=Maxpenz;" + Environment.NewLine; str += "maximize cost:0;" + Environment.NewLine + Environment.NewLine; } str += "/* a lineáris program megoldása */" + Environment.NewLine; str += "solve;" + Environment.NewLine + Environment.NewLine; str += "data;" + Environment.NewLine + Environment.NewLine; str += str2 + Environment.NewLine; str += "end;" + Environment.NewLine; File.WriteAllText(input_filename, str); } catch (Exception e) { throw new ArgumentException("Unsuccessful save to file!"); } ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = false; startInfo.UseShellExecute = etrendfeltetel.Solverelrejt; startInfo.FileName = "glpsol.exe"; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = "--math -o " + output_filename + " " + input_filename + "\""; try { using (Process exeProcess = Process.Start(startInfo)) { if (!exeProcess.WaitForExit(maxfutasiido)) { throw new TimeoutException("We have reached the maximal running time, Glpk killed!"); } } } catch (Exception ex) { if (ex is TimeoutException) { throw ex; } throw new FileNotFoundException("Not found the glpsol.exe or dll !"); } if (!File.Exists(output_filename)) { throw new FileNotFoundException("File not found!"); } else { List <EAdat> C = new List <EAdat>(); int i, j, sorokszama = 0; double opt = 0; foreach (string item in File.ReadAllLines(output_filename)) { sorokszama++; if (sorokszama == 5 && item == "Status: INTEGER EMPTY") { return(new List <object> { false }); } if (sorokszama == 6) { for (i = 0; item[i] != '='; i++) { ; } i += 2; for (j = i; item[j] != ' '; j++) { ; } opt = double.Parse(item.Substring(i, j - i), NumberStyles.Any, new CultureInfo("en-US")); } string u = ""; for (i = 0; i < item.Length; i++) { if (item[i] != ' ' || i == 0 || item[i - 1] != ' ') { u += item[i]; } } string[] s = u.Trim().Split(' '); if (s.Length >= 3 && s[1][0] == 'x') { double v = double.Parse(s[2], NumberStyles.Any, new CultureInfo("en-US")); if (v > 0) { string[] t = s[1].Substring(2, s[1].Length - 3).Split(','); int i1 = Convert.ToInt32(t[1]); if (i1 <= 3) { C.Add(new EAdat(Convert.ToInt32(t[0]), i1, Convert.ToInt32(t[2]), v)); } } } } Mertekegyseg u1 = (Mertekegyseg)ABKezelo.Kiolvasas() .Where(x => x is Mertekegyseg && (x as Mertekegyseg).Megnevezes == "gram").ToList().First(); Mertekegyseg u2 = (Mertekegyseg)ABKezelo.Kiolvasas() .Where(x => x is Mertekegyseg && (x as Mertekegyseg).Megnevezes == "liter").ToList().First(); string fnev = ABKezelo.GetCurrentUser(); ABKezelo.TorolEtrendElelmiszer(); for (int nap = 1; nap <= N; nap++) { for (int etkezes = 1; etkezes <= 3; etkezes++) { foreach (EAdat item in C) { if (item.nap == nap && item.etkezes == etkezes) { Elelmiszer e = elelmiszerhasznalt[item.elelmiszer - 1]; double tomeg = 0, urtartalom = 0; Mertekegyseg m1 = u1; Mertekegyseg m2 = u2; if (e is Etel) { tomeg = item.val * (e as Etel).EgysegTomegMennyiseg; m1 = (e as Etel).TomegMertek; } else if (e is Ital) { urtartalom = item.val * (e as Ital).EgysegUrTartalomMennyiseg; m2 = (e as Ital).Urmertek; } else { tomeg = item.val * (e as Menu).EgysegTomegMennyiseg; m1 = (e as Menu).TomegMertek; urtartalom = item.val * (e as Menu).EgysegUrTartalomMennyiseg; m2 = (e as Menu).Urmertek; } DateTime datum = datum1.AddDays(nap - 1); ABKezelo.Beszuras(new EtrendElelmiszer(fnev, datum, (EtkezesTipus)(etkezes - 1), e, item.val, tomeg, m1, urtartalom, m2)); } } } } return(new List <object>() { true, opt, p }); } }