Информационная система поддержки принятия решений в условиях многокритериальной оптимизации

Основные понятия теории принятия решений. Формализация задач принятия решений. Однокритериальные и многокритериальные задачи в условиях определенности. Методы оценки многокритериальных альтернатив. Методы построения аддитивной функции полезности.

Рубрика Менеджмент и трудовые отношения
Вид дипломная работа
Язык русский
Дата добавления 08.07.2014
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

*/

private double getFreeCargo (SortedMap<Container, List<Item>> map) {

double freeCargo = 0.0;

for (Container c: map. keySet ()) {

double itemsWeight = 0.0;

for (Item i: map. get (c)) {

itemsWeight += i. weight;

}

freeCargo += (c. getCargo () - itemsWeight);

}

return freeCargo;

}

/**

* Проверить возможность упаковки объекта в контейнер.

* @param c Контейнер.

* @param i Объект.

* @param map Карта, содержащая информацию об упакованных объектах.

* @return Флаг проверки.

*/

private boolean canPack (Container c, Item i, SortedMap<Container, List<Item>> map) {

// Получаем список объектов, упакованных в этот контейнер.

List<Item> items = map. get (c);

int totalVolume = 0;

double totalWeight = 0.0;

// Получаем суммарный вес и объём объектов, упакованных в этот контейнер.

for (Item item: items) {

totalVolume += item. volume;

totalWeight += item. weight;

}

// Если масса или объём проверяемого объекта

// больше оставшейся грузоподъёмности

// или свободного места в контейнере,

// объект в него упаковать нельзя.

if (c. getVolume () - totalVolume < i. volume ||

c. getCargo () - totalWeight < i. weight) {

return false;

}

return true;

}

/**

* Создать парные объекты на исходном множестве.

* @param pairsNum Необходимое количество пар.

* @param items Исходное множество.

*/

public void createPairs (int pairsNum, List<Item> items) {

Random r = new Random ();

int pairCounter = 0;

while (pairCounter < pairsNum) {

findPair (items. get (r. nextInt (items. size ())), items);

pairCounter = countPairs (items);

}

}

/**

* Найти парный объект.

* @param i Объект, для которого ищется парный объект.

* @param items Исходное множество.

*/

private void findPair (Item i, List<Item> items) {

if (! (i. hasPair ())) {

Random r = new Random ();

Item pair;

do {

pair = items. get (r. nextInt (items. size ()));

} while (pair. hasPair () || pair == i);

i. setPair (pair);

pair. setPair (i);

}

}

/**

* Сосчитать парные объекты.

* @param items Исходное множество.

* @return Количество пар.

*/

public int countPairs (List<Item> items) {

int pairsCounter = 0;

for (Item i: items) {

if (i. hasPair ()) {

pairsCounter++;

}

}

return pairsCounter / 2;

}

/**

* Извлечь наиболее тяжёлый объект. <p>

* Полученный объект удаляется из списка.

* @param items Список объектов.

* @return Самый тяжёлый объект.

*/

public Item extractHardest (List<Item> items) {

Item hardest = items. get (0);

for (Item i: items) {

if (i. weight > hardest. weight) {

hardest = i;

}

}

items. remove (hardest);

return hardest;

}

/**

* Извлечь наиболее объёмный объект. <p>

* Полученный объект удаляется из списка.

* @param items Список объектов.

* @return Самый объёмный объект.

*/

public Item extractLargest (List<Item> items) {

Item largest = items. get (0);

for (Item i: items) {

if (i. volume > largest. volume) {

largest = i;

}

}

items. remove (largest);

return largest;

}

public void sort (List<Item> items, SORT_TYPE. template) {

int itemsSize = items. size ();

int templateLength = template. length;

for (int i = 0; i < itemsSize; i++) {

SORT_TYPE type = template [i % templateLength];

for (int j = i; j < itemsSize; j++) {

for (int k = i; k < itemsSize; k++) {

switch (type) {

case VOLUME:

if (items. get (j). volume < items. get (k). volume) {

Item buffer = items. get (j);

items. set (j, items. get (k));

items. set (k, buffer);

}

break;

case WEIGHT:

if (items. get (j). weight < items. get (k). weight) {

Item buffer = items. get (j);

items. set (j, items. get (k));

items. set (k, buffer);

}

break;

case UTILITY:

if (boss. getUtility (items. get (j)) > boss. getUtility (items. get (k))) {

Item buffer = items. get (j);

items. set (j, items. get (k));

items. set (k, buffer);

}

break;

case SIZE:

if (countSize (items. get (j)) > countSize (items. get (k))) {

Item buffer = items. get (j);

items. set (j, items. get (k));

items. set (k, buffer);

}

break;

default:

break;

}

}

}

}

}

/**

* Рассчитать размер. Расчёт производится по массе и объёму.

* @param i Объект.

*/

private double countSize (Item i) {

return i. volume * i. weight;

}

/**

* Получить лучший контейнер из подходящих. <p>

* Лучшим контейнер с минимальным свободным местом (грузоподъёмность или объём) под упаковку объекта.

* @param containers Контейнеры.

* @param i Объект.

* @param map Карта упаковки.

* @return Лучший контейнер.

*/

private Container getBest (Collection<Container> containers, Item i, SortedMap<Container, List<Item>> map) {

return getValid (getValidContainers (containers, i, map), i, map);

}

/**

* Получить контейнеры, пригодные для упаковки объекта.

* @param containers Контейнеры.

* @param i Объект.

* @param map Карта упаковки.

* @return Список контейнеров, в которые можно упаковать объект.

*/

private List<Container> getValidContainers (Collection<Container> containers, Item i, SortedMap<Container, List<Item>> map) {

List<Container> validContainers = new ArrayList<Container> ();

for (Container c: containers) {

if (canPack (c, i, map)) {

validContainers. add (c);

}

}

return validContainers;

}

/**

* Получить контейнер, в котором осталось наименьшее количество места для упаковки объекта.

* @param containers Контейнеры.

* @param i Объект.

* @param map Карта упаковки.

* @return Контейнер.

*/

private Container getValid (List<Container> containers, Item i, SortedMap<Container, List<Item>> map) {

double minimalRests = 0;

for (Container c: containers) {

double rests = getRests (c, i, map);

if (rests > minimalRests) {

minimalRests += rests;

}

}

for (Container c: containers) {

double rests = getRests (c, i, map);

if (rests == 0) {

return c;

}

if (rests < minimalRests) {

minimalRests = rests;

}

}

for (Container c: containers) {

if (getRests (c, i, map) == minimalRests) {

return c;

}

}

return null;

}

/**

* Получить остаток. <p>

* Остатком считается наименьшее значение из остатка по грузоподъёмности или остатка по объёму.

* @param c Контейнер.

* @param i Объект.

* @param map Карта упаковки.

* @return Остаток.

*/

private double getRests (Container c, Item i, SortedMap<Container, List<Item>> map) {

double totalVolume = 0;

double totalWeight = 0;

for (Item item: map. get (c)) {

totalVolume += item. volume;

totalWeight += item. weight;

}

double volumeRests = c. getVolume () - totalVolume;

double cargoRests = c. getCargo () - totalWeight;

if (volumeRests < cargoRests) {

return volumeRests;

} else if (cargoRests < volumeRests) {

return cargoRests;

}

return 0;

}

}

Store. java

package core;

import java. util. AbstractMap. SimpleEntry;

import java. util. ArrayList;

import java. util.comparator;

import java. util. LinkedList;

import java. util. List;

import java. util. Map. Entry;

import java. util. Random;

import java. util. Set;

import java. util. SortedMap;

import java. util. TreeMap;

import util. ContainerTemplate;

import util. ItemTemplate;

/**

* Склад.

* @author AtemB

*

*/

public class Store {

/**

* Сортировщик по ключам карты упаковки.

* @author AtemB

*

*/

class MapKeysComparator implements Comparator<Container> {

private List<Integer> template;

public MapKeysComparator (int index) {

this. template = templates. get (index);

}

@Override

public int compare (Container c1, Container c2) {

return template. indexOf (c1. getId ()) - template. indexOf (c2. getId ());

}

}

/** Упаковываемые объекты. */

private List<Item> items;

/** Контейнеры. */

private List<Container> containers;

/** Генератор псевдослучайных чисел. */

private Random r = new Random ();

/** Слои Парето. */

private List<List<Item>> paretoSet;

/** Карта упаковки. */

private SortedMap<Container, List<Item>> map;

/** Остаток. */

private List<Item> rest;

private int [] containersSequence;

private List<List<Integer>> templates;

public Store () {

containers = new ArrayList<Container> ();

items = new ArrayList<Item> ();

rest = new ArrayList<Item> ();

}

/**

* Создать контейнеры.

* @param containersNum Число контейнеров.

* @param ct Шаблон контейнера.

* @param maxVolume Ограничение по объёму.

* @param maxCargo Ограничение по грузоподъёмности.

*/

public void createContainers (int containersNum, ContainerTemplate ct, int maxVolume, int maxCargo) {

Random r = new Random ();

int volumeDiapasonLength = maxVolume - ct. getVolume (). getBegin ();

int cargoDiapasonLength = maxCargo - ct. getCargo (). getBegin ();

for (int i = 0; i < containersNum; i++) {

containers. add (new Container (i + 1,r. nextInt (volumeDiapasonLength + 1) + ct. getVolume (). getBegin (),

r. nextInt (cargoDiapasonLength + 1) + ct. getCargo (). getBegin ()));

}

this. containersSequence = new int [containersNum];

for (int i = 0; i < containersNum; i++) {

containersSequence [i] = containers. get (i). getId ();

}

templates = new LinkedList<List<Integer>> ();

permutations (templates, containersSequence, containersNum);

map = new TreeMap<Container, List<Item>> (new MapKeysComparator (0));

for (Container c: containers) {

map. put (c, new LinkedList<Item> ());

}

}

/**

* Создать упаковываемые объекты.

* @param itemsNum Число объектов.

* @param it Шабло объекта.

* @param maxVolume Ограничение по объёму.

* @param maxWeight Ограничение по массе.

*/

public void createItems (int itemsNum, ItemTemplate it, int maxVolume, int maxWeight) {

int volumeDiapasonLength = maxVolume - it. getVolume (). getBegin ();

int weightDiapasonLength = maxWeight - it. getWeight (). getBegin ();

int r1DiapasonLength = it. getRate1 (). getEnd () - it. getRate1 (). getBegin ();

int r2DiapasonLength = it. getRate2 (). getEnd () - it. getRate2 (). getBegin ();

int r3DiapasonLength = it. getRate3 (). getEnd () - it. getRate3 (). getBegin ();

int r4DiapasonLength = it. getRate4 (). getEnd () - it. getRate4 (). getBegin ();

int r5DiapasonLength = it. getRate5 (). getEnd () - it. getRate5 (). getBegin ();

for (int i = 0; i < itemsNum; i++) {

items. add (new Item ( (i + 1) + "", r. nextInt (volumeDiapasonLength + 1) + it. getVolume (). getBegin (),

r. nextInt (weightDiapasonLength + 1) + it. getWeight (). getBegin (),

r. nextInt (r1DiapasonLength + 1) + it. getRate1 (). getBegin (),

r. nextInt (r2DiapasonLength + 1) + it. getRate2 (). getBegin (),

r. nextInt (r3DiapasonLength + 1) + it. getRate3 (). getBegin (),

r. nextInt (r4DiapasonLength + 1) + it. getRate4 (). getBegin (),

r. nextInt (r5DiapasonLength + 1) + it. getRate5 (). getBegin ()));

}

}

/**

* @return the containers

*/

public List<Container> getContainers () {

return containers;

}

/**

* @return the items

*/

public List<Item> getItemsClones () {

List<SimpleEntry<String, String>> itemPairs = new ArrayList<SimpleEntry<String, String>> ();

List<Item> newItems = new ArrayList<Item> ();

for (Item i: items) {

newItems. add (i. clone ());

if (i. hasPair ()) {

itemPairs. add (new SimpleEntry<String, String> (i. getId (), i. getPair (). getId ()));

}

}

for (Entry<String, String> e: itemPairs) {

getItemFromListByID (e. getKey (), newItems). setPair (getItemFromListByID (e. getValue (), newItems));

}

return newItems;

}

public List<Item> getItemsInstance () {

return items;

}

public void setEmpty () {

items. clear ();

containers. clear ();

}

/**

* @return the paretoSet

*/

public List<List<Item>> getParetoSetInstance () {

return paretoSet;

}

/**

* @return the paretoSet

*/

public List<List<Item>> getParetoSetClone () {

List<List<Item>> clone = new ArrayList<List<Item>> ();

List<SimpleEntry<String, String>> itemPairs = new ArrayList<SimpleEntry<String, String>> ();

for (List<Item> paretoLayer: paretoSet) {

List<Item> newParetoLayer = new ArrayList<Item> ();

for (Item i: paretoLayer) {

newParetoLayer. add (i. clone ());

if (i. hasPair ()) {

itemPairs. add (new SimpleEntry<String, String> (i. getId (), i. getPair (). getId ()));

}

}

clone. add (newParetoLayer);

}

for (Entry<String, String> e: itemPairs) {

getItemFromParetoSetByID (e. getKey (), clone). setPair (getItemFromParetoSetByID (e. getValue (), clone));

}

return clone;

}

/**

* @param paretoSet the paretoSet to set

*/

public void setParetoSet (List<List<Item>> paretoSet) {

this. paretoSet = paretoSet;

}

private Item getItemFromListByID (String id, List<Item> items) {

for (Item i: items) {

if (i. getId (). equals (id)) {

return i;

}

}

return null;

}

private Item getItemFromParetoSetByID (String id, List<List<Item>> paretoSet) {

for (List<Item> items: paretoSet) {

for (Item i: items) {

if (i. getId (). equals (id)) {

return i;

}

}

}

return null;

}

/**

* @return the map

*/

public SortedMap<Container, List<Item>> getMapInstance () {

return map;

}

/**

* @return the map

*/

public SortedMap<Container, List<Item>> getMapClone (int index) {

SortedMap<Container, List<Item>> clone = new TreeMap<Container, List<Item>> (new MapKeysComparator (index));

Set<Entry<Container, List<Item>>> set = map. entrySet ();

for (Entry<Container, List<Item>> e: set) {

List<Item> items = new ArrayList<Item> ();

for (Item i: e. getValue ()) {

items. add (i. clone ());

}

clone. put (e. getKey (). clone (), items);

}

return clone;

}

/**

* @param map the map to set

*/

public void setMap (SortedMap<Container, List<Item>> map) {

this. map = map;

}

public boolean paretoSetIsEmpty () {

boolean result = false;

return result;

}

/**

* @return the rest

*/

public List<Item> getRest () {

return rest;

}

/**

* @param rest the rest to set

*/

public void setRest (List<Item> rest) {

this. rest = rest;

}

private void swap (int [] array, int index1, int index2) {

int temp=array [index1];

array [index1] = array [index2];

array [index2] = temp;

}

private void addSequence (List<List<Integer>> sequence, int [] array) {

List<Integer> subSequence = new ArrayList<Integer> ();

for (int i = 0; i < array. length; i++) {

subSequence. add (new Integer (array [i]));

}

sequence. add (subSequence);

}

/**

*

* @param array - массив

* @param n - число переставляемых элементов

*/

private void permutations (List<List<Integer>> sequence, int [] array, int n) {

// Если нечего переставлять

if (n==1) {

addSequence (sequence, array);

} else {

for (int i=0; i<n; i++) {

swap (array, i,n-1); // меняем последний элемент с каждым,

// в том числе и с самим собой.

permutations (sequence, array,n-1); // запускаем функцию, для n-1 элементов

swap (array, i,n-1); // поигрались - и хватит. Надо вернуть массив в прежнее

// состояние для следующего обмена элементов

}

}

}

/**

* @return the templates

*/

public List<List<Integer>> getTemplates () {

return templates;

}

}

Пакет util.

ContainerTemplate. java

package util;

public class ContainerTemplate {

private IntegerDiapason volume;

private IntegerDiapason cargo;

public ContainerTemplate (IntegerDiapason volume, IntegerDiapason cargo) {

super ();

this. volume = volume;

this. cargo = cargo;

}

/**

* @return the volume

*/

public IntegerDiapason getVolume () {

return volume;

}

/**

* @return the cargo

*/

public IntegerDiapason getCargo () {

return cargo;

}

}

IntegerDiapason. java

package util;

public class IntegerDiapason {

private int begin;

private int end;

public IntegerDiapason (int begin, int end) {

super ();

this. begin = begin;

this. end = end;

}

/**

* @return the begin

*/

public int getBegin () {

return begin;

}

/**

* @return the end

*/

public int getEnd () {

return end;

}

}

ItemTemplate. java

package util;

public class ItemTemplate {

private IntegerDiapason weight;

private IntegerDiapason volume;

private IntegerDiapason rate1;

private IntegerDiapason rate2;

private IntegerDiapason rate3;

private IntegerDiapason rate4;

private IntegerDiapason rate5;

public ItemTemplate (IntegerDiapason weight, IntegerDiapason volume,

IntegerDiapason rate1, IntegerDiapason rate2,IntegerDiapason rate3, IntegerDiapason rate4, IntegerDiapason rate5) {

super ();

this. weight = weight;

this. volume = volume;

this. rate1 = rate1;

this. rate2 = rate2;

this. rate3 = rate3;

this. rate4 = rate4;

this. rate5 = rate5;

}

/**

* @return the weight

*/

public IntegerDiapason getWeight () {

return weight;

}

/**

* @return the volume

*/

public IntegerDiapason getVolume () {

return volume;

}

/**

* @return the rate1

*/

public IntegerDiapason getRate1 () {

return rate1;

}

/**

* @return the rate2

*/

public IntegerDiapason getRate2 () {

return rate2;

}

/**

* @return the rate3

*/

public IntegerDiapason getRate3 () {

return rate3;

}

/**

* @return the rate4

*/

public IntegerDiapason getRate4 () {

return rate4;

}

/**

* @return the rate5

*/

public IntegerDiapason getRate5 () {

return rate5;

}

}

Пакет gui.

GUI. java

package gui;

import javax. swing. JFrame;

import javax. swing. JTabbedPane;

import util. ContainerTemplate;

import util. ItemTemplate;

import core. Boss;

import core. Packer;

import core. Store;

/**

* Графический интерфейс.

* @author AtemB

*

*/

public class GUI {

private JFrame mainFrame;

private ObjectCreatorViewer oViewer;

private ParetoLayersViewer pViewer;

private ItemsViewer iViewer;

private ResultViewer rViewer;

private Store store;

public GUI (Store store, Packer packer, Boss boss, ContainerTemplate ct, ItemTemplate it) {

this. store = store;

JTabbedPane tabbedPane = new JTabbedPane ();

oViewer = new ObjectCreatorViewer (this, this. store, ct, it, 40,8);

iViewer = new ItemsViewer (store. getContainers (), store. getItemsInstance (), packer, boss);

pViewer = new ParetoLayersViewer (this, store, packer);

rViewer = new ResultViewer (this, store, packer, boss);

this. mainFrame = new JFrame ("Упаковка объектов");

tabbedPane. addTab ("Задание исходных данных", oViewer. getViewer ());

tabbedPane. addTab ("Объекты и контейнеры", iViewer. getViewer ());

tabbedPane. addTab ("Слои Парето", pViewer. getViewer ());

tabbedPane. addTab ("Результаты упаковки", rViewer. getViewer ());

this. mainFrame. setSize (1000, 550);

this. mainFrame. add (tabbedPane);

this. mainFrame. setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);

this. mainFrame. setVisible (true);

}

public void refreshItemsViewer () {

iViewer. refreshTables (store. getContainers (), store. getItemsInstance ());

}

}

ObjectCreatorViewer. java

package gui;

import java. awt. GridBagConstraints;

import java. awt. GridBagLayout;

import java. awt. Insets;

import java. awt. event. ActionEvent;

import java. awt. event. ActionListener;

import java. awt. event. MouseWheelEvent;

import java. awt. event. MouseWheelListener;

import java. util. HashMap;

import java. util. Map;

import javax. swing. BorderFactory;

import javax. swing. JButton;

import javax. swing. JLabel;

import javax. swing. JPanel;

import javax. swing. JSpinner;

import javax. swing. SpinnerNumberModel;

import util. ContainerTemplate;

import util. ItemTemplate;

import core. Store;

class ObjectCreatorViewer {

private JPanel viewer;

private JPanel containersPanel;

private JSpinner containersNum;

private JSpinner cVolume;

private JSpinner cargo;

private JPanel itemsPanel;

private JSpinner itemsNum;

private JSpinner iVolume;

private JSpinner weight;

private JButton createButton;

private Store store;

private ContainerTemplate ct;

private ItemTemplate it;

private int topItemsNum;

private int topContainersNum;

private GUI gui;

private Map<JSpinner, Integer [] > spinnersTopValues;

public ObjectCreatorViewer (GUI gui, Store store,

ContainerTemplate ct,

ItemTemplate it,

final int topItemsNum,

final int topContainersNum) {

this. gui = gui;

this. ct = ct;

this. it = it;

this. topItemsNum = topItemsNum;

this. topContainersNum = topContainersNum;

this. store = store;

this. spinnersTopValues = new HashMap<JSpinner, Integer [] > ();

JPanel containersNumPanel = new JPanel ();

containersNum = new JSpinner (new SpinnerNumberModel (1, 1, topContainersNum, 1));

addStandardWheelListener (containersNum);

spinnersTopValues. put (containersNum, new Integer [] {1, topContainersNum});

containersNumPanel. add (new JLabel ("Количесвто контейнеров (1 - " + topContainersNum + "): "));

containersNumPanel. add (containersNum);

JPanel cVolumePanel = new JPanel ();

int bottomContainerVolume = ct. getVolume (). getBegin ();

int topContainerVolume = ct. getVolume (). getEnd ();

cVolume = new JSpinner (new SpinnerNumberModel (bottomContainerVolume, bottomContainerVolume, topContainerVolume, 1));

addStandardWheelListener (cVolume);

spinnersTopValues. put (cVolume, new Integer [] {bottomContainerVolume, topContainerVolume});

cVolumePanel. add (new JLabel ("Объём одного контейнера, max (" + bottomContainerVolume + " - " + topContainerVolume +"): "));

cVolumePanel. add (cVolume);

JPanel cargoPanel = new JPanel ();

int bottomCargo = ct. getCargo (). getBegin ();

int topCargo = ct. getCargo (). getEnd ();

cargo = new JSpinner (new SpinnerNumberModel (bottomCargo, bottomCargo, topCargo, 1));

addStandardWheelListener (cargo);

spinnersTopValues. put (cargo, new Integer [] {bottomCargo, topCargo});

cargoPanel. add (new JLabel ("Грузоподъёмность одного контейнера, max (" + bottomCargo + " - " + topCargo + "): "));

cargoPanel. add (cargo);

containersPanel = new JPanel (new GridBagLayout ());

containersPanel. add (containersNumPanel, new GridBagConstraints (0, 0, 1, 1, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. BASELINE, new Insets (5, 5, 5,5), 0, 0));

containersPanel. add (cVolumePanel, new GridBagConstraints (0, 1, 1, 1, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. BASELINE, new Insets (5, 5, 5,5), 0, 0));

containersPanel. add (cargoPanel, new GridBagConstraints (0, 2, 1, 2, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. BASELINE, new Insets (5, 5, 5,5), 0, 0));

containersPanel. setBorder (BorderFactory. createTitledBorder ("Создание контейнеров"));

JPanel itemsNumPanel = new JPanel ();

itemsNum = new JSpinner (new SpinnerNumberModel (1, 1, topItemsNum, 1));

addStandardWheelListener (itemsNum);

spinnersTopValues. put (itemsNum, new Integer [] {1, topItemsNum});

itemsNumPanel. add (new JLabel ("Количесвто объектов (1 - " + topItemsNum + "): "));

itemsNumPanel. add (itemsNum);

JPanel iVolumePanel = new JPanel ();

int singleItemBottomVolume = it. getVolume (). getBegin ();

int singleItemTopVolume = it. getVolume (). getEnd ();

iVolume = new JSpinner (new SpinnerNumberModel (singleItemBottomVolume, singleItemBottomVolume, singleItemTopVolume, 1));

addStandardWheelListener (iVolume);

spinnersTopValues. put (iVolume, new Integer [] {singleItemBottomVolume, singleItemTopVolume});

iVolumePanel. add (new JLabel ("Объём одного объекта, max (" + singleItemBottomVolume + " - " + singleItemTopVolume + "): "));

iVolumePanel. add (iVolume);

JPanel weightPanel = new JPanel ();

int singleItemBottomWeight = it. getVolume (). getBegin ();

int singleItemTopWeight = it. getVolume (). getEnd ();

weight = new JSpinner (new SpinnerNumberModel (singleItemBottomWeight, singleItemBottomWeight, singleItemTopWeight, 1));

addStandardWheelListener (weight);

spinnersTopValues. put (weight, new Integer [] {singleItemBottomWeight, singleItemTopWeight});

weightPanel. add (new JLabel ("Вес одного объекта, max (" + singleItemBottomWeight + " - " + singleItemTopWeight + "): "));

weightPanel. add (weight);

itemsPanel = new JPanel (new GridBagLayout ());

itemsPanel. add (itemsNumPanel, new GridBagConstraints (0, 0, 1, 1, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

itemsPanel. add (iVolumePanel, new GridBagConstraints (0, 1, 1, 1, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

itemsPanel. add (weightPanel, new GridBagConstraints (0, 2, 1, 1, 0, 0, GridBagConstraints. NORTHWEST,

GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

itemsPanel. setBorder (BorderFactory. createTitledBorder ("Создание объектов"));

createButton = new JButton ("Создать");

createButton. addActionListener (new ActionListener () {

@Override

public void actionPerformed (ActionEvent arg0) {

Store s = ObjectCreatorViewer. this. store;

s. setEmpty ();

s. createContainers (getSpinnerValue (containersNum), ObjectCreatorViewer. this. ct, getSpinnerValue (cVolume), getSpinnerValue (cargo));

// LayouterLauncher. printContainersSumParameters (s. getContainers ());

s. createItems (getSpinnerValue (itemsNum), ObjectCreatorViewer. this. it, getSpinnerValue (iVolume), getSpinnerValue (weight));

// LayouterLauncher. printItemsSumParameters (s. getItems ());

ObjectCreatorViewer. this. gui. refreshItemsViewer ();

}

});

viewer = new JPanel (new GridBagLayout ());

viewer. add (containersPanel, new GridBagConstraints (0, 0, 1, 1, 1, 1, GridBagConstraints. NORTHWEST, GridBagConstraints. VERTICAL, new Insets (5, 5, 5,5), 0, 0));

viewer. add (itemsPanel, new GridBagConstraints (1, 0, 1, 1, 1, 1, GridBagConstraints. NORTHEAST, GridBagConstraints. VERTICAL, new Insets (5, 5, 5,5), 0, 0));

viewer. add (createButton, new GridBagConstraints (1, 1, 1, 1, 0, 0, GridBagConstraints. SOUTHEAST, GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

}

/**

* @return the viewer

*/

public JPanel getViewer () {

return viewer;

}

private int getSpinnerValue (JSpinner s) {

return ( (SpinnerNumberModel) s. getModel ()). getNumber (). intValue ();

}

int getContainersNum () {

return getSpinnerValue (containersNum);

}

int getMaxContainerVolume () {

return getSpinnerValue (cVolume);

}

int getMaxCargo () {

return getSpinnerValue (cargo);

}

int getItemsNum () {

return getSpinnerValue (itemsNum);

}

int getMaxItemVolume () {

return getSpinnerValue (iVolume);

}

int getMaxWeight () {

return getSpinnerValue (weight);

}

/**

* @return the topItemsNum

*/

public int getTopItemsNum () {

return topItemsNum;

}

/**

* @return the topContainersNum

*/

public int getTopContainersNum () {

return topContainersNum;

}

private void addStandardWheelListener (final JSpinner spinner) {

spinner. addMouseWheelListener (new MouseWheelListener () {

@Override

public void mouseWheelMoved (MouseWheelEvent e) {

int value = getSpinnerValue (spinner) + ( (Integer) e. getWheelRotation () * - 1);

Integer [] values = spinnersTopValues. get (spinner);

int bottom = values [0];

int top = values [1];

if (bottom <= value && value <= top) {

( (JSpinner) e. getComponent ()). setValue (value);

}

}

});

}

}

ItemsViewer. java

package gui;

import java. awt. GridBagConstraints;

import java. awt. GridBagLayout;

import java. awt. Insets;

import java. awt. event. ActionEvent;

import java. awt. event. ActionListener;

import java. awt. event. MouseAdapter;

import java. awt. event. MouseEvent;

import java. util. HashSet;

import java. util. List;

import java. util. Set;

import javax. swing. JButton;

import javax. swing. JLabel;

import javax. swing. JPanel;

import javax. swing. JScrollPane;

import javax. swing. JTable;

import javax. swing. event. TableModelEvent;

import javax. swing. event. TableModelListener;

import javax. swing. table. TableModel;

import javax. swing. table. TableRowSorter;

import core. Boss;

import core. Container;

import core. Item;

import core. Packer;

class ItemsViewer {

class ContainerTableModel implements TableModel {

private List<Container> containers;

private Set<TableModelListener> listeners = new HashSet<TableModelListener> ();

public ContainerTableModel (List<Container> containers) {

this. containers = containers;

}

@Override

public void addTableModelListener (TableModelListener columnIndex) {

listeners. add (columnIndex);

}

@Override

public Class<? > getColumnClass (int columnIndex) {

return Integer. class;

}

@Override

public int getColumnCount () {

return 3;

}

@Override

public String getColumnName (int columnIndex) {

switch (columnIndex) {

case 0:

return "ID";

case 1:

return "Объём";

case 2:

return "Грузоподъёмность";

}

return "column index error: \ngetted index = " + columnIndex + ",\nmost admissible index = " + (getColumnCount () - 1);

}

@Override

public int getRowCount () {

return containers. size ();

}

@Override

public Object getValueAt (int rowIndex, int columnIndex) {

Container c = containers. get (rowIndex);

switch (columnIndex) {

case 0:

return c. getId ();

case 1:

return c. getVolume ();

case 2:

return c. getCargo ();

}

return null;

}

@Override

public boolean isCellEditable (int rowIndex, int columnIndex) {

switch (columnIndex) {

case 0:

return false;

case 1:

case 2:

return true;

}

return false;

}

@Override

public void removeTableModelListener (TableModelListener l) {

listeners. remove (l);

}

@Override

public void setValueAt (Object arg0, int rowIndex, int columnIndex) {

Container c = containers. get (rowIndex);

switch (columnIndex) {

case 1:

c. setVolume ( (int) arg0);

break;

case 2:

c. setCargo ( (int) arg0);

break;

}

}

}

class ItemTableModel implements TableModel {

private List<Item> items;

private Set<TableModelListener> listeners = new HashSet<TableModelListener> ();

public ItemTableModel (List<Item> items) {

this. items = items;

}

@Override

public void addTableModelListener (TableModelListener l) {

listeners. add (l);

}

@Override

public Class<? > getColumnClass (int columnIndex) {

switch (columnIndex) {

case 0:

return Integer. class;

case 1:

return Integer. class;

case 2:

return Integer. class;

case 3:

return Integer. class;

case 4:

return Integer. class;

case 5:

return Integer. class;

case 6:

return Integer. class;

case 7:

return Integer. class;

case 8:

return Double. class;

case 9:

return String. class;

}

return null;

}

@Override

public int getColumnCount () {

return 10;

}

@Override

public String getColumnName (int columnIndex) {

switch (columnIndex) {

case 0:

return "ID";

case 1:

return "Объём";

case 2:

return "Вес";

case 3:

return "Кр.1";

case 4:

return "Кр.2";

case 5:

return "Кр.3";

case 6:

return "Кр.4";

case 7:

return "Кр.5";

case 8:

return "Полезность";

case 9:

return "Пара";

}

return "item index error: \ngetted index = " + columnIndex + ",\nmost admissible index = " + (getColumnCount () - 1);

}

@Override

public int getRowCount () {

return items. size ();

}

@Override

public Object getValueAt (int rowIndex, int columnIndex) {

switch (columnIndex) {

case 0:

return Integer. parseInt (items. get (rowIndex). getId ());

case 1:

return items. get (rowIndex). getVolume ();

case 2:

return items. get (rowIndex). getWeight ();

case 3:

return items. get (rowIndex). getRate1 ();

case 4:

return items. get (rowIndex). getRate2 ();

case 5:

return items. get (rowIndex). getRate3 ();

case 6:

return items. get (rowIndex). getRate4 ();

case 7:

return items. get (rowIndex). getRate5 ();

case 8:

return boss. getUtility (items. get (rowIndex));

case 9:

if (items. get (rowIndex). getPair ()! = null) {

return items. get (rowIndex). getPair (). getId ();

} else {

return null;

}

}

return null;

}

@Override

public boolean isCellEditable (int rowIndex, int columnIndex) {

if (columnIndex! = 0 && columnIndex! = 8 && columnIndex! = 9) {

return true;

}

return false;

}

@Override

public void removeTableModelListener (TableModelListener l) {

listeners. remove (l);

}

@Override

public void setValueAt (Object aValue, int rowIndex, int columnIndex) {

Item i = items. get (rowIndex);

switch (columnIndex) {

case 1:

i. setVolume ( (Integer) aValue);

break;

case 2:

i. setWeight ( (Integer) aValue);

break;

case 3:

i. setRate1 ( (Integer) aValue);

break;

case 4:

i. setRate2 ( (Integer) aValue);

break;

case 5:

i. setRate3 ( (Integer) aValue);

break;

case 6:

i. setRate4 ( (Integer) aValue);

break;

case 7:

i. setRate5 ( (Integer) aValue);

break;

}

}

public void recountUtilities () {

for (int i = 0; i < items. size (); i++) {

setValueAt (ItemsViewer. this. boss. getUtility (items. get (i)), i,

8);

}

}

Item getElement (int index) {

return items. get (index);

}

List<Item> getElements () {

return items;

}

}

private JPanel viewer;

private JTable itemTable;

private JTable containersTable;

private JButton createPairButton;

private JButton breakPairButton;

private JLabel pairsNum;

private JLabel pairsCount;

private Packer packer;

private Boss boss;

public ItemsViewer (List<Container> containers, List<Item> items, Packer packer, Boss boss) {

this. boss = boss;

this. packer = packer;

viewer = new JPanel (new GridBagLayout ());

ItemTableModel itm = new ItemTableModel (items);

itm. addTableModelListener (new TableModelListener () {

@Override

public void tableChanged (TableModelEvent e) {

( (ItemTableModel) e. getSource ()). recountUtilities ();

}

});

itemTable = new JTable (itm);

TableRowSorter<ItemTableModel> sorter = new TableRowSorter<ItemTableModel> ( (ItemTableModel) itemTable. getModel ());

sorter. setSortable (9, false);

itemTable. setRowSorter (sorter);

itemTable. addMouseListener (new MouseAdapter () {

@Override

public void mouseReleased (MouseEvent arg0) {

int [] selectedRowIndices = ( (JTable) arg0. getComponent ()). getSelectedRows ();

if (selectedRowIndices. length == 2) {

breakPairButton. setEnabled (false);

boolean single = true;

for (int index: selectedRowIndices) {

single = ( (JTable) arg0. getComponent ()). getModel (). getValueAt (index,

9) == null;

if (! single) {

createPairButton. setEnabled (false);

break;

}

}

if (single) {

createPairButton. setEnabled (true);

}

} else if (selectedRowIndices. length == 1) {

createPairButton. setEnabled (false);

if ( ( (ItemTableModel) itemTable. getModel ()). getElement (selectedRowIndices [0]). hasPair ()) {

breakPairButton. setEnabled (true);

} else {

breakPairButton. setEnabled (false);

}

} else {

createPairButton. setEnabled (false);

breakPairButton. setEnabled (false);

}

}

});

containersTable = new JTable (new ContainerTableModel (containers));

containersTable. setRowSorter (new TableRowSorter<ContainerTableModel> ( (ContainerTableModel) containersTable. getModel ()));

createPairButton = new JButton ("Создать пару");

createPairButton. addActionListener (new ActionListener () {

@Override

public void actionPerformed (ActionEvent e) {

int [] selectedRowIndices = itemTable. getSelectedRows ();

Item i1 = ( (ItemTableModel) itemTable. getModel ()). getElement (selectedRowIndices [0]);

Item i2 = ( (ItemTableModel) itemTable. getModel ()). getElement (selectedRowIndices [1]);

ItemsViewer. this. packer. createPair (i1, i2);

pairsCount. setText (ItemsViewer. this. packer. countPairs ( ( (ItemTableModel) itemTable. getModel ()). getElements ()) + "");

itemTable. repaint ();

( (JButton) e. getSource ()). setEnabled (false);

}

});

createPairButton. setEnabled (false);

breakPairButton = new JButton ("Разбить пару");

breakPairButton. addMouseListener (new MouseAdapter () {

@Override

public void mousePressed (MouseEvent e) {

Item i1 = ( (ItemTableModel) itemTable. getModel ()). getElement (itemTable. getSelectedRows () [0]);

Item i2 = i1. getPair ();

ItemsViewer. this. packer. breakPair (i1, i2);

itemTable. repaint ();

( (JButton) e. getSource ()). setEnabled (false);

pairsCount. setText (ItemsViewer. this. packer. countPairs ( ( (ItemTableModel) itemTable. getModel ()). getElements ()) + "");

}

});

breakPairButton. setEnabled (false);

pairsNum = new JLabel ("Количество пар: ");

pairsCount = new JLabel (packer. countPairs ( ( (ItemTableModel) itemTable. getModel ()). getElements ()) + "");

JPanel buttons = new JPanel ();

buttons. add (createPairButton);

buttons. add (breakPairButton);

JPanel labels = new JPanel ();

labels. add (pairsNum);

labels. add (pairsCount);

viewer. add (new JScrollPane (itemTable), new GridBagConstraints (0, 0, 1, 1, 1, 1, GridBagConstraints. NORTHWEST, GridBagConstraints. VERTICAL, new Insets (5, 5, 5,5), 0, 0));

viewer. add (new JScrollPane (containersTable), new GridBagConstraints (1, 0, 1, 1, 1, 1, GridBagConstraints. NORTHWEST, GridBagConstraints. VERTICAL, new Insets (5, 5, 5,5), 0, 0));

viewer. add (buttons, new GridBagConstraints (0, 2, 1, 1, 1, 0, GridBagConstraints. SOUTHWEST, GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

viewer. add (labels, new GridBagConstraints (1, 2, 1, 1, 1, 0, GridBagConstraints. SOUTHWEST, GridBagConstraints. NONE, new Insets (5, 5, 5,5), 0, 0));

}

public void refreshTables (List<Container> containers, List<Item> items) {

itemTable. setModel (new ItemTableModel (items));

containersTable. setModel (new ContainerTableModel (containers));

}

/**

* @return the viewer

*/

public JPanel getViewer () {

return viewer;

}

}

ParetoLayersViewer. java

package gui;

import java. awt. GridBagConstraints;

import java. awt. GridBagLayout;

import java. awt. Insets;

import java. awt. event. ActionEvent;

import java. awt. event. ActionListener;

import java. util. HashSet;

import java. util. List;

import java. util. Set;

import javax. swing. JButton;

import javax. swing. JCheckBox;

import javax. swing. JPanel;

import javax. swing. JScrollPane;

import javax. swing. JTable;

import javax. swing. event. TableModelListener;

import javax. swing. table. TableColumn;

import javax. swing. table. TableModel;

import core. Item;

import core. Packer;

import core. Store;

class ParetoLayersViewer {

class ParetoLayersTableModel implements TableModel {

private List<List<Item>> paretoLayers;

private Set<TableModelListener> listeners = new HashSet<TableModelListener> ();

public ParetoLayersTableModel (List<List<Item>> paretoLayers) {

super ();

this. paretoLayers = paretoLayers;

}

@Override

public void addTableModelListener (TableModelListener l) {

listeners. add (l);

}

@Override

public Class<? > getColumnClass (int columnIndex) {

return String. class;

}

@Override

public int getColumnCount () {

int maxLayerSize = 0;

for (List<Item> l: paretoLayers) {

int currentLayerSize = l. size ();

if (maxLayerSize < currentLayerSize) {

maxLayerSize = currentLayerSize;

}

}

return maxLayerSize;

}

@Override

public String getColumnName (int columnIndex) {

return (columnIndex + 1) + "";

}

@Override

public int getRowCount () {

return paretoLayers. size ();

}

@Override

public Object getValueAt (int rowIndex, int columnIndex) {

List<Item> paretoLayer = paretoLayers. get (rowIndex);

if (paretoLayer. size () > columnIndex) {

return paretoLayer. get (columnIndex). getId ();

}

return null;

}

@Override

public boolean isCellEditable (int rowIndex, int columnIndex) {

return false;

}

@Override

public void removeTableModelListener (TableModelListener l) {

listeners. remove (l);

}

@Override

public void setValueAt (Object aValue, int rowIndex, int columnIndex) {

}

}

private JPanel viewer;

private JTable paretoLayersTable;

private JCheckBox byUtilityBox;

private JCheckBox byVolumeBox;

private JCheckBox byWeightBox;

private JCheckBox processPairsBox;

private JButton recountButton;

private Store store;

private Packer packer;

public ParetoLayersViewer (GUI gui, Store store, Packer packer) {

this. store = store;

this. packer = packer;

this. viewer = new JPanel (new GridBagLayout ());

this. byUtilityBox = new JCheckBox ("По полезности", false);

byUtilityBox. addActionListener (new ActionListener () {

@Override

public void actionPerformed (ActionEvent arg0) {

refreshBoxes ();

}

});

this. byVolumeBox = new JCheckBox ("По объёму", false);

this. byWeightBox = new JCheckBox ("По весу", false);

this. recountButton = new JButton ("Пересчитать");

recountButton. addActionListener (new ActionListener () {

@Override

public void actionPerformed (ActionEvent e) {

recountLayers (ParetoLayersViewer. this. store. getItemsClones ());

}

});

processPairsBox = new JCheckBox ("Обрабатывать парные объекты", true);

JPanel checkBoxesPanel = new JPanel ();

checkBoxesPanel. add (byVolumeBox);

checkBoxesPanel. add (byWeightBox);

checkBoxesPanel. add (byUtilityBox);

checkBoxesPanel. add (processPairsBox);

checkBoxesPanel. add (recountButton);

paretoLayersTable = new JTable ();

viewer. add (new JScrollPane (paretoLayersTable), new GridBagConstraints (0, 0, 1, 1, 1, 1, GridBagConstraints. NORTHWEST, GridBagConstraints. BOTH, new Insets (5, 5, 0, 0), 0, 0));

viewer. add (checkBoxesPanel, new GridBagConstraints (0, 1, 1, 1, 1, 1, GridBagConstraints. SOUTHWEST, GridBagConstraints. NONE, new Insets (5, 0, 5, 0), 0, 0));

refreshBoxes ();

}

public void recountLayers (List<Item> sourceSet) {

if (processPairsBox. isSelected ()) {

sourceSet = packer. processPairs (sourceSet);

}

List<List<Item>> paretoSet = packer. createParetoSet (sourceSet);

if (byUtilityBox. isSelected ()) {

for (List<Item> paretoLayer: paretoSet) {

packer. sort (paretoLayer, Packer. SORT_TYPE. UTILITY);

}

} else {

if (byVolumeBox. isSelected () && byWeightBox. isSelected ()) {

for (List<Item> paretoLayer: paretoSet) {

packer. sort (paretoLayer, Packer. SORT_TYPE. VOLUME, Packer. SORT_TYPE. WEIGHT);

}

} else {

if (byVolumeBox. isSelected ()) {

for (List<Item> paretoLayer: paretoSet) {

packer. sort (paretoLayer, Packer. SORT_TYPE. VOLUME);

}

} else if (byWeightBox. isSelected ()) {

for (List<Item> paretoLayer: paretoSet) {

packer. sort (paretoLayer, Packer. SORT_TYPE. WEIGHT);

}

}

}

}

store. setParetoSet (paretoSet);

paretoLayersTable. setModel (new ParetoLayersTableModel (paretoSet));

for (int i = 0; i < paretoLayersTable. getColumnCount (); i++) {

TableColumn column = paretoLayersTable. getColumn ( (i + 1) + "");

column. setMinWidth (35);

}

}

/**

* @return the paretoLayersPanel

*/

public JPanel getViewer () {

return viewer;

}

private void refreshBoxes () {

boolean state =! byUtilityBox. isSelected ();

byVolumeBox. setEnabled (state);

byWeightBox. setEnabled (state);

}

}

ResultViewer. java

package gui;

import java. awt.component;

import java. awt. GridBagConstraints;

import java. awt. GridBagLayout;

import java. awt. Insets;

import java. awt. event. ActionEvent;

import java. awt. event. ActionListener;

import java. awt. event. ItemEvent;

import java. awt. event. ItemListener;

import java. text. DecimalFormat;

import java. text. DecimalFormatSymbols;

import java. util. ArrayList;

import java. util. HashSet;

import java. util. Hashtable;

import java. util. List;

import java. util. Set;

import java. util. SortedMap;

import javax. swing.comboBoxModel;

import javax. swing. ImageIcon;

import javax. swing. JButton;

import javax. swing. JComboBox;

import javax. swing. JLabel;

import javax. swing. JPanel;

import javax. swing. JScrollPane;

import javax. swing. JSplitPane;

import javax. swing. JTextPane;

import javax. swing. JTree;

import javax. swing. event. ListDataListener;

import javax. swing. tree. DefaultMutableTreeNode;

import javax. swing. tree. DefaultTreeCellRenderer;

import javax. swing. tree. DefaultTreeModel;

import javax. swing. tree. TreeCellRenderer;

import javax. swing. tree. TreePath;

import core. Boss;

import core. Container;


Подобные документы

  • Понятия, связанные с принятием решений в различных условиях. Примеры принятия решений в условиях определенности, риска и неопределенности. Модели и методы принятия решений. Страховой, валютный, кредитный риск. Интуитивное и рациональное решение.

    реферат [90,4 K], добавлен 16.01.2011

  • Назначение и краткая характеристика систем поддержки принятия решений. Концепции и принципы теории принятия решений. Получение информации, критерии принятия решений и их шкалы. Схема классификации возможных источников и способов получения информации.

    курсовая работа [132,5 K], добавлен 14.02.2011

  • Выбор планшетного ПК. Методы решения задач принятия решений в условиях неопределенности. Разработка математического обеспечения поддержки принятия решений на основе реализации стандартных и модифицированных алгоритмов теории исследования операций.

    курсовая работа [5,9 M], добавлен 22.01.2016

  • Оценка и выбор многокритериальных решений в условиях определенности и ранжирование исходного множества альтернатив (без учета выполнения ограничений). Принятие решений в условиях риска и неопределенности. Вычисление минимаксного критерия Севиджа.

    курсовая работа [128,2 K], добавлен 22.01.2015

  • Основные методы принятия решений. Применение активизирующих методов принятия решений в компании на примере "Менсей". Методы мозгового штурма, конференции идей, вопросов и ответов. Процесс разработки и принятия управленческих решений и их эффективность.

    курсовая работа [2,0 M], добавлен 24.12.2014

  • Понятие и сущность управленческих решений и их классификация. Основные понятия теории принятия решений. Применение методов принятия решений в условиях неопределенности. Выявление и диагностика проблем, возникающих в организации при изменении условий.

    курсовая работа [105,4 K], добавлен 01.04.2014

  • Подход к управлению как к науке и искусству. Общие сведения о теории принятия решений. Постулаты теории принятия оптимального решения. Классы утверждений психологической теории решений. Методы психологических исследований процессов принятия решений.

    реферат [26,2 K], добавлен 07.12.2010

  • Исследование роли управленческих решений, их классификация. Модели и этапы принятия управленческих решений. Особенности разделения труда в процессе принятия решений. Оценка среды принятия решений и рисков, методы прогнозирования для принятия решений.

    курсовая работа [233,1 K], добавлен 15.05.2019

  • Процесс подготовки и принятия управленческого решения. Методы принятия решений, направленных на достижение намеченных целей. Принятие управленческих решений в сложных кризисных условиях. Реализация альтернатив в условиях риска и неопределенности.

    курсовая работа [123,6 K], добавлен 30.03.2015

  • Анализ и принятие управленческих решений в условиях определенности, в условиях риска, в условиях неопределенности. Общие модели и методы принятия решений в условиях определенности, неопределенности и риска. Эффективность работы персонала.

    реферат [34,0 K], добавлен 15.12.2006

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.