
- •Реферат
- •Введение
- •1 Исследование предметной области
- •1.1 Описание предметной области
- •1.2 Описание входных и выходных данных
- •1.3 Перечень ограничений к доступу данных
- •2 Проектирование базы данных
- •2.1 Построение инфологической и даталогической моделей
- •2.1.2 Описание связей и атрибутов
- •2.2 Расчетная модель
- •3 Практическая реализация базы данных и программы
- •3.1 Выбор инструментария
- •3.1.1 Выбор системы управления базами данных
- •3.1.2. Выбор языка и среды программирования
- •3.2 Создание таблиц
- •3.3 Программная реализация решения задачи
- •Заключение
- •Список использованных источников и литературы
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 – Результат работы программы