Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование и архетектура програмных средств...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
303.23 Кб
Скачать

3.2 Создание таблиц

На этом этапе практической реализации базы данных создаются таблицы, соответствующие даталогической модели, построенной в предыдущем разделе.

Для создания таблиц можно использовать два подхода. Первый подход заключается в применении SQL запросов. Второй подход использует визуальные средства программы pgAdmin. Он является наиболее удобным с точки зрения реализации по сравнению с первым подходом и поэтому был выбран для построения таблиц базы данных. В итоге построены структуры нескольких таблиц, показанных в таблицах 1 – 4.

Таблица 1 – Таблица «PS»

поле

тип данных

описание

id

bigserial

первичный ключ

name

character varying(40)

название подстанции

filial_id

smallint

внешний ключ

region_id

smallint

внешний ключ

proprietor_id

smallint

внешний ключ

vvod

smallint

год ввода в эксплуатацию

x

real

широта

y

real

долгота

zona

text

зона действия подстанции

Таблица 2 – Таблица «FILIAL»

поле

тип данных

описание

id

serial

первичный ключ

short_name

character_varying(6)

краткое наименование филиала

full_name

character_varying(40)

полное наименование филиала

Таблица 3 – Таблица «TRANS»

поле

тип данных

описание

id

bigserial

первичный ключ

ps_id

integer

внешний ключ

n_trans

smallint

номер трансформатора

u_id

smallint

внешний ключ

s

real

мощность трансформатора

Таблица 4 – Таблица «OBMOTKA»

поле

тип данных

описание

id

bigserial

первичный ключ

trans_id

integer

внешний ключ

u_id

smallint

внешний ключ

k_id

smallint

внешний ключ

3.3 Программная реализация решения задачи

Создадим классы необходимые для хранения входных и выходных данных:

public class PS

{

public int id = new int();

public string U = "";

public string name = "";

public string region = "";

public string filial = "";

public string vvod = "";

public List<trans> trans = new List<trans>();

public List<zajav> zajav = new List<zajav>();

public List<int> parent_PS = new List<int>();

public List<result> rezult = new List<result>();

public byte n_rezh = new byte();

public DateTime date_rezh = new DateTime();

public string x = "";

public string y = "";

}

public class trans

{

public int id = new int();

public byte N = new byte();

public double U = new double();

public double S = new double();

public List<obmotka> obmotka = new List<obmotka>();

}

public class obmotka

{

public int id = new int();

public double U = new double();

public byte k = new byte();

public double rezh = new double();

}

public class zajav

{

public double U = new double();

public double S = new double();

}

public class result //класс для хранения результатов рассчета

{

public double U = new double();

public double S_propusk = new double(); //Пропускная способность

public byte n_trans = new byte(); //Номер трансформатора с самым тяжелым режимом

public double t_rezerv = new double(); //Текущий резерв мощности

public double z_rezerv = new double(); //Резерв мощности с учетом заявок и договоров на ТП

public double t_deficit = new double(); //Дефицит мощности (текущий)

public double z_deficit = new double(); //Дефицит мощности (с учетом заявок)

public double rezh = new double(); //Данные режимного дня

public double zajav = new double(); //Данные по заявкам и договорам

public byte n_rezh = new byte();

public DateTime date_rezh = new DateTime();

}

public class vetv

{

public double istok, stok = new double();

public double ves = new double();

public byte type = new byte();

//1 - сеть

//2 - трансформатор

//3 - обмотка

public bool enable = new bool();

}

public class put

{

public vetv vetv = new vetv();

public bool vhod = new bool();

}

public class weight

{

public double U = new double();

public double S = new double();

}

public class weighting

{

public List<weight> weight = new List<weight>();

public void add(double new_U, double new_S)

{

foreach (weight temp_weigt in weight)

if (temp_weigt.U == new_U)

{

temp_weigt.S += new_S;

return;

}

weight.Add(new weight { S = new_S, U = new_U } );

}

}

Далее разработаем запросы для получения данных из СУБД и необходимые методы для записи данных в классы программы. Для взаимодействия с СУБД используется библиотека Npgsql.

public List<PS> PS = new List<PS>();

public void Load_data(OSPP_DB.Report.ReportLoad report)

{

NpgsqlConnection conn_pg = new NpgsqlConnection(GlobalSettings.Default.pgconn);

conn_pg.Open();

NpgsqlCommand command_PS = new NpgsqlCommand(@"SELECT

""PS"".id, ""PS"".name, ""FILIAL"".short_name AS filial,

""REGION"".region, ""PS"".vvod, ""PS"".x, ""PS"".y,

FROM ""PS"" LEFT JOIN ""full_u"" ON ""full_u"".ID = ""PS"".id

LEFT JOIN ""FILIAL"" ON ""FILIAL"".id = ""PS"".filial_id

LEFT JOIN ""REGION"" ON ""REGION"".id = ""PS"".region_id

WHERE ""PS"".proprietor_id = 1

ORDER BY ""PS"".id,", conn_pg);

NpgsqlDataReader reader_PS = command_PS.ExecuteReader();

foreach (DbDataRecord record_PS in reader_PS)

{

PS new_PS = new PS();

new_PS.id = Convert.ToInt16(record_PS["id"]);

new_PS.name = record_PS["name"].ToString();

new_PS.U = record_PS["u"].ToString();

new_PS.filial = record_PS["filial"].ToString();

new_PS.region = record_PS["region"].ToString();

try

{

new_PS.vvod = record_PS["vvod"].ToString();

}

catch { }

new_PS.x = record_PS["x"].ToString();

new_PS.y = record_PS["y"].ToString();

NpgsqlCommand command_PS_rezh = new SQLiteCommand(@"SELECT s, n_rezhim_id, date

FROM

(SELECT

Sum(REZHIM.s) as s,

REZHIM.n_rezhim_id,

N_REZHIM.date

FROM

PS

LEFT JOIN TRANS ON TRANS.ps_id = PS.id

LEFT JOIN OBMOTKA ON OBMOTKA.trans_id = TRANS.id

LEFT JOIN REZHIM ON REZHIM.obmotka_id = OBMOTKA.id

LEFT JOIN N_REZHIM ON N_REZHIM.id = REZHIM.n_rezhim_id

WHERE PS.id = #

GROUP BY n_rezhim_id)

ORDER BY s DESC

LIMIT 0,1"

.Replace("#", new_PS.id.ToString()), conn_зп);

NpgsqlDataReader reader_PS_rezh = command_PS_rezh.ExecuteReader();

foreach (DbDataRecord record_PS_rezh in reader_PS_rezh)

{

new_PS.n_rezh = Convert.ToByte(record_PS_rezh["n_rezhim_id"]);

new_PS.date_rezh = Convert.ToDateTime(record_PS_rezh["date"]);

}

NpgsqlCommand command_trans = new SQLiteCommand(@"SELECT

TRANS.id,

U.u, TRANS.n_trans, TRANS.s

FROM

TRANS LEFT JOIN U ON U.id = TRANS.u_id

WHERE TRANS.ps_id = #"

.Replace("#", new_PS.id.ToString()), conn_зп);

NpgsqlDataReader reader_trans = command_trans.ExecuteReader();

new_PS.trans = new List<trans>();

foreach (DbDataRecord record_trans in reader_trans)

{

trans new_trans = new trans();

new_trans.id = Convert.ToUInt16(record_trans["id"]);

new_trans.N = Convert.ToByte(record_trans["n_trans"]);

new_trans.U = Convert.ToDouble(record_trans["u"]);

new_trans.S = Convert.ToDouble(record_trans["s"]);

new_trans.obmotka = new List<obmotka>();

NpgsqlCommand command_obmotka = new SQLiteCommand(@"SELECT ID, u, k, s

FROM

(SELECT

OBMOTKA.ID, U.u, K_OBMOTKA.k

FROM

OBMOTKA LEFT JOIN U ON U.id = OBMOTKA.u_id

LEFT JOIN K_OBMOTKA ON K_OBMOTKA.id = OBMOTKA.k_id

WHERE OBMOTKA.trans_id = #1) AS OBMOTKA

LEFT JOIN

(SELECT

s, obmotka_id

FROM REZHIM

WHERE n_rezhim_id = #2) AS REZHIM

ON REZHIM.obmotka_id = OBMOTKA.ID"

.Replace("#1", new_trans.id.ToString())

.Replace("#2", new_PS.n_rezh.ToString()), conn_зп);

NpgsqlDataReader reader_obmotka = command_obmotka.ExecuteReader();

foreach (DbDataRecord record_obmotka in reader_obmotka)

{

obmotka new_obmotka = new obmotka();

new_obmotka.id = Convert.ToUInt16(record_obmotka["id"]);

new_obmotka.k = Convert.ToByte(record_obmotka["k"]);

new_obmotka.U = Convert.ToDouble(record_obmotka["u"]);

try

{

new_obmotka.rezh = Convert.ToDouble(record_obmotka["s"]);

}

catch

{

new_obmotka.rezh = 0;

}

new_trans.obmotka.Add(new_obmotka);

}

new_PS.trans.Add(new_trans);

}

new_PS.zajav = new List<zajav>();

NpgsqlCommand command_zajav = new SQLiteCommand(@"SELECT max_u AS u, sum(s)/0.89/1000 AS s

FROM

(SELECT

MAX_U.max_u, Sum(ZAJAV.s) AS s

FROM

SCHEME

LEFT JOIN PS ON SCHEME.child_ps_id = PS.id

LEFT JOIN ZAJAV ON ZAJAV.ps_id = PS.id

LEFT JOIN (SELECT

Max(U.u) AS max_u

FROM

SCHEME

LEFT JOIN PS ON PS.id = SCHEME.child_ps_id

LEFT JOIN TRANS ON TRANS.ps_id = PS.id

LEFT JOIN U ON U.id = TRANS.u_id

WHERE

SCHEME.parent_ps_is = #

GROUP BY

SCHEME.parent_ps_is) AS MAX_U

WHERE

SCHEME.parent_ps_is = # AND

(

ZAJAV.n_zajav_id = 13

OR

ZAJAV.n_zajav_id = 14

)

GROUP BY

SCHEME.parent_ps_is

UNION ALL

SELECT

U.u,

Sum(ZAJAV.s) AS s

FROM

PS

LEFT JOIN ZAJAV ON ZAJAV.ps_id = PS.id

LEFT JOIN U ON U.id = ZAJAV.u_id

WHERE

PS.id = # AND

(

ZAJAV.n_zajav_id = 13

OR

ZAJAV.n_zajav_id = 14

)

GROUP BY

PS.id,

U.u)

GROUP BY u"

.Replace("#", new_PS.id.ToString()), conn_зп);

NpgsqlDataReader reader_zajav = command_zajav.ExecuteReader();

foreach (DbDataRecord record_zajav in reader_zajav)

{

zajav new_zajav = new zajav();

new_zajav.U = Convert.ToDouble(record_zajav["u"]);

new_zajav.S = Convert.ToDouble(record_zajav["s"]);

new_PS.zajav.Add(new_zajav);

}

PS.Add(new_PS);

}

conn_pg.Close();

}

Реализация алгоритма Эдмондса — Карпа:

public void raschet_s_propusk()

{

foreach (PS temp_PS in PS)

temp_PS.rezult.AddRange(raschet_scheme(temp_PS));

}

public void final()

{

foreach (PS temp_PS in PS)

{

foreach (result res in temp_PS.rezult)

{

res.t_rezerv = 10000;

foreach (trans tek_trans in temp_PS.trans)

{

double temp_def = 0;

weighting weighting = new weighting();

foreach (trans temp_trans in temp_PS.trans)

foreach (obmotka temp_obmotka in temp_trans.obmotka)

weighting.add(temp_obmotka.U, temp_obmotka.rezh);

foreach (weight temp_weight in weighting.weight)

if (temp_weight.U == res.U) res.rezh = temp_weight.S;

List<vetv> scheme = create_scheme(temp_PS);

foreach (vetv temp_vetv in scheme)

{

if (temp_vetv.istok == tek_trans.N || temp_vetv.stok == tek_trans.N) temp_vetv.enable = false;

else temp_vetv.enable = true;

}

List<put> m_put = new List<put>();

double min_p = new double();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv });

if (poisk_min_put(m_put, 999, res.U).Count == 0)

continue;

while (weighting.weight.Count > 0)

{

List<double> min_put = poisk_min_put(m_put, 999, weighting.weight[0].U);

if (min_put.Count == 0)

{

if (weighting.weight[0].U == res.U)

{

temp_def += weighting.weight[0].S;

}

weighting.weight.RemoveAt(0);

}

else

{

min_p = 10000;

for (int i = 0; i < min_put.Count - 1; i++)

foreach (put obj in m_put)

if (obj.vetv.istok == min_put[i] && obj.vetv.stok == min_put[i + 1])

{

obj.vhod = true;

if (obj.vetv.ves < min_p) min_p = obj.vetv.ves;

break;

}

if (weighting.weight[0].S > min_p)

weighting.weight[0].S -= min_p;

else

{

if (weighting.weight[0].S == min_p)

weighting.weight.RemoveAt(0);

else

{

min_p = weighting.weight[0].S;

weighting.weight.RemoveAt(0);

}

}

for (int j = 0; j < m_put.Count; j++)

if (m_put[j].vhod == true)

{

m_put[j].vetv.ves -= min_p;

m_put[j].vhod=false;

if (m_put[j].vetv.ves == 0)

{

m_put.RemoveAt(j);

j--;

}

}

}

}

double temp = raschet_s_propusk(scheme, res.U);

if (res.t_rezerv > temp)

{

res.t_rezerv = temp;

}

if (res.t_deficit < temp_def)

res.t_deficit = temp_def;

res.date_rezh = temp_PS.date_rezh;

res.n_rezh = temp_PS.n_rezh;

}

if (res.t_rezerv == 10000)

{

double temp_def = 0;

//res.n_trans = 9;

weighting weighting = new weighting();

foreach (trans temp_trans in temp_PS.trans)

foreach (obmotka temp_obmotka in temp_trans.obmotka)

weighting.add(temp_obmotka.U, temp_obmotka.rezh);

foreach (weight temp_weight in weighting.weight)

if (temp_weight.U == res.U) res.rezh = temp_weight.S;

List<vetv> scheme = create_scheme(temp_PS);

foreach (vetv temp_vetv in scheme)

temp_vetv.enable = true;

List<put> m_put = new List<put>();

double min_p = new double();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv });

while (weighting.weight.Count > 0)

{

List<double> min_put = poisk_min_put(m_put, 999, weighting.weight[0].U);

if (min_put.Count == 0)

{

if (weighting.weight[0].U == res.U)

{

temp_def += weighting.weight[0].S;

}

weighting.weight.RemoveAt(0);

}

else

{

min_p = 10000;

for (int i = 0; i < min_put.Count - 1; i++)

foreach (put obj in m_put)

if (obj.vetv.istok == min_put[i] && obj.vetv.stok == min_put[i + 1])

{

obj.vhod = true;

if (obj.vetv.ves < min_p) min_p = obj.vetv.ves;

break;

}

if (weighting.weight[0].S > min_p)

weighting.weight[0].S -= min_p;

else

{

if (weighting.weight[0].S == min_p)

weighting.weight.RemoveAt(0);

else

{

min_p = weighting.weight[0].S;

weighting.weight.RemoveAt(0);

}

}

for (int j = 0; j < m_put.Count; j++) if (m_put[j].vhod == true)

{

m_put[j].vetv.ves -= min_p;

m_put[j].vhod=false;

if (m_put[j].vetv.ves == 0)

{

m_put.RemoveAt(j);

j--;

}

}

}

}

double temp = raschet_s_propusk(scheme, res.U);

if (res.t_rezerv > temp)

res.t_rezerv = temp;

if (res.t_deficit < temp_def)

res.t_deficit = temp_def;

res.date_rezh = temp_PS.date_rezh;

res.n_rezh = temp_PS.n_rezh;

}

}

}

foreach (PS temp_PS in PS)

{

foreach (result res in temp_PS.rezult)

{

foreach (zajav temp_zajav in temp_PS.zajav)

if (temp_zajav.U == res.U) res.zajav += temp_zajav.S;

res.z_rezerv = 10000;

foreach (trans tek_trans in temp_PS.trans)

{

double temp_def = 0;

weighting weighting = new weighting();

foreach (trans temp_trans in temp_PS.trans)

foreach (obmotka temp_obmotka in temp_trans.obmotka)

weighting.add(temp_obmotka.U, temp_obmotka.rezh);

foreach (zajav temp_zajav in temp_PS.zajav)

weighting.add(temp_zajav.U, temp_zajav.S );

for (int i = 0; i < weighting.weight.Count; i++)

if (weighting.weight[i].S == 0)

{

weighting.weight.RemoveAt(i);

i--;

}

List<vetv> scheme = create_scheme(temp_PS);

foreach (vetv temp_vetv in scheme)

{

if (temp_vetv.istok == tek_trans.N || temp_vetv.stok == tek_trans.N) temp_vetv.enable = false;

else temp_vetv.enable = true;

}

List<put> m_put = new List<put>();

double min_p = new double();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv });

if (poisk_min_put(m_put, 999, res.U).Count == 0)

continue;

while (weighting.weight.Count > 0)

{

List<double> min_put = poisk_min_put(m_put, 999, weighting.weight[0].U);

if (min_put.Count == 0)

{

if (weighting.weight[0].U == res.U)

{

temp_def += weighting.weight[0].S;

}

weighting.weight.RemoveAt(0);

}

else

{

min_p = 10000;

for (int i = 0; i < min_put.Count - 1; i++)

foreach (put obj in m_put)

if (obj.vetv.istok == min_put[i] && obj.vetv.stok == min_put[i + 1])

{

obj.vhod = true;

if (obj.vetv.ves < min_p) min_p = obj.vetv.ves;

break;

}

if (weighting.weight[0].S > min_p)

weighting.weight[0].S -= min_p;

else

{

if (weighting.weight[0].S == min_p)

weighting.weight.RemoveAt(0);

else

{

min_p = weighting.weight[0].S;

weighting.weight.RemoveAt(0);

}

}

for (int j = 0; j < m_put.Count; j++)

if (m_put[j].vhod == true)

{

m_put[j].vetv.ves -= min_p;

m_put[j].vhod=false;

if (m_put[j].vetv.ves == 0)

{

m_put.RemoveAt(j);

j--;

}

}

}

}

double temp = raschet_s_propusk(scheme, res.U);

if (res.z_rezerv > temp)

res.z_rezerv = temp;

if (res.z_deficit < temp_def)

res.z_deficit = temp_def;

}

if (res.z_rezerv == 10000)

{

double temp_def = 0;

//res.n_trans = 9;

weighting weighting = new weighting();

foreach (trans temp_trans in temp_PS.trans)

foreach (obmotka temp_obmotka in temp_trans.obmotka)

weighting.add(temp_obmotka.U, temp_obmotka.rezh);

foreach (zajav temp_zajav in temp_PS.zajav)

weighting.add(temp_zajav.U, temp_zajav.S );

for (int i = 0; i < weighting.weight.Count; i++)

if (weighting.weight[i].S == 0)

{

weighting.weight.RemoveAt(i);

i--;

}

List<vetv> scheme = create_scheme(temp_PS);

foreach (vetv temp_vetv in scheme)

temp_vetv.enable = true;

List<put> m_put = new List<put>();

double min_p = new double();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv });

while (weighting.weight.Count > 0)

{

List<double> min_put = poisk_min_put(m_put, 999, weighting.weight[0].U);

if (min_put.Count == 0)

{

if (weighting.weight[0].U == res.U)

{

temp_def += weighting.weight[0].S;

}

weighting.weight.RemoveAt(0);

}

else

{

min_p = 10000;

for (int i = 0; i < min_put.Count - 1; i++)

foreach (put obj in m_put)

if (obj.vetv.istok == min_put[i] && obj.vetv.stok == min_put[i + 1])

{

obj.vhod = true;

if (obj.vetv.ves < min_p) min_p = obj.vetv.ves;

break;

}

if (weighting.weight[0].S > min_p)

weighting.weight[0].S -= min_p;

else

{

if (weighting.weight[0].S == min_p)

weighting.weight.RemoveAt(0);

else

{

min_p = weighting.weight[0].S;

weighting.weight.RemoveAt(0);

}

}

for (int j = 0; j < m_put.Count; j++) if (m_put[j].vhod == true)

{

m_put[j].vetv.ves -= min_p;

m_put[j].vhod=false;

if (m_put[j].vetv.ves == 0)

{

m_put.RemoveAt(j);

j--;

}

}

}

}

double temp = raschet_s_propusk(scheme, res.U);

if (res.z_rezerv > temp)

res.z_rezerv = temp;

if (res.z_deficit < temp_def)

res.z_deficit = temp_def;

}

}

}

foreach (PS temp_PS_child in PS)

foreach (int temp in temp_PS_child.parent_PS)

foreach (PS temp_PS_parent in PS)

if (temp_PS_parent.id == temp)

foreach (result parent_res in temp_PS_parent.rezult)

if (parent_res.U == 35)

foreach (result child_res in temp_PS_child.rezult)

{

}

public List<vetv> create_scheme(PS temp_PS)

{

List<vetv> schema_PS = new List<vetv>();

double max_U = 0;

foreach (trans temp_trans in temp_PS.trans)

{

schema_PS.AddRange(ves_trans(temp_trans));

if (temp_trans.U > max_U) max_U = temp_trans.U;

}

schema_PS.Add(create_vetv(999, max_U, 999, 1));

return schema_PS;

}

public vetv create_vetv(double new_istok, double new_stok, double new_ves, byte new_type)

{

vetv new_vetv = new vetv();

new_vetv.istok = new_istok;

new_vetv.stok = new_stok;

new_vetv.ves = new_ves;

new_vetv.type = new_type;

new_vetv.enable = true;

return new_vetv;

}

public List<vetv> ves_trans(trans trans)

{

List<vetv> temp_sc_trans = new List<vetv>();

temp_sc_trans.Add(create_vetv(trans.U, trans.N, 1.05 * trans.S, 2));

foreach (obmotka obmotka in trans.obmotka)

temp_sc_trans.Add(create_vetv(trans.N, obmotka.U, 1.05 * obmotka.k / 100 * trans.S, 3));

return temp_sc_trans;

}

public List<result> raschet_scheme(PS PS)

{

List<result> rezult_PS = new List<result>();

List<vetv> scheme = create_scheme(PS);

{

List<double> U_list = new List<double>();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.type == 3)

{

bool b = true;

foreach (double U in U_list)

if (temp_vetv.stok == U) b = false;

if (b == true) U_list.Add(temp_vetv.stok);

}

U_list.Sort();

U_list.Reverse();

foreach (double temp_U in U_list)

rezult_PS.Add(new result { U = temp_U });

}

for (int count = 0; count < rezult_PS.Count; count++)

{

rezult_PS[count].S_propusk = 10000;

foreach (trans temp_trans in PS.trans)

{

scheme = create_scheme(PS);

foreach (vetv temp_vetv in scheme)

{

if (temp_vetv.istok == temp_trans.N || temp_vetv.stok == temp_trans.N) temp_vetv.enable = false;

else temp_vetv.enable = true;

}

List<put> m_put = new List<put>();

foreach (vetv temp_vetv in scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv });

double s_propusk = raschet_s_propusk(scheme, rezult_PS[count].U);

if (s_propusk == 0)

{

scheme = create_scheme(PS);

rezult_PS[count].n_trans = 9;

rezult_PS[count].S_propusk = raschet_s_propusk(scheme, rezult_PS[count].U);

break;

}

else

if (rezult_PS[count].S_propusk > s_propusk)

{

rezult_PS[count].S_propusk = s_propusk;

rezult_PS[count].n_trans = temp_trans.N;

}

scheme = create_scheme(PS);

}

}

return rezult_PS;

}

public double raschet_s_propusk(List<vetv> r_scheme, double stok)

{

double istok = 999;

List<put> m_put = new List<put>();

double max_p_t = 0;

foreach (vetv temp_vetv in r_scheme)

if (temp_vetv.enable == true)

m_put.Add(new put { vetv = temp_vetv, vhod = false });

bool b = true;

while (b)

{

List<double> min_put = poisk_min_put(m_put, istok, stok);

if (min_put.Count == 0)

{

b = false;

return max_p_t;

}

double min_p = 10000;

foreach (put obj in m_put)

obj.vhod = false;

for (int i = 0; i < min_put.Count - 1; i++)

foreach (put obj in m_put)

if (obj.vetv.istok == min_put[i] && obj.vetv.stok == min_put[i + 1])

{

obj.vhod = true;

if (obj.vetv.ves < min_p) min_p = obj.vetv.ves;

break;

}

max_p_t += min_p;

for (int j = 0; j < m_put.Count; j++)

if (m_put[j].vhod == true)

{

m_put[j].vetv.ves -= min_p;

if (m_put[j].vetv.ves == 0)

{

m_put.RemoveAt(j);

j--;

}

}

}

return max_p_t;

}

public List<double> poisk_min_put(List<put> m_put, double istok, double stok)

{

List<vetv> scheme = new List<vetv>();

foreach (put temp_put in m_put)

scheme.Add(temp_put.vetv);

int count = 0;

Queue<double> d_prov = new Queue<double>();

List<double> prov = new List<double>();

double t_prov = new double();

List<put> graph = new List<put>();

bool i_prov = false;

foreach (vetv temp_vetv in scheme)

{

graph.Add(new put

{

vetv = temp_vetv,

vhod = false

});

}

d_prov.Enqueue(999);

while (d_prov.Count > 0)

{

count = 0;

t_prov = d_prov.Dequeue();

foreach (put obj in graph)

{

if (obj.vetv.istok == t_prov)

{

bool i = true;

if (obj.vetv.stok == stok)

{

i_prov = true;

break;

}

foreach (int pos in prov)

if (pos == obj.vetv.stok) i = false;

if (i == true)

{

d_prov.Enqueue(obj.vetv.stok);

prov.Add(obj.vetv.stok);

graph[count].vhod = true;

}

}

count++;

}

if (i_prov == true) break;

}

if (i_prov == false) return new List<double>();

List<double> min_put = new List<double>();

min_put.Add(stok);

min_put.Add(graph[count].vetv.istok);

bool i_p = false;

while (i_p == false)

{

foreach (put obj in graph)

{

if (obj.vetv.stok == min_put[min_put.Count - 1] && obj.vhod == true)

{

min_put.Add(obj.vetv.istok);

if (obj.vetv.istok == istok) i_p = true;

}

}

}

min_put.Reverse();

return min_put;

}

Соберем все части программы в главном модуле:

using System;

using System.Drawing;

using System.Windows.Forms;

using OSPP_DB.Report;

namespace Power_Reserve

{

public partial class MainForm : Form

{

public MainForm()

{

InitializeComponent();

}

void ВыгрузитьРезервToolStripMenuItem1Click(object sender, EventArgs e)

{

BASE BASE = new BASE();

BASE.Load_data();

BASE.raschet_s_propusk();

BASE.final();

OSPP_DB.Logic.RezervSait Excel = new OSPP_DB.Logic.RezervSait();

Excel.Dispose();

}

}}

На рисунке 3 изображен результат работы программы:

Рисунок 3 – Результат работы программы