Информационная система поддержки принятия решений в условиях многокритериальной оптимизации
Основные понятия теории принятия решений. Формализация задач принятия решений. Однокритериальные и многокритериальные задачи в условиях определенности. Методы оценки многокритериальных альтернатив. Методы построения аддитивной функции полезности.
Рубрика | Менеджмент и трудовые отношения |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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