Курсач

This commit is contained in:
Pipiaka 2024-05-24 21:56:27 +04:00
parent 839d4f0684
commit e12182dbf3
30 changed files with 118570 additions and 0 deletions

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34024.191
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BackpackGreedyAlgorithm", "BackpackGreedyAlgorithm\BackpackGreedyAlgorithm.csproj", "{87938294-DFE4-40BA-9605-54E7D8253905}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{87938294-DFE4-40BA-9605-54E7D8253905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{87938294-DFE4-40BA-9605-54E7D8253905}.Debug|Any CPU.Build.0 = Debug|Any CPU
{87938294-DFE4-40BA-9605-54E7D8253905}.Release|Any CPU.ActiveCfg = Release|Any CPU
{87938294-DFE4-40BA-9605-54E7D8253905}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0D128F43-FAAF-4727-9A1A-21C66C8B968A}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,27 @@

namespace BackpackGreedyAlgorithm.Algorithm;
public class Datas
{
/// <summary>
/// Список драгоценностей
/// </summary>
public List<Gem> gems;
/// <summary>
/// Максимальный вес рюкзака
/// </summary>
public int maxWeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="maxWeight">Максимальный вес рюкзака</param>
/// <param name="gems">Список драгоценностей</param>
public Datas(int maxWeight, List<Gem> gems)
{
this.maxWeight = maxWeight;
this.gems = gems;
}
}

View File

@ -0,0 +1,47 @@
namespace BackpackGreedyAlgorithm.Algorithm;
[Serializable]
public class Gem
{
/// <summary>
/// Изображение драгоценности
/// </summary>
public Image image;
/// <summary>
/// Вес драгоценности
/// </summary>
public int weight;
/// <summary>
/// Цена драгоценности
/// </summary>
public int value;
/// <summary>
/// Индекс элемента
/// </summary>
public int id;
/// <summary>
/// Отношение цены и веса
/// </summary>
public double ratio;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="image">Изображение драгоценности</param>
/// <param name="weight">Вес драгоценности</param>
/// <param name="value">Цена драгоценности</param>
/// <param name="id">Индекс</param>
public Gem(Image image, int weight, int value, int id)
{
this.image = image;
this.weight = weight;
this.value = value;
this.id = id;
ratio = value / weight;
ratio = Math.Round(ratio, 3);
}
}

View File

@ -0,0 +1,111 @@

using BackpackGreedyAlgorithm.Storages;
namespace BackpackGreedyAlgorithm.Algorithm;
public class GreedyAlgorithm
{
/// <summary>
/// Текущий статус
/// </summary>
public Status? status;
/// <summary>
/// Список драгоценностей
/// </summary>
private List<Gem> _gems;
/// <summary>
/// Максимальный вес
/// </summary>
private int _maxWeight;
/// <summary>
/// Текущая стоимость драг. в рюкзаке
/// </summary>
private int _value;
/// <summary>
/// Текущий вес драг. в рюкзаке
/// </summary>
private int _weight;
/// <summary>
/// Количество драг. на полке
/// </summary>
private int _countGems;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="maxWeight">Максимальный вес</param>
/// <param name="gems">Список драгоценностей</param>
public GreedyAlgorithm(int maxWeight, List<Gem> gems)
{
_maxWeight = maxWeight;
_gems = gems.OrderBy(o => o.ratio).ToList();
_value = 0;
_weight = 0;
_countGems = gems.Count;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="data">Класс-параметр</param>
public GreedyAlgorithm(Datas? data)
{
if (data != null)
{
_maxWeight = data.maxWeight;
_gems = data.gems.OrderBy(o => o.ratio).ToList();
_countGems = _gems.Count;
}
_value = 0;
_weight = 0;
}
/// <summary>
/// Выполнить шаг алгоритма
/// </summary>
public void PutGem()
{
if (_countGems <= 0) return;
Gem gem = _gems[_countGems - 1];
if (_weight + gem.weight > _maxWeight)
{
return;
}
_weight += gem.weight;
_value += gem.value;
_gems.RemoveAt(_countGems - 1);
_countGems--;
}
/// <summary>
/// Установить новый статус
/// </summary>
public void SaveStatus()
{
status = new Status(_maxWeight, _weight, _value, new List<Gem>(_gems));
}
/// <summary>
/// Получить предыдущий статус
/// </summary>
/// <param name="status">Устанавливаемый статус</param>
public void ReturnToStatus(Status? status)
{
if (status == null) return;
this.status = status;
_maxWeight = status.maxWeight;
_weight = status.weight;
_value = status.value;
_gems = new List<Gem>(status.gems);
_countGems = _gems.Count();
}
}

View File

@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Saves\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,57 @@

using BackpackGreedyAlgorithm.Algorithm;
using BackpackGreedyAlgorithm.Storages;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BackpackGreedyAlgorithm.Communications;
public class Manager
{
/// <summary>
/// Хранидище
/// </summary>
public Storage storage = new Storage();
/// <summary>
/// Реализатор
/// </summary>
GreedyAlgorithm backpack;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="data">Параметры для работы алгоритма</param>
public Manager(Datas? data)
{
backpack = new GreedyAlgorithm(data);
if (data != null)
{
backpack.SaveStatus();
storage.AddStatus(backpack.status);
}
}
/// <summary>
/// Выполнение шага и запись шага в хранилище
/// </summary>
/// <returns>Хранилище с результатом шага</returns>
public Storage MakeStap()
{
backpack.PutGem();
backpack.SaveStatus();
storage.AddStatus(backpack.status);
return storage;
}
/// <summary>
/// Задание статуса
/// </summary>
/// <param name="status">Статус</param>
/// <param name="storage">Хранилище</param>
public void SetStatusAlgoritm(Status status, Storage storage)
{
backpack.ReturnToStatus(status);
this.storage = storage;
}
}

View File

@ -0,0 +1,121 @@
using BackpackGreedyAlgorithm.Algorithm;
using System.Text.RegularExpressions;
namespace BackpackGreedyAlgorithm.Communications;
public class Visualizer
{
/// <summary>
/// Список панелей драг.
/// </summary>
private List<Panel> _listGemsInfo;
/// <summary>
/// Вес рюкзака
/// </summary>
private string _weightBackpack;
/// <summary>
///
/// </summary>
private Label _valueL;
/// <summary>
///
/// </summary>
private Label _weightL;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="listGems">Список панелей драг.</param>
/// <param name="maxWeight">Максимальный вес рюкзака</param>
/// <param name="weightL">Label веса</param>
/// <param name="valueL">Label ценности</param>
public Visualizer(List<Panel> listGems, int maxWeight, Label valueL, Label weightL)
{
_listGemsInfo = listGems;
_weightBackpack = "\\" + maxWeight;
_valueL = valueL;
_weightL = weightL;
}
/// <summary>
/// Обновление формы
/// </summary>
/// <param name="gems">Список драг.</param>
/// <param name="weight">Текущий вес</param>
/// <param name="value">Текущее ценность</param>
public void Update(List<Gem> gems, int weight, int value)
{
_weightL.Text = weight + _weightBackpack;
_valueL.Text = value.ToString();
var regex = new Regex("[0-9]");
for (int i = 0; i < _listGemsInfo.Count; i++)
{
Gem? gem = HasGemInList(i, gems);
if (gem != null)
{
foreach (Control info in _listGemsInfo[i].Controls)
{
String type = regex.Replace(info.Name, String.Empty);
switch (type)
{
case "pictureBoxElem":
((PictureBox)info).BackgroundImage = gem.image;
break;
case "panelValue":
GetLabel((Panel)info, "labelValue").Text = gem.value.ToString();
break;
case "panelWeight":
GetLabel((Panel)info, "labelWeight").Text = gem.weight.ToString();
break;
default:
break;
}
}
_listGemsInfo[i].Visible = true;
}
else _listGemsInfo[i].Visible = false;
}
}
/// <summary>
/// Метод ищущий в Panel Label
/// </summary>
/// <param name="panel"></param>
/// <param name="name"></param>
/// <returns>Label</returns>
private Label? GetLabel(Panel panel, string name)
{
foreach(Control label in panel.Controls)
{
if (label.Name.Contains(name))
{
return (Label)label;
}
}
return null;
}
/// <summary>
/// Проверяет есть ли драг. с указанным индексом в списке драг-ей
/// </summary>
/// <param name="ind">Индекс</param>
/// <param name="gems">Список драгоценностей</param>
/// <returns>true - да; false - нет</returns>
private Gem? HasGemInList(int ind, List<Gem> gems)
{
foreach (Gem ge in gems)
{
if (ge.id == ind)
{
return ge;
}
}
return null;
}
}

View File

@ -0,0 +1,987 @@
namespace BackpackGreedyAlgorithm
{
partial class InformationForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InformationForm));
groupBoxAboutAlgoritm = new GroupBox();
groupBox3 = new GroupBox();
label12 = new Label();
groupBox1 = new GroupBox();
label10 = new Label();
label11 = new Label();
label3 = new Label();
label9 = new Label();
label7 = new Label();
label8 = new Label();
label5 = new Label();
label6 = new Label();
label4 = new Label();
label2 = new Label();
label1 = new Label();
groupBoxInputWindow = new GroupBox();
label20 = new Label();
label23 = new Label();
label22 = new Label();
label21 = new Label();
label19 = new Label();
label18 = new Label();
label16 = new Label();
groupBoxElements = new GroupBox();
panelElement0 = new Panel();
numericUpDownWeight0 = new NumericUpDown();
label33 = new Label();
numericUpDownValue0 = new NumericUpDown();
label34 = new Label();
pictureBoxElement0 = new PictureBox();
groupBoxIcons = new GroupBox();
panelDimond = new Panel();
groupBox4 = new GroupBox();
pictureBoxBackpack = new PictureBox();
numericUpDownMaxWeight = new NumericUpDown();
labelMaxWeight = new Label();
numericUpDownCount = new NumericUpDown();
labelCount = new Label();
buttonCreate = new Button();
groupBoxInfo = new GroupBox();
label17 = new Label();
buttonPrev = new Button();
buttonNext = new Button();
groupBox2 = new GroupBox();
labelInputWind = new Label();
labelMainWind = new Label();
labelAboutAlgoritm = new Label();
labelInfo = new Label();
groupBoxMainWindow = new GroupBox();
label30 = new Label();
buttonData = new Button();
label29 = new Label();
label28 = new Label();
label27 = new Label();
label26 = new Label();
label25 = new Label();
panel7 = new Panel();
label24 = new Label();
pictureBox1 = new PictureBox();
groupBoxTools = new GroupBox();
buttonStart = new Button();
buttonStep = new Button();
panelElem = new Panel();
panelWeight0 = new Panel();
pictureBoxElem0 = new PictureBox();
panelValue0 = new Panel();
panel8 = new Panel();
label13 = new Label();
label14 = new Label();
groupBoxAboutAlgoritm.SuspendLayout();
groupBox3.SuspendLayout();
groupBox1.SuspendLayout();
groupBoxInputWindow.SuspendLayout();
groupBoxElements.SuspendLayout();
panelElement0.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight0).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownValue0).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBoxElement0).BeginInit();
groupBoxIcons.SuspendLayout();
groupBox4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxBackpack).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownMaxWeight).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCount).BeginInit();
groupBoxInfo.SuspendLayout();
groupBox2.SuspendLayout();
groupBoxMainWindow.SuspendLayout();
panel7.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
groupBoxTools.SuspendLayout();
panelElem.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxElem0).BeginInit();
panel8.SuspendLayout();
SuspendLayout();
//
// groupBoxAboutAlgoritm
//
groupBoxAboutAlgoritm.Controls.Add(groupBox3);
groupBoxAboutAlgoritm.Controls.Add(groupBox1);
groupBoxAboutAlgoritm.Controls.Add(label7);
groupBoxAboutAlgoritm.Controls.Add(label8);
groupBoxAboutAlgoritm.Controls.Add(label5);
groupBoxAboutAlgoritm.Controls.Add(label6);
groupBoxAboutAlgoritm.Controls.Add(label4);
groupBoxAboutAlgoritm.Controls.Add(label2);
groupBoxAboutAlgoritm.Controls.Add(label1);
groupBoxAboutAlgoritm.Location = new Point(0, 0);
groupBoxAboutAlgoritm.Name = "groupBoxAboutAlgoritm";
groupBoxAboutAlgoritm.Size = new Size(837, 431);
groupBoxAboutAlgoritm.TabIndex = 1;
groupBoxAboutAlgoritm.TabStop = false;
groupBoxAboutAlgoritm.Text = "О алгаритме";
groupBoxAboutAlgoritm.Visible = false;
//
// groupBox3
//
groupBox3.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
groupBox3.BackColor = SystemColors.ActiveBorder;
groupBox3.Controls.Add(label12);
groupBox3.Location = new Point(312, 103);
groupBox3.Name = "groupBox3";
groupBox3.Size = new Size(300, 111);
groupBox3.TabIndex = 12;
groupBox3.TabStop = false;
groupBox3.Text = "Output";
//
// label12
//
label12.AutoSize = true;
label12.Location = new Point(0, 23);
label12.Name = "label12";
label12.Size = new Size(235, 20);
label12.TabIndex = 0;
label12.Text = "totalValue - собранная ценность";
//
// groupBox1
//
groupBox1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
groupBox1.BackColor = SystemColors.ActiveBorder;
groupBox1.Controls.Add(label10);
groupBox1.Controls.Add(label11);
groupBox1.Controls.Add(label3);
groupBox1.Controls.Add(label9);
groupBox1.Location = new Point(6, 103);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(300, 111);
groupBox1.TabIndex = 11;
groupBox1.TabStop = false;
groupBox1.Text = "Input";
//
// label10
//
label10.AutoSize = true;
label10.Location = new Point(6, 63);
label10.MaximumSize = new Size(480, 0);
label10.Name = "label10";
label10.Size = new Size(214, 20);
label10.TabIndex = 9;
label10.Text = "waight[i] - вес i-ого предмета";
//
// label11
//
label11.AutoSize = true;
label11.Location = new Point(6, 83);
label11.MaximumSize = new Size(480, 0);
label11.Name = "label11";
label11.Size = new Size(215, 20);
label11.TabIndex = 10;
label11.Text = "value[i] - цена i-ого предмета";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(6, 23);
label3.MaximumSize = new Size(480, 0);
label3.Name = "label3";
label3.Size = new Size(227, 20);
label3.TabIndex = 3;
label3.Text = "maxWaight - Ограничение веса";
//
// label9
//
label9.AutoSize = true;
label9.Location = new Point(6, 43);
label9.MaximumSize = new Size(480, 0);
label9.Name = "label9";
label9.Size = new Size(217, 20);
label9.TabIndex = 8;
label9.Text = "count - количество элементов";
//
// label7
//
label7.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label7.AutoSize = true;
label7.Location = new Point(6, 297);
label7.MaximumSize = new Size(800, 0);
label7.Name = "label7";
label7.Size = new Size(779, 80);
label7.TabIndex = 7;
label7.Text = resources.GetString("label7.Text");
//
// label8
//
label8.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label8.AutoSize = true;
label8.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label8.Location = new Point(6, 277);
label8.MaximumSize = new Size(800, 0);
label8.Name = "label8";
label8.Size = new Size(173, 20);
label8.TabIndex = 6;
label8.Text = "Недостаток алгоритма";
//
// label5
//
label5.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label5.AutoSize = true;
label5.Location = new Point(6, 237);
label5.MaximumSize = new Size(800, 0);
label5.Name = "label5";
label5.Size = new Size(798, 40);
label5.TabIndex = 5;
label5.Text = "Необходимо отсортировать вещи по их удельной ценности (то есть отношению ценности предмета к его весу), и поместить в рюкзак предметы с наибольшей удельной ценностью";
//
// label6
//
label6.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label6.AutoSize = true;
label6.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label6.Location = new Point(6, 217);
label6.MaximumSize = new Size(800, 0);
label6.Name = "label6";
label6.Size = new Size(148, 20);
label6.TabIndex = 4;
label6.Text = "Жадный алгоритм:";
//
// label4
//
label4.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label4.AutoSize = true;
label4.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label4.Location = new Point(6, 82);
label4.MaximumSize = new Size(800, 0);
label4.Name = "label4";
label4.Size = new Size(71, 20);
label4.TabIndex = 2;
label4.Text = "Данные:";
//
// label2
//
label2.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label2.AutoSize = true;
label2.Location = new Point(6, 42);
label2.MaximumSize = new Size(800, 0);
label2.Name = "label2";
label2.Size = new Size(782, 40);
label2.TabIndex = 1;
label2.Text = "Из заданного множества предметов со свойствами «стоимость» и «вес» требуется отобрать подмножество с максимальной полной стоимостью, соблюдая при этом ограничение на суммарный вес.";
//
// label1
//
label1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label1.Location = new Point(6, 22);
label1.MaximumSize = new Size(800, 0);
label1.Name = "label1";
label1.Size = new Size(141, 20);
label1.TabIndex = 0;
label1.Text = "Задача о рюкзаке:";
//
// groupBoxInputWindow
//
groupBoxInputWindow.Controls.Add(label20);
groupBoxInputWindow.Controls.Add(label23);
groupBoxInputWindow.Controls.Add(label22);
groupBoxInputWindow.Controls.Add(label21);
groupBoxInputWindow.Controls.Add(label19);
groupBoxInputWindow.Controls.Add(label18);
groupBoxInputWindow.Controls.Add(label16);
groupBoxInputWindow.Controls.Add(groupBoxElements);
groupBoxInputWindow.Controls.Add(groupBoxIcons);
groupBoxInputWindow.Controls.Add(groupBox4);
groupBoxInputWindow.Location = new Point(0, 0);
groupBoxInputWindow.Name = "groupBoxInputWindow";
groupBoxInputWindow.Size = new Size(837, 431);
groupBoxInputWindow.TabIndex = 14;
groupBoxInputWindow.TabStop = false;
groupBoxInputWindow.Text = "Об окне вводы входных данных";
groupBoxInputWindow.Visible = false;
//
// label20
//
label20.AutoSize = true;
label20.Location = new Point(459, 326);
label20.Name = "label20";
label20.Size = new Size(335, 60);
label20.TabIndex = 24;
label20.Text = "Коробка с иконками для предметов. Возьмите\r\nкартинку и перетащите их к предмету. Если не\r\nуказать иконку она выберется рандомно";
//
// label23
//
label23.AutoSize = true;
label23.Location = new Point(14, 390);
label23.Name = "label23";
label23.Size = new Size(134, 40);
label23.TabIndex = 23;
label23.Text = " |\r\nрамка для иконки";
//
// label22
//
label22.AutoSize = true;
label22.Location = new Point(191, 362);
label22.Name = "label22";
label22.Size = new Size(154, 20);
label22.TabIndex = 22;
label22.Text = "- вес этого предмета";
//
// label21
//
label21.AutoSize = true;
label21.Location = new Point(191, 325);
label21.Name = "label21";
label21.Size = new Size(165, 20);
label21.TabIndex = 21;
label21.Text = "- цена этого предмета";
//
// label19
//
label19.AutoSize = true;
label19.Location = new Point(152, 120);
label19.Name = "label19";
label19.Size = new Size(574, 20);
label19.TabIndex = 19;
label19.Text = "- Здесь вы ограничиваете вес, который можно положить в рюкзак (от 20 до 100)";
//
// label18
//
label18.AutoSize = true;
label18.Location = new Point(152, 87);
label18.Name = "label18";
label18.Size = new Size(466, 20);
label18.TabIndex = 18;
label18.Text = "- Это кнопка, которая создает элементы в коробке с Предметами";
//
// label16
//
label16.AutoSize = true;
label16.Location = new Point(152, 52);
label16.Name = "label16";
label16.Size = new Size(389, 20);
label16.TabIndex = 17;
label16.Text = "- Здесь вы указываете количестов элеметов (от 1 до 9)";
//
// groupBoxElements
//
groupBoxElements.Controls.Add(panelElement0);
groupBoxElements.Location = new Point(6, 294);
groupBoxElements.Name = "groupBoxElements";
groupBoxElements.Size = new Size(196, 100);
groupBoxElements.TabIndex = 16;
groupBoxElements.TabStop = false;
groupBoxElements.Text = "Предметы";
//
// panelElement0
//
panelElement0.AllowDrop = true;
panelElement0.BackgroundImageLayout = ImageLayout.Zoom;
panelElement0.Controls.Add(numericUpDownWeight0);
panelElement0.Controls.Add(label33);
panelElement0.Controls.Add(numericUpDownValue0);
panelElement0.Controls.Add(label34);
panelElement0.Controls.Add(pictureBoxElement0);
panelElement0.Location = new Point(6, 26);
panelElement0.Name = "panelElement0";
panelElement0.Size = new Size(182, 70);
panelElement0.TabIndex = 0;
//
// numericUpDownWeight0
//
numericUpDownWeight0.Location = new Point(124, 40);
numericUpDownWeight0.Minimum = new decimal(new int[] { 20, 0, 0, 0 });
numericUpDownWeight0.Name = "numericUpDownWeight0";
numericUpDownWeight0.Size = new Size(52, 27);
numericUpDownWeight0.TabIndex = 4;
numericUpDownWeight0.Value = new decimal(new int[] { 20, 0, 0, 0 });
//
// label33
//
label33.AutoSize = true;
label33.Location = new Point(73, 42);
label33.Name = "label33";
label33.Size = new Size(33, 20);
label33.TabIndex = 3;
label33.Text = "Вес";
//
// numericUpDownValue0
//
numericUpDownValue0.Location = new Point(124, 3);
numericUpDownValue0.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownValue0.Name = "numericUpDownValue0";
numericUpDownValue0.Size = new Size(52, 27);
numericUpDownValue0.TabIndex = 2;
numericUpDownValue0.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// label34
//
label34.AutoSize = true;
label34.Location = new Point(73, 5);
label34.Name = "label34";
label34.Size = new Size(45, 20);
label34.TabIndex = 1;
label34.Text = "Цена";
//
// pictureBoxElement0
//
pictureBoxElement0.BackgroundImageLayout = ImageLayout.Zoom;
pictureBoxElement0.BorderStyle = BorderStyle.FixedSingle;
pictureBoxElement0.Location = new Point(3, 3);
pictureBoxElement0.Name = "pictureBoxElement0";
pictureBoxElement0.Size = new Size(64, 64);
pictureBoxElement0.TabIndex = 0;
pictureBoxElement0.TabStop = false;
//
// groupBoxIcons
//
groupBoxIcons.Controls.Add(panelDimond);
groupBoxIcons.Location = new Point(374, 297);
groupBoxIcons.Name = "groupBoxIcons";
groupBoxIcons.Size = new Size(83, 105);
groupBoxIcons.TabIndex = 15;
groupBoxIcons.TabStop = false;
groupBoxIcons.Text = "Иконки";
//
// panelDimond
//
panelDimond.BackgroundImage = (Image)resources.GetObject("panelDimond.BackgroundImage");
panelDimond.BackgroundImageLayout = ImageLayout.Zoom;
panelDimond.Location = new Point(9, 29);
panelDimond.Name = "panelDimond";
panelDimond.Size = new Size(64, 64);
panelDimond.TabIndex = 9;
//
// groupBox4
//
groupBox4.Controls.Add(pictureBoxBackpack);
groupBox4.Controls.Add(numericUpDownMaxWeight);
groupBox4.Controls.Add(labelMaxWeight);
groupBox4.Controls.Add(numericUpDownCount);
groupBox4.Controls.Add(labelCount);
groupBox4.Controls.Add(buttonCreate);
groupBox4.Location = new Point(6, 26);
groupBox4.Name = "groupBox4";
groupBox4.Size = new Size(156, 274);
groupBox4.TabIndex = 14;
groupBox4.TabStop = false;
groupBox4.Text = "Информация";
//
// pictureBoxBackpack
//
pictureBoxBackpack.BackColor = SystemColors.Control;
pictureBoxBackpack.BackgroundImage = (Image)resources.GetObject("pictureBoxBackpack.BackgroundImage");
pictureBoxBackpack.BackgroundImageLayout = ImageLayout.Zoom;
pictureBoxBackpack.Location = new Point(16, 130);
pictureBoxBackpack.Name = "pictureBoxBackpack";
pictureBoxBackpack.Size = new Size(128, 128);
pictureBoxBackpack.TabIndex = 0;
pictureBoxBackpack.TabStop = false;
//
// numericUpDownMaxWeight
//
numericUpDownMaxWeight.Location = new Point(96, 92);
numericUpDownMaxWeight.Minimum = new decimal(new int[] { 20, 0, 0, 0 });
numericUpDownMaxWeight.Name = "numericUpDownMaxWeight";
numericUpDownMaxWeight.Size = new Size(48, 27);
numericUpDownMaxWeight.TabIndex = 2;
numericUpDownMaxWeight.Value = new decimal(new int[] { 20, 0, 0, 0 });
//
// labelMaxWeight
//
labelMaxWeight.AutoSize = true;
labelMaxWeight.Location = new Point(16, 94);
labelMaxWeight.Name = "labelMaxWeight";
labelMaxWeight.Size = new Size(74, 20);
labelMaxWeight.TabIndex = 1;
labelMaxWeight.Text = "Макс. вес";
//
// numericUpDownCount
//
numericUpDownCount.Location = new Point(81, 24);
numericUpDownCount.Maximum = new decimal(new int[] { 9, 0, 0, 0 });
numericUpDownCount.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownCount.Name = "numericUpDownCount";
numericUpDownCount.Size = new Size(63, 27);
numericUpDownCount.TabIndex = 7;
numericUpDownCount.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// labelCount
//
labelCount.AutoSize = true;
labelCount.Location = new Point(16, 26);
labelCount.Name = "labelCount";
labelCount.Size = new Size(58, 20);
labelCount.TabIndex = 6;
labelCount.Text = "Кол-во";
//
// buttonCreate
//
buttonCreate.Location = new Point(16, 57);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 29);
buttonCreate.TabIndex = 5;
buttonCreate.Text = "Создать";
buttonCreate.UseVisualStyleBackColor = true;
//
// groupBoxInfo
//
groupBoxInfo.Controls.Add(label17);
groupBoxInfo.Location = new Point(0, 0);
groupBoxInfo.Name = "groupBoxInfo";
groupBoxInfo.Size = new Size(837, 431);
groupBoxInfo.TabIndex = 13;
groupBoxInfo.TabStop = false;
groupBoxInfo.Text = "Окно информации";
//
// label17
//
label17.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
label17.AutoSize = true;
label17.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
label17.Location = new Point(6, 23);
label17.MaximumSize = new Size(800, 0);
label17.Name = "label17";
label17.Size = new Size(747, 100);
label17.TabIndex = 1;
label17.Text = resources.GetString("label17.Text");
//
// buttonPrev
//
buttonPrev.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonPrev.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonPrev.Location = new Point(0, 437);
buttonPrev.Name = "buttonPrev";
buttonPrev.Size = new Size(488, 50);
buttonPrev.TabIndex = 2;
buttonPrev.Text = "Предыдущий";
buttonPrev.UseVisualStyleBackColor = true;
//
// buttonNext
//
buttonNext.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonNext.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point);
buttonNext.Location = new Point(518, 437);
buttonNext.Name = "buttonNext";
buttonNext.Size = new Size(488, 50);
buttonNext.TabIndex = 3;
buttonNext.Text = "Следующий";
buttonNext.UseVisualStyleBackColor = true;
//
// groupBox2
//
groupBox2.Controls.Add(labelInputWind);
groupBox2.Controls.Add(labelMainWind);
groupBox2.Controls.Add(labelAboutAlgoritm);
groupBox2.Controls.Add(labelInfo);
groupBox2.Location = new Point(843, 0);
groupBox2.Name = "groupBox2";
groupBox2.Size = new Size(163, 431);
groupBox2.TabIndex = 4;
groupBox2.TabStop = false;
groupBox2.Text = "Содержание";
//
// labelInputWind
//
labelInputWind.AutoSize = true;
labelInputWind.Location = new Point(6, 83);
labelInputWind.MaximumSize = new Size(160, 0);
labelInputWind.Name = "labelInputWind";
labelInputWind.Size = new Size(125, 40);
labelInputWind.TabIndex = 3;
labelInputWind.Text = "- Об окне ввода входных данных";
labelInputWind.Click += Label_Click;
//
// labelMainWind
//
labelMainWind.AutoSize = true;
labelMainWind.Location = new Point(6, 123);
labelMainWind.MaximumSize = new Size(160, 0);
labelMainWind.Name = "labelMainWind";
labelMainWind.Size = new Size(130, 20);
labelMainWind.TabIndex = 2;
labelMainWind.Text = "- О главном окне";
labelMainWind.Click += Label_Click;
//
// labelAboutAlgoritm
//
labelAboutAlgoritm.AutoSize = true;
labelAboutAlgoritm.Location = new Point(6, 62);
labelAboutAlgoritm.MaximumSize = new Size(160, 0);
labelAboutAlgoritm.Name = "labelAboutAlgoritm";
labelAboutAlgoritm.Size = new Size(117, 20);
labelAboutAlgoritm.TabIndex = 1;
labelAboutAlgoritm.Text = "- Об алгоритме";
labelAboutAlgoritm.Click += Label_Click;
//
// labelInfo
//
labelInfo.AutoSize = true;
labelInfo.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelInfo.Location = new Point(6, 22);
labelInfo.MaximumSize = new Size(160, 0);
labelInfo.Name = "labelInfo";
labelInfo.Size = new Size(105, 40);
labelInfo.TabIndex = 0;
labelInfo.Text = "- Об окне информации";
labelInfo.Click += Label_Click;
//
// groupBoxMainWindow
//
groupBoxMainWindow.Controls.Add(label13);
groupBoxMainWindow.Controls.Add(panel8);
groupBoxMainWindow.Controls.Add(label30);
groupBoxMainWindow.Controls.Add(buttonData);
groupBoxMainWindow.Controls.Add(label29);
groupBoxMainWindow.Controls.Add(label28);
groupBoxMainWindow.Controls.Add(label27);
groupBoxMainWindow.Controls.Add(label26);
groupBoxMainWindow.Controls.Add(label25);
groupBoxMainWindow.Controls.Add(panel7);
groupBoxMainWindow.Controls.Add(pictureBox1);
groupBoxMainWindow.Controls.Add(groupBoxTools);
groupBoxMainWindow.Controls.Add(panelElem);
groupBoxMainWindow.Location = new Point(0, 0);
groupBoxMainWindow.Name = "groupBoxMainWindow";
groupBoxMainWindow.Size = new Size(837, 431);
groupBoxMainWindow.TabIndex = 15;
groupBoxMainWindow.TabStop = false;
groupBoxMainWindow.Text = "О главном окне";
groupBoxMainWindow.Visible = false;
//
// label30
//
label30.AutoSize = true;
label30.Location = new Point(501, 153);
label30.Name = "label30";
label30.Size = new Size(228, 20);
label30.TabIndex = 25;
label30.Text = "- Открыть форму ввода данных";
//
// buttonData
//
buttonData.Location = new Point(343, 149);
buttonData.Name = "buttonData";
buttonData.Size = new Size(157, 29);
buttonData.TabIndex = 24;
buttonData.Text = "Начать";
buttonData.UseVisualStyleBackColor = true;
//
// label29
//
label29.AutoSize = true;
label29.Location = new Point(234, 389);
label29.Name = "label29";
label29.Size = new Size(247, 20);
label29.TabIndex = 23;
label29.Text = "- Текущий вес/Максимвльный вес";
//
// label28
//
label28.AutoSize = true;
label28.Location = new Point(501, 95);
label28.Name = "label28";
label28.Size = new Size(287, 20);
label28.TabIndex = 22;
label28.Text = "- Сделать шаг в выполнении алгоритма";
//
// label27
//
label27.AutoSize = true;
label27.Location = new Point(501, 60);
label27.Name = "label27";
label27.Size = new Size(157, 20);
label27.TabIndex = 21;
label27.Text = "- Запустить алгоритм";
//
// label26
//
label26.AutoSize = true;
label26.Location = new Point(150, 87);
label26.Name = "label26";
label26.Size = new Size(121, 20);
label26.TabIndex = 20;
label26.Text = "- Значение веса";
//
// label25
//
label25.AutoSize = true;
label25.Location = new Point(150, 42);
label25.Name = "label25";
label25.Size = new Size(127, 20);
label25.TabIndex = 19;
label25.Text = "- Значение цены";
//
// panel7
//
panel7.BackgroundImage = (Image)resources.GetObject("panel7.BackgroundImage");
panel7.BackgroundImageLayout = ImageLayout.Zoom;
panel7.Controls.Add(label24);
panel7.Location = new Point(168, 343);
panel7.Name = "panel7";
panel7.Size = new Size(74, 82);
panel7.TabIndex = 18;
//
// label24
//
label24.AutoSize = true;
label24.BackColor = Color.Transparent;
label24.ForeColor = Color.White;
label24.Location = new Point(6, 46);
label24.Name = "label24";
label24.Size = new Size(55, 20);
label24.TabIndex = 0;
label24.Text = " 0/100";
//
// pictureBox1
//
pictureBox1.BackColor = SystemColors.Control;
pictureBox1.BackgroundImage = (Image)resources.GetObject("pictureBox1.BackgroundImage");
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
pictureBox1.Location = new Point(0, 267);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(167, 158);
pictureBox1.TabIndex = 17;
pictureBox1.TabStop = false;
//
// groupBoxTools
//
groupBoxTools.Controls.Add(buttonStart);
groupBoxTools.Controls.Add(buttonStep);
groupBoxTools.Location = new Point(337, 23);
groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Size = new Size(169, 117);
groupBoxTools.TabIndex = 15;
groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты";
//
// buttonStart
//
buttonStart.Location = new Point(6, 33);
buttonStart.Name = "buttonStart";
buttonStart.Size = new Size(157, 29);
buttonStart.TabIndex = 2;
buttonStart.Text = "Запустить";
buttonStart.UseVisualStyleBackColor = true;
//
// buttonStep
//
buttonStep.Location = new Point(6, 68);
buttonStep.Name = "buttonStep";
buttonStep.Size = new Size(157, 29);
buttonStep.TabIndex = 0;
buttonStep.Text = "Шаг";
buttonStep.UseVisualStyleBackColor = true;
//
// panelElem
//
panelElem.Controls.Add(panelWeight0);
panelElem.Controls.Add(pictureBoxElem0);
panelElem.Controls.Add(panelValue0);
panelElem.Location = new Point(6, 26);
panelElem.Name = "panelElem";
panelElem.Size = new Size(146, 100);
panelElem.TabIndex = 14;
//
// panelWeight0
//
panelWeight0.BackgroundImage = (Image)resources.GetObject("panelWeight0.BackgroundImage");
panelWeight0.BackgroundImageLayout = ImageLayout.Zoom;
panelWeight0.Location = new Point(95, 50);
panelWeight0.Name = "panelWeight0";
panelWeight0.Size = new Size(48, 47);
panelWeight0.TabIndex = 11;
//
// pictureBoxElem0
//
pictureBoxElem0.BackColor = Color.Transparent;
pictureBoxElem0.BackgroundImage = (Image)resources.GetObject("pictureBoxElem0.BackgroundImage");
pictureBoxElem0.BackgroundImageLayout = ImageLayout.Zoom;
pictureBoxElem0.Location = new Point(3, 3);
pictureBoxElem0.Name = "pictureBoxElem0";
pictureBoxElem0.Size = new Size(92, 94);
pictureBoxElem0.TabIndex = 12;
pictureBoxElem0.TabStop = false;
//
// panelValue0
//
panelValue0.BackgroundImage = (Image)resources.GetObject("panelValue0.BackgroundImage");
panelValue0.BackgroundImageLayout = ImageLayout.Zoom;
panelValue0.Location = new Point(95, 3);
panelValue0.Name = "panelValue0";
panelValue0.Size = new Size(48, 47);
panelValue0.TabIndex = 10;
//
// panel8
//
panel8.BackgroundImage = (Image)resources.GetObject("panel8.BackgroundImage");
panel8.BackgroundImageLayout = ImageLayout.Zoom;
panel8.Controls.Add(label14);
panel8.Location = new Point(168, 267);
panel8.Name = "panel8";
panel8.Size = new Size(74, 78);
panel8.TabIndex = 26;
//
// label13
//
label13.AutoSize = true;
label13.Location = new Point(241, 297);
label13.Name = "label13";
label13.Size = new Size(146, 20);
label13.TabIndex = 27;
label13.Text = "- Текущая ценность";
//
// label14
//
label14.AutoSize = true;
label14.BackColor = Color.Transparent;
label14.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label14.Location = new Point(29, 29);
label14.Name = "label14";
label14.Size = new Size(18, 20);
label14.TabIndex = 28;
label14.Text = "0";
//
// InformationForm
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1006, 487);
Controls.Add(groupBox2);
Controls.Add(buttonNext);
Controls.Add(buttonPrev);
Controls.Add(groupBoxMainWindow);
Controls.Add(groupBoxInfo);
Controls.Add(groupBoxAboutAlgoritm);
Controls.Add(groupBoxInputWindow);
MinimumSize = new Size(1024, 483);
Name = "InformationForm";
Text = "InformationForm";
groupBoxAboutAlgoritm.ResumeLayout(false);
groupBoxAboutAlgoritm.PerformLayout();
groupBox3.ResumeLayout(false);
groupBox3.PerformLayout();
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
groupBoxInputWindow.ResumeLayout(false);
groupBoxInputWindow.PerformLayout();
groupBoxElements.ResumeLayout(false);
panelElement0.ResumeLayout(false);
panelElement0.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericUpDownWeight0).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownValue0).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBoxElement0).EndInit();
groupBoxIcons.ResumeLayout(false);
groupBox4.ResumeLayout(false);
groupBox4.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxBackpack).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownMaxWeight).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownCount).EndInit();
groupBoxInfo.ResumeLayout(false);
groupBoxInfo.PerformLayout();
groupBox2.ResumeLayout(false);
groupBox2.PerformLayout();
groupBoxMainWindow.ResumeLayout(false);
groupBoxMainWindow.PerformLayout();
panel7.ResumeLayout(false);
panel7.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
groupBoxTools.ResumeLayout(false);
panelElem.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBoxElem0).EndInit();
panel8.ResumeLayout(false);
panel8.PerformLayout();
ResumeLayout(false);
}
#endregion
private GroupBox groupBoxAboutAlgoritm;
private Label label1;
private Label label5;
private Label label6;
private Label label3;
private Label label4;
private Label label2;
private Label label7;
private Label label8;
private Label label11;
private Label label10;
private Label label9;
private GroupBox groupBox3;
private GroupBox groupBox1;
private Label label12;
private Button buttonPrev;
private Button buttonNext;
private GroupBox groupBox2;
private Label labelInputWind;
private Label labelMainWind;
private Label labelAboutAlgoritm;
private Label labelInfo;
private GroupBox groupBoxInfo;
private Label label17;
private GroupBox groupBoxInputWindow;
private GroupBox groupBox4;
private PictureBox pictureBoxBackpack;
private NumericUpDown numericUpDownMaxWeight;
private Label labelMaxWeight;
private NumericUpDown numericUpDownCount;
private Label labelCount;
private Button buttonCreate;
private GroupBox groupBoxIcons;
private Panel panelDimond;
private GroupBox groupBoxElements;
private Panel panelElement0;
private NumericUpDown numericUpDownWeight0;
private Label label33;
private NumericUpDown numericUpDownValue0;
private Label label34;
private PictureBox pictureBoxElement0;
private Label label19;
private Label label18;
private Label label16;
private Label label23;
private Label label22;
private Label label21;
private Label label20;
private GroupBox groupBoxMainWindow;
private Panel panelElem;
private Panel panelWeight0;
private PictureBox pictureBoxElem0;
private Panel panelValue0;
private GroupBox groupBoxTools;
private Button buttonStart;
private Button buttonStep;
private Panel panel7;
private Label label24;
private PictureBox pictureBox1;
private Label label26;
private Label label25;
private Label label29;
private Label label28;
private Label label27;
private Label label30;
private Button buttonData;
private Label label13;
private Panel panel8;
private Label label14;
}
}

View File

@ -0,0 +1,94 @@
namespace BackpackGreedyAlgorithm;
public partial class InformationForm : Form
{
// 0 - Об окне инфомрмации
// 1 - Об алгоритме
// 2 - Об окне ввода данных
// 3 - О главном окне
/// <summary>
/// Индекс текущей страницы информации
/// </summary>
private int indInfWind = 0;
/// <summary>
/// Список содержания
/// </summary>
private Label[] listLabel;
/// <summary>
/// Список листов информации
/// </summary>
private GroupBox[] listWind;
/// <summary>
/// Конструктор
/// </summary>
public InformationForm()
{
InitializeComponent();
listWind = new GroupBox[4]
{
groupBoxInfo,
groupBoxAboutAlgoritm,
groupBoxInputWindow,
groupBoxMainWindow
};
listLabel = new Label[4]
{
labelInfo,
labelAboutAlgoritm,
labelInputWind,
labelMainWind
};
buttonNext.Click += (sender, e) => SetVisible(indInfWind, ++indInfWind > 3 ? 0 : indInfWind);
buttonPrev.Click += (sender, e) => SetVisible(indInfWind, --indInfWind < 0 ? 3 : indInfWind); ;
}
/// <summary>
/// Установление текущей страницы
/// </summary>
/// <param name="oldInd"></param>
/// <param name="newInd"></param>
private void SetVisible(int oldInd, int newInd)
{
if (oldInd == newInd) return;
listWind[oldInd].Visible = false;
listLabel[oldInd].Font = null;
listWind[newInd].Visible = true;
listLabel[newInd].Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
indInfWind = newInd;
}
/// <summary>
/// Событие нажатия на заголовки содержание
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Label_Click(object sender, EventArgs e)
{
switch ((sender as Label)?.Name)
{
case "labelInfo":
SetVisible(indInfWind, 0);
break;
case "labelAboutAlgoritm":
SetVisible(indInfWind, 1);
break;
case "labelInputWind":
SetVisible(indInfWind, 2);
break;
case "labelMainWind":
SetVisible(indInfWind, 3);
break;
default:
SetVisible(indInfWind, 4);
break;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,193 @@
using BackpackGreedyAlgorithm.Algorithm;
using System.Linq;
using System.Text.RegularExpressions;
namespace BackpackGreedyAlgorithm;
public partial class InputForm : Form
{
/// <summary>
/// Список панелей элементов
/// </summary>
private List<Panel> panelElements = new();
/// <summary>
/// Список картинок
/// </summary>
private List<Image> Images = new();
/// <summary>
/// Создание делегата
/// </summary>
private event Action<Datas>? action;
/// <summary>
/// Конструктор
/// </summary>
public InputForm()
{
InitializeComponent();
panelElement0.DragDrop += PanelElement_DragDrop;
panelElement0.DragEnter += PanelElement_DragEnter;
panelElement1.DragDrop += PanelElement_DragDrop;
panelElement1.DragEnter += PanelElement_DragEnter;
panelElement2.DragDrop += PanelElement_DragDrop;
panelElement2.DragEnter += PanelElement_DragEnter;
panelElement3.DragDrop += PanelElement_DragDrop;
panelElement3.DragEnter += PanelElement_DragEnter;
panelElement4.DragDrop += PanelElement_DragDrop;
panelElement4.DragEnter += PanelElement_DragEnter;
panelElement5.DragDrop += PanelElement_DragDrop;
panelElement5.DragEnter += PanelElement_DragEnter;
panelElement6.DragDrop += PanelElement_DragDrop;
panelElement6.DragEnter += PanelElement_DragEnter;
panelElement7.DragDrop += PanelElement_DragDrop;
panelElement7.DragEnter += PanelElement_DragEnter;
panelElement8.DragDrop += PanelElement_DragDrop;
panelElement8.DragEnter += PanelElement_DragEnter;
buttonCancel.Click += (sender, e) => Close();
panelElements.Add(panelElement0);
panelElements.Add(panelElement1);
panelElements.Add(panelElement2);
panelElements.Add(panelElement3);
panelElements.Add(panelElement4);
panelElements.Add(panelElement5);
panelElements.Add(panelElement6);
panelElements.Add(panelElement7);
panelElements.Add(panelElement8);
Images.Add((groupBoxIcons.Controls["panelDimond"] as Panel).BackgroundImage);
Images.Add((groupBoxIcons.Controls["panelEmerald"] as Panel).BackgroundImage);
Images.Add((groupBoxIcons.Controls["panelGold"] as Panel).BackgroundImage);
}
/// <summary>
/// Кнопка создания элементов
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreate_Click(object sender, EventArgs e)
{
groupBoxElements.Enabled = true;
groupBoxIcons.Enabled = true;
for (int ind = 0; ind < 9; ind++)
{
if (ind < (int)numericUpDownCount.Value) panelElements[ind].Visible = true;
else panelElements[ind].Visible = false;
}
}
/// <summary>
/// Кнопка принятий данных
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonAccept_Click(object sender, EventArgs e)
{
Datas data = GetData();
action?.Invoke(data);
Close();
}
/// <summary>
/// Получение параметров из формы
/// </summary>
/// <returns>Параметр</returns>
private Datas GetData()
{
List<Gem> gems = new List<Gem>();
var regex = new Regex("[0-9]");
int i = 0;
foreach (Panel elem in panelElements)
{
if (elem.Visible)
{
Image image = Images[0];
int weight = 20;
int value = 1;
foreach (Control info in elem.Controls)
{
String type = regex.Replace(info.Name, String.Empty);
switch (type)
{
case "pictureBoxElement":
PictureBox pb = (PictureBox)info;
image = pb.BackgroundImage ?? Images[0];
break;
case "numericUpDownValue":
NumericUpDown nudV = (NumericUpDown)info;
value = (int?)nudV.Value ?? 1;
break;
case "numericUpDownWeight":
NumericUpDown nudW = (NumericUpDown)info;
weight = (int?)nudW.Value ?? 20;
break;
default:
break;
}
}
gems.Add(new(image, weight, value, i));
i++;
}
}
return new((int)numericUpDownMaxWeight.Value, gems);
}
/// <summary>
/// Добавление ивента
/// </summary>
/// <param name="e"></param>
public void AddEvent(Action<Datas> e)
{
action += e;
}
/// <summary>
/// Событие нажатия панели с иконками
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Panel_MouseDown(object sender, MouseEventArgs e)
{
(sender as Panel)?.DoDragDrop((sender as Panel)?.BackgroundImage, DragDropEffects.Copy | DragDropEffects.Move);
}
/// <summary>
/// Событие DragDrop
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelElement_DragDrop(object sender, DragEventArgs e)
{
foreach (Control picture in (sender as Panel).Controls)
{
if (picture.GetType() == typeof(PictureBox))
{
picture.BackgroundImage = e.Data?.GetData(typeof(Bitmap)) as Bitmap;
break;
}
}
}
/// <summary>
/// Проверка что перетаскиваемый элемент Bitmap
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PanelElement_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.Data.GetDataPresent(typeof(Bitmap)) ? DragDropEffects.Copy : DragDropEffects.None;
}
// TODO Сделать кнопку рандомайзер значений
}

View File

@ -0,0 +1,556 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBoxBackpack.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
2kqzl9lPRq8AAAAASUVORK5CYII=
</value>
</data>
<data name="panelDimond.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
io3mA3X6P/H8qENMPlbNAAAAAElFTkSuQmCC
</value>
</data>
<data name="panelEmerald.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAh
hQAAIYUBsqnhPgAAAvdJREFUeF7tmsFOFEEURYce+AVNINGFAdeajOwVlyr6AfgHJsrEhUuBjQnK2ugY
40bUxERw4ScYceEOv0EYZUXIUCmroZ7punXHLqZbo8y7yVnw0tX97oH0JEDDWtuXupJdG7GD4I9XDusm
0KFQV1i5FPzxymHdBDoU6gorl4I/Xjmsm0CHQl1h5VLwxyuHdRPoUKgrrFwK/njlsG4CHQqDxC0+ikXe
m8/IHpkFfLBfgnvk+EccOaybQIfCIHGLqgBcnBRUAWQW8N8IwCXHbowZLHN760nArW+Pe+Obc/Z3THy9
aZuvLgTgszx+k/5h3QQ6FFKCC6kAFaACjq+A0dm4MJZdNxsGC+M1b/c/RgKwbPPNdPCcAx5NhTw4s4PX
+FWDsG4CHQoYFaAChkwA3nzkasOumY0ALHtn62nKSzAoTwUQIgHLkzZbOBUCO+dgryJ0KOCNVIAKUAEq
AAVc7N6PwMIoxFEqqd19FhdOAXbOwV5F6FDAG6kAFaAC8tI7RZiAme5iAJZd2/9k29sdU2SmuxBw+ceS
aa62bMDLlimSPT+3my2dNgGwcw72KkKHAt4o9ScAQQHvnAD8juOZS98X6SdBwIvzu//kpwCiAlSACkAB
vUEE0Lc+AjvnYK8idCjgjVSAClABQy7gSiNYmi3OwDMOU3bN/HanXMDy5F/+FFABKiBaFIsw8Izj+AjA
X21NbM6VlkthvtuJCjfvngy5N64CVIAKUAF/TgCG/XEU39TN19MGpUTXrLZ6WC5ihRRG2if2cB+/ahDW
TaBDAaMCVMCQC2DBBbLrmcHCUbmHU9E1tCAQPesQv0n/sG4CHQopiRZSASpABWC5Yy0A4xaK/l0+EpDC
ytnwHg7/iIO4r39RFtZNoENhkLiFVEC+bAArWEaJgKOEdRPoUBgkbtHhFsDiXoz5yzFkthx/vHJYN4EO
hbqC38lU/PHKYd0EOhTqCiuXgj9eOaybQIdCXWHlUvDHK4d1E+hQqCusXAr+eOWwbofYxk9uHRUXCZU9
sgAAAABJRU5ErkJggg==
</value>
</data>
<data name="panelGold.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vAAADrwBlbxySQAAAd1JREFUeF7tm81Nw1AQhCM6QIgeqIUmuNACrdAHFMOJA1cK4IIUPQRaw/OXiTfG
P7G9O9J3Wb+8nRlHkTiwK6WERg4jIYeRkMNIyGEk5DASchgJOYzE4vV8f1m6sGPblQpdY8e2KxW6xo5t
Vyp0jR1bj1SILj5fbjvheVuzXNGwhwpdw/O2ZrmiYQ8Vuobnbc1yRcMeKnQNz9ua+UQDHvuPu0nhPrM5
nbjQQ5keE+4zm9OJCz2U6THhPrM5nbjQQ5keE+4zm6eLF3jwR0mZmhP6sVinS4XsgguVqTmhn4ebi18s
YrdUyC64UJmaE/rJArwCGKjs31qoJUuCfkl91iK3FamAb+pvxM+3IgvIAtoF8EfEu3BsuM+Dn399vGrB
PFlAFpAF9CuACzwDhOc9+Pn3p+sWDOjBPFlAFpAFDCuAzw80cSDC++iPZAFZQPAC7I/gP7EAXsgAvJDP
+Xllug+8j/sJ33CNRW4rC8gCtlWAxfq/vEK4cGgBPE/UmzyGRRimLCALWFYBZut86lsInxP15o5hFs6r
LCALGLcAu3a9YiFEvckGu2LdUqFrVPAGu2LdUqFrVPAGu2LdUqFr7Nh6VMQ/EURCDiMhh5GQw0jIYSTk
MBJyGAk5jEPZfQHhwks0ntFtBgAAAABJRU5ErkJggg==
</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,168 @@
using BackpackGreedyAlgorithm.Storages;
using BackpackGreedyAlgorithm.Communications;
using BackpackGreedyAlgorithm.Algorithm;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BackpackGreedyAlgorithm;
public partial class MainForm : Form
{
/// <summary>
/// Список панелей драгоценностей
/// </summary>
List<Panel> listElement = new List<Panel>();
/// <summary>
/// Хранилище
/// </summary>
private Storage _storage;
/// <summary>
/// Управленец
/// </summary>
private Manager _manager;
/// <summary>
/// Визуализатор
/// </summary>
private Visualizer _visualizer;
/// <summary>
/// Параметр
/// </summary>
private Datas _data;
/// <summary>
/// Конструктор
/// </summary>
public MainForm()
{
InitializeComponent();
listElement.Add(panelElem0);
listElement.Add(panelElem1);
listElement.Add(panelElem2);
listElement.Add(panelElem3);
listElement.Add(panelElem4);
listElement.Add(panelElem5);
listElement.Add(panelElem6);
listElement.Add(panelElem7);
listElement.Add(panelElem8);
}
/// <summary>
/// Кнопки шагов
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonStep_Click(object sender, EventArgs e)
{
switch (((Button)sender).Name)
{
case "buttonStepNext":
if (_storage.GetStatus().maxWeight <= _storage.GetStatus().weight)
{
MessageBox.Show("Алгоритм завершился", "Инфо");
return;
}
if (_storage.statuses.Count == _storage.currentStatus + 1) _storage = _manager.MakeStap();
else _storage.SetNextStatus();
break;
case "buttonStepPrev":
_storage.SetPrevStatus();
break;
case "buttonReset":
_storage.SetFirstStatus();
break;
}
Status status = _storage.GetStatus();
_visualizer.Update(status.gems, status.weight, status.value);
}
/// <summary>
/// Кнопка вызова окна входных данных
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonData_Click(object sender, EventArgs e)
{
InputForm form = new InputForm();
form.Show();
form.AddEvent(InitData);
}
/// <summary>
/// Определение параметра
/// </summary>
/// <param name="data">Параметр</param>
private void InitData(Datas data)
{
_data = data;
_visualizer = new(listElement, data.maxWeight, labelBackpackValue, labelBackpackWeight);
_manager = new(_data);
_storage = _manager.storage;
_visualizer.Update(_data.gems, 0, 0);
groupBoxElems.Enabled = true;
groupBoxTools.Enabled = true;
}
// TODO Сделать меню с функциями:
// - Сохранения
// - Загрузки
/// <summary>
/// Выпадающее меню для сохранения данных
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
if (_storage == null)
{
MessageBox.Show("Файл не удалось сохранить", "Инфо");
return;
}
Storage.Save(saveFileDialog.FileName, _storage);
MessageBox.Show("Файл сохранён", "Инфо");
}
}
/// <summary>
/// Выпадающее меню для загрузки данных
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void LoadToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
_storage = Storage.Load(openFileDialog.FileName);
if (_storage == null) MessageBox.Show($"Файл {openFileDialog.FileName.Split("\\")[0]} не найден");
else
{
Status status = _storage.GetStatus();
_manager = new(null);
_manager.SetStatusAlgoritm(status, _storage);
_visualizer = new(listElement, status.maxWeight, labelBackpackValue, labelBackpackWeight);
_visualizer.Update(status.gems, status.weight, status.value);
groupBoxElems.Enabled = true;
groupBoxTools.Enabled = true;
MessageBox.Show("Файл загружен");
};
}
}
/// <summary>
/// Выпадающее меню открывающее форму информации
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void InfoToolStripMenuItem_Click(object sender, EventArgs e)
{
InformationForm info = new InformationForm();
info.Show();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
namespace BackpackGreedyAlgorithm
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}
}
}

View File

@ -0,0 +1,113 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BackpackGreedyAlgorithm.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BackpackGreedyAlgorithm.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Diamond {
get {
object obj = ResourceManager.GetObject("Diamond", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Emerald {
get {
object obj = ResourceManager.GetObject("Emerald", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Gold {
get {
object obj = ResourceManager.GetObject("Gold", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Value {
get {
object obj = ResourceManager.GetObject("Value", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Weigth {
get {
object obj = ResourceManager.GetObject("Weigth", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Value" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\img\Value.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Weigth" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\img\Weigth.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Diamond" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\img\Diamond.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Emerald" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\img\Emerald.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Gold" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\img\Gold.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -0,0 +1,43 @@
using BackpackGreedyAlgorithm.Algorithm;
namespace BackpackGreedyAlgorithm.Storages;
[Serializable]
public class Status
{
/// <summary>
/// Список драгоценностей
/// </summary>
public List<Gem> gems;
/// <summary>
/// Максимальный вес
/// </summary>
public int maxWeight;
/// <summary>
/// Текущая стоимость драг. в рюкзаке
/// </summary>
public int value;
/// <summary>
/// Текущий вес драг. в рюкзаке
/// </summary>
public int weight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="maxWeight">Максимальный вес</param>
/// <param name="weight">Текущий вес драг. в рюкзаке</param>
/// <param name="value">Текущая стоимость драг. в рюкзаке</param>
/// <param name="gems">Список драгоценностей</param>
public Status(int maxWeight, int weight, int value, List<Gem> gems)
{
this.maxWeight = maxWeight;
this.weight = weight;
this.value = value;
this.gems = gems;
}
}

View File

@ -0,0 +1,104 @@

using System.Runtime.Serialization.Formatters.Binary;
#pragma warning disable SYSLIB0011
namespace BackpackGreedyAlgorithm.Storages;
[Serializable]
public class Storage
{
/// <summary>
/// Список состояний
/// </summary>
public readonly List<Status> statuses = new();
/// <summary>
/// Текущее состояние
/// (-1 - список состояний пуст)
/// </summary>
public int currentStatus = -1;
/// <summary>
/// Бинарный сериализатор
/// </summary>
[NonSerialized]
static BinaryFormatter formatter = new BinaryFormatter();
/// <summary>
/// Добавить статус в список
/// </summary>
/// <param name="status">Добавляемый статус</param>
public void AddStatus(Status? status)
{
if (status == null) return;
statuses.Add(status);
currentStatus++;
}
/// <summary>
/// Установить следующий статус
/// </summary>
public void SetNextStatus()
{
if (currentStatus + 1 > statuses.Count) return;
currentStatus++;
}
/// <summary>
/// Установить предыдущий статус
/// </summary>
public void SetPrevStatus()
{
if (currentStatus - 1 < 0) return;
currentStatus--;
}
/// <summary>
/// Установить первый статус
/// </summary>
public void SetFirstStatus()
{
if (currentStatus == -1) return;
currentStatus = 0;
}
/// <summary>
/// Получить установленный статус
/// </summary>
public Status GetStatus()
{
return statuses[currentStatus];
}
/// <summary>
/// Сохранить текущее состояние работы программы
/// </summary>
/// <param name="filename">Путь к файлу или имя файла</param>
public static void Save(string filename, Storage storage)
{
if (File.Exists(filename))
{
File.Delete(filename);
}
using (FileStream fs = new(filename, FileMode.OpenOrCreate))
{
formatter.Serialize(fs, storage);
}
}
/// <summary>
/// Загрузить состояние работы программы
/// </summary>
/// <param name="filename">Путь к файлу</param>
/// <returns>Загруженное хранилище</returns>
public static Storage? Load(string filename)
{
if (!File.Exists(filename)) return null;
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate))
{
return (Storage)formatter.Deserialize(fs);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB