Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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
                });
            }
        }