private void Button1_Click(object sender, EventArgs e) { if (listBox1.SelectedIndex != -1) { try { Elelmiszer el = (listBox1.SelectedItem as Elelmiszer); el.Hasznalhato = true; ABKezelo.Modositas(el); listBoxRefresh(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
internal UjElelmiszerForm(Elelmiszer modosit, bool megjelenit = false) : this() { try { this.megjelenit = megjelenit; if (modosit is Menu) { (modosit as Menu).update(); } elelmiszer = modosit; textBox1.Text = modosit.Megnevezes; textBox1.Enabled = false; numericUpDown1.Value = elelmiszer.Orom; numericUpDown2.Value = (decimal)elelmiszer.Ar; comboBox2.SelectedItem = elelmiszer.Penz.Megnevezes; checkBox1.Checked = elelmiszer.EgysegTobbszorose; checkBox3.Checked = elelmiszer.Fogyaszthato[0]; checkBox4.Checked = elelmiszer.Fogyaszthato[1]; checkBox5.Checked = elelmiszer.Fogyaszthato[2]; checkBox6.Checked = elelmiszer.Valtozatossag; checkBox7.Checked = elelmiszer.Hasznalhato; int i; for (i = 0; i < labelek.Count; i++) { string tnev = labelek[i].Text.Remove(labelek[i].Text.Length - 1); Tapanyag t = tapanyagok.Where(x => x.Megnevezes == tnev).ToList().First(); szamlalok[i].Value = (decimal)elelmiszer.TapanyagTartalom[t]; labelek2[i].Text = t.Mertek.Megnevezes; } if (elelmiszer is Etel) { comboBox1.SelectedIndex = (int)ElelmiszerTipus.meal; comboBox1.Enabled = false; comboBox3.SelectedItem = (elelmiszer as Etel).TomegMertek.Megnevezes; label8.Text = comboBox3.SelectedText; label9.Text = comboBox3.SelectedText; numericUpDown3.Value = (decimal)(elelmiszer as Etel).EgysegTomegMennyiseg; numericUpDown5.Value = (decimal)(elelmiszer as Etel).MinTomeg; numericUpDown6.Value = (decimal)(elelmiszer as Etel).MaxTomeg; checkBox2.Checked = (elelmiszer as Etel).MaxTomegE; } else if (elelmiszer is Ital) { comboBox1.SelectedIndex = (int)ElelmiszerTipus.drink; comboBox1.Enabled = false; comboBox4.SelectedItem = (elelmiszer as Ital).Urmertek.Megnevezes; label8.Text = comboBox4.SelectedText; label9.Text = comboBox4.SelectedText; numericUpDown4.Value = (decimal)(elelmiszer as Ital).EgysegUrTartalomMennyiseg; numericUpDown5.Value = (decimal)(elelmiszer as Ital).MinUrTartalom; numericUpDown6.Value = (decimal)(elelmiszer as Ital).MaxUrTartalom; checkBox2.Checked = (elelmiszer as Ital).MaxUrTartalomE; } else if (elelmiszer is Menu) { comboBox1.SelectedIndex = (int)ElelmiszerTipus.menu; comboBox1.Enabled = false; checkBox8.Checked = (elelmiszer as Menu).Arszamitas; label8.Visible = false; label9.Visible = false; comboBox3.SelectedItem = (elelmiszer as Menu).TomegMertek.Megnevezes; numericUpDown3.Value = (decimal)(elelmiszer as Menu).EgysegTomegMennyiseg; comboBox4.SelectedItem = (elelmiszer as Menu).Urmertek.Megnevezes; numericUpDown4.Value = (decimal)(elelmiszer as Menu).EgysegUrTartalomMennyiseg; numericUpDown7.Value = (decimal)(elelmiszer as Menu).MaxDarab; for (i = 0; i < labelek3.Count; i++) { string str = labelek3[i].Text.Remove(labelek3[i].Text.Length - 1); Elelmiszer e = elelmiszerek.Where(x => x.Megnevezes == str).First(); if ((elelmiszer as Menu).Osszetevo.ContainsKey(e)) { szamlalok3[i].Value = (decimal)(elelmiszer as Menu).Osszetevo[e]; } } } if (megjelenit) { foreach (Control item in Controls) { item.Enabled = false; } button1.Enabled = true; button1.DialogResult = DialogResult.Cancel; } ComboBox1_SelectedIndexChanged(new object(), new EventArgs()); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void Button1_Click(object sender, EventArgs e) { try { string fnevhash = ABKezelo.GetCurrentUser(); if (comboBox1.SelectedIndex != (int)ElelmiszerTipus.menu && checkBox2.Checked && numericUpDown5.Value > numericUpDown6.Value) { throw new WarningException("The maximal consumption should not be less than the minimal!"); } if (elelmiszer == null) { string nev = textBox1.Text.Trim(); if (nev == "" || nev.Length > 30) { throw new WarningException("The name should be non-empty and at most 30 characters!"); } if (elelmiszerek.Where(x => x.Megnevezes == nev).ToList().Count > 0) { throw new WarningException("You already have a food with this name!"); } int i; List <bool> fogyaszthato = new List <bool> { checkBox3.Checked, checkBox4.Checked, checkBox5.Checked }; double ar = (double)numericUpDown2.Value; Penznem penz = penznemek.Where(p => p.Megnevezes == comboBox2.SelectedItem.ToString()).First(); Mertekegyseg mertek1 = mertekegysegek.Where(m => m.Megnevezes == comboBox3.SelectedItem.ToString()).First(); double mennyiseg1 = (double)numericUpDown3.Value; Mertekegyseg mertek2 = mertekegysegek.Where(m => m.Megnevezes == comboBox4.SelectedItem.ToString()).First(); double mennyiseg2 = (double)numericUpDown4.Value; //étel Elelmiszer el = null; switch ((ElelmiszerTipus)comboBox1.SelectedIndex) { case ElelmiszerTipus.meal: { el = new Etel(fnevhash, textBox1.Text.Trim(), (byte)numericUpDown1.Value, penz, ar, checkBox1.Checked, fogyaszthato, checkBox6.Checked, checkBox7.Checked, new Dictionary <Tapanyag, double>(), mennyiseg1, (double)numericUpDown5.Value, (double)numericUpDown6.Value, checkBox2.Checked, mertek1); break; } //ital case ElelmiszerTipus.drink: { el = new Ital(fnevhash, textBox1.Text.Trim(), (byte)numericUpDown1.Value, penz, ar, checkBox1.Checked, fogyaszthato, checkBox6.Checked, checkBox7.Checked, new Dictionary <Tapanyag, double>(), mennyiseg2, (double)numericUpDown5.Value, (double)numericUpDown6.Value, checkBox2.Checked, mertek2); break; } //menü case ElelmiszerTipus.menu: { el = new Menu(fnevhash, textBox1.Text.Trim(), (byte)numericUpDown1.Value, penz, ar, checkBox1.Checked, fogyaszthato, checkBox6.Checked, checkBox7.Checked, new Dictionary <Tapanyag, double>(), (byte)numericUpDown7.Value, 1, mertek1, 1, mertek2, new Dictionary <Elelmiszer, double>(), checkBox8.Checked); break; } } foreach (Tapanyag item in ABKezelo.Kiolvasas().Where(x => x is Tapanyag).ToList()) { el.TapanyagTartalom.Add(item, 0); } for (i = 0; i < labelek.Count(); i++) { string str = labelek[i].Text.Remove(labelek[i].Text.Length - 1); double m = (double)szamlalok[i].Value; Tapanyag t = tapanyagok.Where(x => x.Megnevezes == str).First(); el.TapanyagTartalom[t] = m; } if (el is Menu) { bool van = false; for (i = 0; i < labelek3.Count; i++) { string str = labelek3[i].Text.Remove(labelek3[i].Text.Length - 1); double m = (double)szamlalok3[i].Value; if (m > 0) { van = true; } Elelmiszer el2 = elelmiszerek.Where(x => x.Megnevezes == str).First(); (el as Menu).Osszetevo.Add(el2, m); } if (!van) { throw new WarningException("There is no meal/drink with positive mass/volume!"); } } ABKezelo.Beszuras(el); Logolas.Ment("New food added, name: " + el.Megnevezes); } else { elelmiszer.Orom = (byte)numericUpDown1.Value; elelmiszer.Ar = (double)numericUpDown2.Value; string pnev = comboBox2.SelectedItem.ToString(); elelmiszer.Penz = penznemek.Where(x => x.Megnevezes == pnev).First(); elelmiszer.EgysegTobbszorose = checkBox1.Checked; elelmiszer.Fogyaszthato = new List <bool>() { checkBox3.Checked, checkBox4.Checked, checkBox5.Checked }; elelmiszer.Valtozatossag = checkBox6.Checked; elelmiszer.Hasznalhato = checkBox7.Checked; int i; for (i = 0; i < labelek.Count; i++) { string tnev = labelek[i].Text.Remove(labelek[i].Text.Length - 1); Tapanyag t = tapanyagok.Where(x => x.Megnevezes == tnev).First(); elelmiszer.TapanyagTartalom[t] = (double)szamlalok[i].Value; } if (elelmiszer is Etel) { (elelmiszer as Etel).TomegMertek.Megnevezes = comboBox3.SelectedItem.ToString(); (elelmiszer as Etel).EgysegTomegMennyiseg = (double)numericUpDown3.Value; (elelmiszer as Etel).MinTomeg = (double)numericUpDown5.Value; (elelmiszer as Etel).MaxTomeg = (double)numericUpDown6.Value; (elelmiszer as Etel).MaxTomegE = checkBox2.Checked; } else if (elelmiszer is Ital) { (elelmiszer as Ital).Urmertek.Megnevezes = comboBox4.SelectedItem.ToString(); (elelmiszer as Ital).EgysegUrTartalomMennyiseg = (double)numericUpDown4.Value; (elelmiszer as Ital).MinUrTartalom = (double)numericUpDown5.Value; (elelmiszer as Ital).MaxUrTartalom = (double)numericUpDown6.Value; (elelmiszer as Ital).MaxUrTartalomE = checkBox2.Checked; } else if (elelmiszer is Menu) { (elelmiszer as Menu).TomegMertek.Megnevezes = comboBox3.SelectedItem.ToString(); (elelmiszer as Menu).EgysegTomegMennyiseg = (double)numericUpDown3.Value; (elelmiszer as Menu).Urmertek.Megnevezes = comboBox4.SelectedItem.ToString(); (elelmiszer as Menu).EgysegUrTartalomMennyiseg = (double)numericUpDown4.Value; (elelmiszer as Menu).MaxDarab = (byte)numericUpDown7.Value; (elelmiszer as Menu).Osszetevo = new Dictionary <Elelmiszer, double>(); double total = 0; for (i = 0; i < labelek3.Count; i++) { string str = labelek3[i].Text.Remove(labelek3[i].Text.Length - 1); Elelmiszer el2 = elelmiszerek.Where(x => x.Megnevezes == str).First(); double m = (double)szamlalok3[i].Value; if (m > 0) { (elelmiszer as Menu).Osszetevo.Add(el2, m); total += m; } } if (total == 0) { throw new WarningException("The unit should be positive"); } } ABKezelo.Modositas(elelmiszer); Logolas.Ment("Food modification, name: " + elelmiszer.Megnevezes); } } 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); } DialogResult = DialogResult.None; } }
public EtrendElelmiszer(string felhasznaloNevHash, DateTime datum, EtkezesTipus etkezes, Elelmiszer elelmiszer, double val, double tomeg, Mertekegyseg tomegmertekegyseg, double urmertek, Mertekegyseg urmertekegyseg) : base(felhasznaloNevHash) { Datum = datum; Etkezes = etkezes; Elelmiszer = elelmiszer; Val = val; Tomeg = tomeg; Tomegmertekegyseg = tomegmertekegyseg; Urmertek = urmertek; Urmertekegyseg = urmertekegyseg; }
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 }); } }
public ElelmiszerElelmiszer(string felhasznaloNevHash, string elelmiszerMegnevezes, Elelmiszer elelmiszer, double ertek) : base(felhasznaloNevHash) { ElelmiszerMegnevezes = elelmiszerMegnevezes; Elelmiszer = elelmiszer; Ertek = ertek; }