и до Кроку 5.
Крок 3. Видалити з поточного безлічі векторів P (Y) вектор, так як він не є Парето-оптимальним. Потім перейти до Кроку 4.
Крок 4. Перевірити виконання нерівності j
Крок 5. Перевірити справедливість нерівності. У тому випадку, коли воно є істинним, перейти до Кроку 6. В іншому випадку - повернутися до Кроку 4.
Крок 6. Видалити з поточного безлічі векторів P (Y) вектор і перейти до Кроку 7.
Крок 7. Перевірити виконання нерівності i
Спочатку реалізуємо допоміжні методи:
// поелементне порівняння вектора v1 з вектором v2
private void Compare (List v1, List v2)
{
more = 0;
less = 0;
equal = 0;
for (int i = 0; i
{
if (v1 [i]> v2 [i])
more + +;
else if (v1 [i]
else equal + +;
}
}
// повертає істину якщо v1> = V2
private bool MoreOrEqual ()
{
if (more> = 0 && less == 0)
return true;
else return false;
}
Далі напишемо рекурсивну процедуру видалення домініруемих рішень, спираючись на алгоритм, описаний вище:
// y - список рішень
public void DeleteDominated (List > y)
{
foreach (List yi in y)
{
foreach (List gj in y)
{
if (! Equals (gj, yi))
{
Compare (gj, yi);
if (MoreOrEqual ())
{
y.Remove (yi);
DeleteDominated (y);
return;
}
Compare (yi, gj);
if (MoreOrEqual ())
{
y.Remove (gj);
DeleteDominated (y);
return;
}
}
}
}
}
І нарешті отримуємо метод, возвращающий список Парето-оптимальних рішень:
public List > GetParetoList (List > y)
{
DeleteDominated (y);
return y;
}
3.3 Лістинг програмного коду
public class Graph
{
public ZedGraphControl DisplayGrahpics (Panel panel, int [] x, int [] y, int [] pareto_x, int [] pareto_y)
{
var control = new ZedGraphControl ();
control.Width = panel.Width;
control.Height = panel.Height;
GraphPane myPane = control.GraphPane;
// Set the title and axis labels
myPane.Title.IsVisible = false;
// myPane.Title.Text = title;
myPane.XAxis.Title.IsVisible = false;
myPane.YAxis.Title.IsVisible = false;
myPane.YAxis.Scale.MaxAuto = true;
myPane.Legend.IsVisible = false;
PointPairList list1 = new PointPairList ();
for (int i = 0; i
list1.Add (x [i], y [i]);
LineItem curve1 = myPane.AddCurve ("label", list1, Color.Black, SymbolType.Circle);
curve1.Symbol.Fill = new Fill (Color.Black);
curve1.Symbol.Size = 7;
curve1.Line.IsVisible = false;
PointPairList list2 = new PointPairList ();
for (int i = 0; i
list2.Add (pareto_x [i], pareto_y [i]);
LineItem curve2 = myPane.AddCurve ("label", list2, Color.Red, SymbolType.Circle);
curve2.Symbol.Fill = new Fill (Color.Red);
curve2.Symbol.Size = 7;
curve2.Line.IsVisible = false;
// Fill the axis background with a color gradient
myPane.Chart.Fill = new Fill (Color.White, Color.FromArgb (255, 255, 166), 45.0F);
control.AxisChange ();
// expand the range of the Y axis slightly to accommodate the labels
myPane.YAxis.Scale.Max + = myPane.YAxis.Scale.MajorStep;
return control;
}
}
public class File
{
private StreamWriter writer;
private StreamReader reader;
public void WriteData (List > y, string fileName)
{
writer = new StreamWriter (new FileStream (fileName, FileMode.Create, FileAccess.Write));
writer.WriteLine (y.Count.ToString () + "" + y [0]. Count.ToString ());
for (int i = 0; i
{
for (int j = 0; j
{
writer.Write (y [i] [j]. ToString () + "");
}
writer.WriteLine ();
}
writer.Close ();
}
public List > ReadData (string fileName)
{
List > y = new List > ();
int n, m;
reader = new StreamReader (new FileStream (fileName, FileMode.Open, FileAccess.Read));
while (! reader.EndOfStream)
{
char [] separator = {''};
string [] vals = reader.ReadLine (). Split (separator, StringSplitOptions.RemoveEmptyEntries);
n = Convert.ToInt32 (vals [0]);
m = Convert.ToInt32 (vals [1]);
for (int i = 0; i
{
List list = new List ();
vals = reader.ReadLine (). Split (separator, StringSplitOptions.RemoveEmptyEntries);
for (int j = 0; j
{
list.Add (Convert.ToInt32 (vals [j]));
}
y.Add (list);
}
}
reader.Close ();
return y;
}
}
public partial class SolutionsView: Form
{
public SolutionsView (List > list)
{
InitializeComponent ();
int n = list [0]. Count;
int m = list.Count;
dataGridView2.ColumnCount = n;
dataGridView2.RowCount = m;
for (int i = 0; i
{
for (int j = 0; j
dataGridView2 [j, i]. Value = list [i] [j];
}
}
}
public partial class GraphView: Form
{
public GraphView ()
{
InitializeComponent ();
}
public Panel GetPanel ()
{
return panel1;
}
}
public partial class MainView: Form
{
private int n, m, krit, comp, var;
private List > y;
private List paretoSet;
private List paretoSet2;
private Pareto pareto;
public MainView ()
{
InitializeComponent ();
InitComboboxes (2, 20, 1);
y = new List > ();
paretoSet = new List ();
dataGridView1.AllowUserToAddRows = false;
dgA.AllowUserToAddRows = false;
dgK.AllowUserToAddRows = false;
dgX.AllowUserToAddRows = false;
}
private void InitComboboxes (int minimum, int maximum, int step)
{
for (int i = minimum; i
{
comboBox1.Items.Add (i);
comboBox2.Items.Add (i);
comboBox3.Items.Add (i);
comboBox4.Items.Add (i);
comboBox5.Items.Add (i);
}
}
private void button1_Click (object sender, EventArgs e)
{
n = Convert.ToInt32 (comboBox1.Text);
m = Convert.ToInt32 (comboBox2.Text);
dataGridView1.ColumnCount = n;
dataGridView1.RowCount = m;
for (int i = 0; i
dataGridView1.Columns [i]. Name = "k" + (i +1). ToString ();
}
private void GetValuesFromGrid ()
{
y = new List > ();
if (tabControl1.SelectedIndex == 0)
{
for (int i = 0; i
{
var list = new List ();
<...