|
Вопрос # 4 308/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Возникла проблема в поиске минимакса и максимини по платежной матрице. Если матрица не квадртаная, то результаты иногда (особенно если строк больше) получаются некорректными. хотелось бы узнать в чем тут проблема?
Код прилагаю.
Приложение: Переключить в обычный режим- procedure TMainForm.Button1Click(Sender: TObject);
-
- const
- MinLongint:Longint=-2147483647;
- MaxLongint:Longint=2147483647;
- var
-
- MinMaxA:Array[1..500] of Longint;
- MaxMinB:Array[1..500] of Longint;
- Index:Integer;
- IndexA:Integer;
- IndexB:Integer;
- MaxA:Integer;
- MaxB:Integer;
- Min:Longint;
- Max:Longint;
- MaxOptimalA:Integer;
- MaxOptimalB:Integer;
- ExMinMaxA:Array[1..500] of Longint;
- ExMaxMinB:Array[1..500] of Longint;
- Strategia:Array[1..500,1..500] of Longint;
- begin
-
- For Index:=1 to 500 do
- begin
- ExMinMaxA[Index]:=0;
- ExMaxMinB[Index]:=0;
- end;
-
- MaxA:=Grid.ColCount-1;
- MaxB:=Grid.RowCount-1;
-
-
- For IndexA:=1 to MaxA do
- For IndexB:=1 to MaxB do
- Strategia[IndexA, IndexB]:=StrToInt(Grid.Cells[IndexA, IndexB]);
-
-
-
- For IndexA:=1 to MaxA do
- begin
- Min:=MinLongint;
- Max:=MaxLongint;
- For IndexB:=1 to MaxB do
- begin
- if Strategia[IndexB,IndexA] < Max Then
- begin
- Max:=Strategia[Indexb, IndexA];
- MinMaxA[IndexA]:=Max;
- end;
- if Strategia[IndexA, IndexB] > Min then
- begin
- Min:=Strategia[IndexA, Indexb];
- MaxMinB[IndexA]:=Min;
- end;
- end;
- end;
-
-
- for Index:=1 to MaxA do
- for IndexA:=1 to MaxB do
- Grid.Cells[Index, IndexA]:='';
-
-
- Index:=0;
- Min:=MinLongint;
- Max:=MaxLongint;
-
-
- For IndexA:=1 to MaxA do
- begin
- if MinMaxA[IndexA] >Min then
- Min:=MinMaxA[IndexA];
-
- if MaxMinB[IndexA] < Max then
- Max:=MaxMinB[IndexA]
- end;
- Memo1.Lines[0]:= IntToStr(Min);
- Memo2.Lines[0]:= IntToStr(Max);
-
-
- for IndexA:=1 to MaxA do
- if MinMaxA[IndexA]= Min then
- begin
- Index:=Index+1;
- for IndexB:=1 to MaxA do
- begin
- Grid.Cells[IndexB, IndexA]:=IntToStr(Strategia[IndexB, IndexA]);
- ExMinMaxA[Index]:=IndexA;
- end;
- end;
-
- MaxOptimalA:=Index;
- Index:=0;
-
- for IndexB:=1 to MaxB do
- if MaxMinB[IndexB]= Max then
- begin
- Index:=Index+1;
- for IndexA:=1 to MaxB do
- begin
- Grid.Cells[IndexB, IndexA]:=IntToStr(Strategia[IndexB, IndexA]);
- ExMaxMinB[Index]:=IndexB;
- end;
- end;
-
- MaxOptimalB:=Index;
-
-
- end;
- end.
-
- end.
 |
Вопрос задал: Mr.Slade (статус: Посетитель)
Вопрос отправлен: 10 июня 2010, 20:33
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, Mr.Slade!
во-первых, очень плохо использовать для имен переменных зарезервированные слова (например, min,max). во-вторых, нумерация столбцов и строк в stringgrid начинается с 0, а не с 1. в-третьих, перепутаны знаки сравнения в условиях. Должно быть if ...> Max then ... и if ...< Min then ... Кроме того, переменные MaxLongint и MinLongint - абсолютно лишние. Вам же надо найти минимальное и максимальное значение в строке, зачем сравнивать с минимальным и максимальным значением целых чисел? Надо присвоить переменным Max и Min значение первого сравниваемого столбца из соответствующей строки и сравнивать остальные значения с ним.
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 10 июня 2010, 22:00
Оценка за ответ: 5
Комментарий к оценке: спасибо, но почему же идеально работает в квадратных матрицах?
"очень плохо использовать для имен переменных зарезервированные слова (например, min,max)" - это может быть причиной багов при неквадратных матрицах?
|
Мини-форум вопроса
Всего сообщений: 19; последнее сообщение — 11 июня 2010, 11:21; участников в обсуждении: 3.
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 22:01 [#1]:
Почему-то половину ответа проглотило, дописываю:
if ... < Min then ... Кроме того, переменные MaxLongint и MinLongint - абсолютно лишние. Вам же надо найти минимальное и максимальное значение в строке, зачем сравнивать с минимальным и максимальным значением целых чисел? Надо присвоить переменным Max и Min значение первого сравниваемого столбца из соответствующей строки и сравнивать остальные значения с ним.
|
|
min@y™ (статус: Доктор наук), 10 июня 2010, 22:02 [#2]:
В чём задача-то заключается? Что с матрицей надо сделать?
Код не смотрел, ибо, хотя форматирование похоже на моё, однако комментарев 0 целых - хрен десятых. А это не есть комильфо.
Вообще, ты поставь себя на место тех людей, которые читают вопрос. Ты бы стал разбираться в таком коде?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 22:13 [#3]:
Цитата (Мережников Андрей):
это может быть причиной багов при неквадратных матрицах?
Бывает, когда программы, написанные с ошибкой, правильно работают на некоторых наборах данных. Точную причину можно определить только прогоняя в отладчике и смотря значения переменных.
|
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 22:19 [#4]:
вообще, судя по алгоритму - в переменную Max в итоге заносится минимальное значение, а в Min, наоборот - максимальное. Да, еще - массив Strategia дальше в программе используется? Если нет, то зачем он вообще нужен? Можно работать напрямую с stringgrid, не расходуя лишнего память. Если все-таки нужен, то лучше сделать его динамическим, как и массивы MaxMinB и MinMaxA.
|
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 22:21 [#5]:
Программа в режиме отладки в Delphi запускается по F8 (или через меню - пошаговое выполнение). Либо в программе делается точка останова, запускается на выполнение как обычно. А затем в пошаговом режиме проверяется нужный участок кода
|
|
Ерёмин А.А. (статус: *Администратор), 10 июня 2010, 23:15 [#6]:
Цитата (Мережников Андрей):
Почему-то половину ответа проглотило
Потому что знак "меньше" - знак открывающего тега. Привет от браузера. Достаточно поставить после него пробел и он будет воспринят правильно. Ответ поправил.
|
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 23:46 [#7]:
to Ерёмин - спасибо. Я догадался, после того, как несколько раз пришлось исправлять сообщение в мини-форуме Жаль только ответы корректировать нельзя. И не очень удобно стало, что список вопросов - зацикленный. С последнего попадаешь на первый.
|
|
Мережников Андрей (статус: Абитуриент), 10 июня 2010, 23:58 [#8]:
как конкретно пробовали. "код в студию"!
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 00:00 [#9]:
и уточните все-таки задачу. Что конкретно надо найти? Минимальное значение среди максимальных в строках или максимальное среди минимальных в строках?
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 00:29 [#10]:
понятно. значит так:
var mn_s,mx_s:Longint;
....
//ищем минимальное в строках
//если в stringgrid нулевые строки и столбцы заполнены
//значениями, то 2 надо заменить на 1, а 1 на 0
for IndexB:=2 to MaxB
do begin
mn_s:=Strategia[1,IndexB];
for IndexA:=1 to MaxA
do if Strategia[IndexA,IndexB] < mn_s
then begin
mn_s:=Strategia[IndexA,IndexB];
MaxMinB[IndexB]:=mn_s;
end;
end;
//ищем максимальное в столбцах
for IndexA:=2 to MaxA
do begin
mx_s:=Strategia[IndexA,1];
for IndexB:=1 to MaxB
do if Strategia[IndexA,IndexB] > mx_s
then begin
mx_s:=Strategia[IndexA,IndexB];
MinMaxA[IndexA]:=mx_s;
end;
end;
//ищем максимум среди минимумов
mx_s:=MaxMinB[1];
for IndexB:=2 to MaxB
do if MaxMinB[IndexB] > mx_s
then mx_s:=MaxMinB[IndexB];
//ищем минимум среди максимумов
mn_s:=MinMaxA[1];
for IndexA:=2 to MaxA
do if MinMaxA[IndexA] < mn_s
then mn_s:=MinMaxA[IndexA];
не совсем понятно зачем опять из Strategia переписывать значения в stringgrid
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 00:38 [#11]:
вывод можно сделать проще, если при поиске минмаксов и максминов запомнить соответственно номер столбца и номер строки
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 00:43 [#12]:
хотя, такой вариант (с запоминанием) сработает только если минмакс или максмин в единственном числе
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 01:00 [#13]:
//ищем максимум среди минимумов
IndexB:=1;
for Index:=2 to MaxB
do if MaxMinB[Index] > MaxMinB[IndexB]
then IndexB:=Index;
//ищем минимум среди максимумов
IndexA:=1;
for Index:=2 to MaxA
do if MinMaxA[Index] < MinMaxA[IndexA]
then IndexA:=Index;
//соответственно:
//MaxMinB[IndexB] - первый максимум среди минимумов
//IndexB - номер строки, содержащей максимум
//MinMaxA[IndexA] - первый минимум среди максимумов
//IndexA - номер столбца, содержащего минимум
пришлите код, который получился после изменений
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 06:05 [#14]:
после вставки предложенного кода в своей программе везде замените Max на mx_s, а Min на mn_s
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 06:07 [#15]:
там, где сделан вывод в таблицу. переменные Max и Min удалите совсем. Объявление констант тоже можно выкинуть - оно лишнее. Все, удачи. Во сколько сдача? По московскому времени?
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 11:13 [#16]:
в том исходнике, который Вы прислали - остались Min и Max
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 11:16 [#17]:
for IndexB:=1 to MaxB do
if MaxMinB[IndexB]= Max then
begin
Index:=Index+1;
for IndexA:=1 to MaxB do
begin
Grid.Cells[IndexB, IndexA]:=IntToStr(Strategia[IndexB, IndexA]); //в этой строке, на мой взгляд наод IndexA
и IndexB поменять местами
ExMaxMinB[Index]:=IndexB; {получение оптимальных номеров столбцов для игрока В}
end;
end;
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 11:18 [#18]:
если сделали запоминание НОМЕРА строки с максимумом и НОМЕРА столбца с минимумо, то цикл по заполнению грида надо тоже изменить
|
|
Мережников Андрей (статус: Абитуриент), 11 июня 2010, 11:21 [#19]:
на такие:
//заполнение строки
for Index:=1 to MaxA
do grid.cells[Index,IndexB]:=IntToStr(Strategia[Index,IndexB]);
//заполнение столбца
for Index:=1 to MaxB
do grid.cells[IndexA,Index]:=IntToStr(Strategia[IndexA,Index]);
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|