RSS    

   Курсовая работа: Метод последовательных сравнений


 

3.  Описание интерфейса разработанного программного продукта

 

Окно приложения подразделяется на две основные области: область ввода данных для реализации Метода последовательных сравнений и область анализа и выполнения указанного метода.

Область ввода данных для реализации метода

Область анализа и выполнения метода

 

Длина первой области составляет 350 px, длина второй области – 230 px. Соотношение длин областей составляет 65%, в свою очередь, золотое сечение представляет отношение 2:3. Таким образом, созданный интерфейс программного продукта полностью удовлетворяет требованиям пропорциональности.

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

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

Таким образом, реорганизация анализируемого интерфейса не целесообразна. Спроектированный интерфейс является оптимальным, лаконичным и простым в использовании.


 

4.  Листинг

 

4.1 Класс «CombinationGenerator»

public class CombinationGenerator {

private int[] a;

private int n;

private int r;

private BigInteger numLeft;

private BigInteger total;

public CombinationGenerator(int n, int r) {

if (r > n) {

throw new IllegalArgumentException();

}

if (n < 1) {

throw new IllegalArgumentException();

}

this.n = n;

this.r = r;

a = new int[r];

BigInteger nFact = getFactorial(n);

BigInteger rFact = getFactorial(r);

BigInteger nminusrFact = getFactorial(n - r);

total = nFact.divide(rFact.multiply(nminusrFact));

reset();

}

//------

// Reset

//------

public void reset() {

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

a[i] = i;

}

numLeft = new BigInteger(total.toString());

} // Return number of combinations not yet generated

//------------------------------

public BigInteger getNumLeft() {

return numLeft;

}

//-----------------------------

// Are there more combinations?

//-----------------------------

public boolean hasMore() {

return numLeft.compareTo(BigInteger.ZERO) == 1;

} // Return total number of combinations

//--------------------------

public BigInteger getTotal() {

return total;

}

//------------------

// Compute factorial

//------------------

private static BigInteger getFactorial(int n) {

BigInteger fact = BigInteger.ONE;

for (int i = n; i > 1; i--) {

fact = fact.multiply(new BigInteger(Integer.toString(i)));

}

return fact;

}

//--------------------------------

// Generate next combination (algorithm from Rosen p. 286)

//----------------------------------

public int[] getNext() {

if (numLeft.equals(total)) {

numLeft = numLeft.subtract(BigInteger.ONE);

return a;

}

int i = r - 1;

while (a[i] == n - r + i) {

i--;

}

a[i] = a[i] + 1;

for (int j = i + 1; j < r; j++) {

a[j] = a[i] + j - i;

}

numLeft = numLeft.subtract(BigInteger.ONE);

return a;

}

}

4.2 Класс «ConditionPanel»

public class ConditionPanel extends javax.swing.JPanel {

public ConditionPanel() {

initComponents();

}

public void setCondition(int indices[], int num) {

String s;

s = " " + (indices[0] + 1) + " > ";

for (int i = 1; i < indices.length - 1; i++) {

s += (indices[i] + 1) + " + ";

}

s += (indices[indices.length - 1] + 1);

jLabel1.setText("" + num + ". " + s);

}

public void check() {

jCheckBox1.setSelected(!jCheckBox1.isSelected());

}

boolean isSelected() {

return jCheckBox1.isSelected();

}

}

 

4.3 Класс «MainFrame»

public class MainFrame extends javax.swing.JFrame {

/** Creates new form MainFrame */

public MainFrame() {

initComponents();

jList1.setCellRenderer(new ListCellRenderer() {

public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

Component comp = (Component)value;

comp.setBackground(isSelected ? Color.LIGHT_GRAY : Color.white);

return comp;

}

});

jList1.addMouseListener(new MouseAdapter() {

@Override

public void mouseReleased(MouseEvent e) {

vec.get(jList1.getSelectedIndex()).check();

jList1.updateUI();super.mouseReleased(e);

}

});

jSpinner1.setValue(2);

}

private Vector<ConditionPanel> vec;

private LinkedList<int[]> conditions;

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

int value = (Integer)jSpinner1.getValue();

conditions = new LinkedList<int[]>();

int[] lastNumIndex = new int[value];

for(int num : lastNumIndex) {

System.out.println(num);

}

for (int i = 3; i <= value; i++) {

int[] indices;

CombinationGenerator x = new CombinationGenerator(value, i);

while (x.hasMore()) {

indices = x.getNext();

conditions.add(indices.clone());

}

}

Collections.sort(conditions, new Comparator<int[]>() {

public int compare(int[] o1, int[] o2) {

if( o1[0] < o2[0] ) {

return -1;

} else if( o1[0] == o2[0] ) {

if(o1.length < o2.length) {

return -1;

} else {

return 0;

}

} else {

return 1;

}

}

});

vec = new Vector<ConditionPanel>();

int num = 1;

for(int[] indices : conditions) {

ConditionPanel list = new ConditionPanel();

list.setCondition(indices, num);

num++;

vec.add(list);

}

jList1.setListData(vec);

jList1.updateUI();

}

private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) {

jTable1.setModel(new DefaultTableModel((Integer)jSpinner1.getValue(), 3)

boolean[] canEdit = new boolean [] {

false, true, true

};

@Override

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex];

}

@Override

public String getColumnName(int column) {

String name = "";

switch(column) {

case 0:

name = "№";

break;

case 1:

name = "цель";

break;

case 2:

name = "оценка";

break;

}

return name;

}

});

for (int i = 0; i < (Integer)jSpinner1.getValue(); i++){

String s = "" + (1-0.1*i);

jTable1.setValueAt(i + 1, i, 0);

jTable1.setValueAt("цель " + (i + 1), i, 1);

jTable1.setValueAt(s, i, 2);

}

}

private float[] values;

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

jTable1.updateUI();

int count = (Integer)jSpinner1.getValue();

values = new float[count];

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

values[i] = Float.parseFloat((String) jTable1.getModel().getValueAt(i, 2));

}

if (jRadioButton1.isSelected()) {

manualSolve();

} else {

automaticSolve();

}

}

}

private void manualSolve() {

int i = checkConditions();

if (i !=-1){

JOptionPane.showMessageDialog(this, (i + 1) + " правило не выполнилось. Скорректируйте оценки");

}

else{

norm();

JOptionPane.showMessageDialog(this, "Принятые оценки корректны");

}

}

private void automaticSolve() {

ArrayList<Integer> ind = new ArrayList<Integer>();

ind.add(0);

for (int i = 1; i < conditions.size(); i++) {

int[] currentIndex = conditions.get(i);

int[] previousIndex = conditions.get(i - 1);

if (currentIndex[0] == previousIndex[0]

&& currentIndex.length == previousIndex.length) {

if (isConditionSelected(i) != isConditionSelected(i - 1)) {

JOptionPane.showMessageDialog(this, "Уловия не могут быть выполнены при данных значениях оценок !!!");

return;

}

}

if (currentIndex[0] == previousIndex[0]

&& currentIndex.length > previousIndex.length) {

if (isConditionSelected(i) == true && isConditionSelected(i - 1) == false) {

JOptionPane.showMessageDialog(this, "Уловия не могут быть выполнены при данных значениях оценок !!!");

return;

}

}

if(currentIndex.length != previousIndex.length) {

ind.add(i);

}

}

{

int first = 0;

ArrayList<Integer> sortedInd = new ArrayList<Integer>();

for (int size = values.length - 2; size > 0 ; size--) {

List<Integer> sublist = ind.subList(first, first + size);

Collections.reverse(sublist);

sortedInd.addAll(sublist);

first += size;

}

ind = sortedInd;

}

int n = ind.size();

float delta = 0.01f;

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

int conditionNum = ind.get(i);

int[] cond = conditions.get(conditionNum);

boolean solving = calculute(conditionNum, values);

boolean selected = isConditionSelected(conditionNum);

if (solving != selected) {

if (solving) {

float value = getSumm(conditionNum, values) - delta;

if (value > values[cond[0] + 1]) {

values[cond[0]] = value;

} else {

JOptionPane.showMessageDialog(this, "Уловия не могут быть выполнены при данных значениях оценок");

return;

}

} else {

float value = getSumm(conditionNum, values) + delta;

if(cond[0]==0){

values[cond[0]] = value;

} else {

float d = value - values[cond[0]];

values[cond[0]] = value;

for(int j = 0; j < cond[0]; j++) {

values[j] += d;

}

}

}

}

}

norm();

JOptionPane.showMessageDialog(this, "Принятые оценки корректны");

}

private int checkConditions() {

return checkConditions(conditions.size()-1, values);

}

private boolean isConditionSelected(int numCondition){

return vec.get(numCondition).isSelected();

}

private int checkConditions(int lastCondition, float[] values) {

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

boolean selected = isConditionSelected(i);

if (calculute(i, values) == !selected) {

return i;

}

}

return -1;

}

private boolean calculute(int i, float[] values) {

int[] indices = conditions.get(i);

float leftValue = values[indices[0]];

float summ = 0;

for (int j = 1; j < indices.length; j++) {

summ += values[indices[j]];

}

return leftValue > summ;

}

private float getSumm(int i, float[] values) {

int[] indices = conditions.get(i);

float summ = 0;

for (int j = 1; j < indices.length; j++) {

summ += values[indices[j]];

}

return summ;

}

public void norm() {

int count = values.length;

float val = values[0];

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

values[i] = values[i] / val;

jTable1.setValueAt("" + values[i], i, 2);

}

}

}


 

Выводы

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

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

·  формулирование цели экспертизы и разработка процедуры опроса;

·  формирование группы специалистов-аналитиков;

·  отбор и формирование группы экспертов;

·  проведение опроса;

·  анализ и обработка информации, полученной от экспертов;

·  синтез объективной (статистической) информации и информации, полученной от экспертов, с целью приведения их в форму, удобную для принятия решения.

Последовательность и содержание этих этапов будут изменяться в зависимости от реальных условий и ограничений при проведении экспертизы.

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


Список использованной литературы

1.  Электронный ресурс: Математико-статистические методы в менеджменте, http://window.edu.ru/window_catalog/pdf2txt?p_id=3216&p_page=2

2.  Электронный ресурс: Исследование Систем Управления, http://www.uproizvod.ru/index.php?option=com_content&task=view&id=7&Itemid=34&limit=1&limitstart=0


Список использованных программных средств

1.  NetBeans IDE, version number 6.8


Приложение 1


Страницы: 1, 2, 3


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.