В al oop, как только условие «если» будет выполнено, оно просто продолжает выполнять оператор под условием независимо от условия. PYTHON - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь написать код, который находит лучшее решение для линейной задачи. Итак, для конкретной проблемы c я написал следующее:

import random

appropriate = 0
x_current = [0,0,0,0,0]
x_candidate = [0,0,0,0,0]
Optimal = []

def constraintsx(x):
    appropriate = 0 
    if 3*x[0] + x[1] + 3*x[2] + 2*x[3] + 4*x[4] < 10:
        appropriate = 1
        if x[2] - x[3] > 0:
            appropriate = 1
            if x[1] - x[4] > 0:
                appropriate = 1
                if x[0] + x[1] + x[2] + x[3] + x[4] > 4:
                    appropriate = 1
    return appropriate

def purpose(x):
    FValue = x[0] + 3*x[1] - 2*x[2] + 2*x[3] - x[4]
    return FValue



while True:

    if constraintsx(x_current) == 0:
        break

    else:
        for i in range(0,5):
            x_current[i] = random.randint(0,1)



for k in range(0,10):

    while True:

        for j in range(0,5):
            x_candidate[j] = random.randint(0,1)

        if Kisitx(x_candidate) == 0:

            print(k,"k") #I wrote these prints to see where the problem is 
            print(x_candidate,"candidate")
            print(x_current,"current")
            print(purpose(x_candidate),"candidate")
            print(purpose(x_current),"current\n")

            if purpose(x_candidate)>purpose(x_current):
                  x_current = x_candidate

                  print(purpose(x_current),"\n")

                  break



            break


Optimal = x_current
FValue = purpose(Optimal)
print("The best solution:",Optimal,"\nSolution value=",FValue)

Но всякий раз, когда это условие гарантировано;

if purpose(x_candidate)>purpose(x_current):
      x_current = x_candidate

Он просто изменяет «x_current» независимо от условия.

Итак, вот результат:

0 k
[1, 0, 1, 0, 1] candidate
[1, 0, 1, 1, 1] current
-2 candidate
0 current

1 k
[1, 0, 1, 1, 1] candidate
[1, 0, 1, 1, 1] current
0 candidate
0 current

2 k
[1, 1, 0, 1, 1] candidate
[1, 0, 1, 1, 1] current
5 candidate
0 current

5 

3 k
[1, 0, 1, 1, 1] candidate
[1, 0, 1, 1, 1] current
0 candidate
0 current

4 k
[0, 1, 1, 1, 1] candidate
[0, 1, 1, 1, 1] current
2 candidate
2 current

5 k
[1, 1, 0, 1, 1] candidate
[1, 1, 0, 1, 1] current
5 candidate
5 current

6 k
[1, 1, 1, 1, 1] candidate
[1, 1, 1, 1, 1] current
3 candidate
3 current

7 k
[1, 0, 1, 1, 1] candidate
[1, 0, 1, 1, 1] current
0 candidate
0 current

8 k
[1, 1, 0, 1, 1] candidate
[1, 1, 0, 1, 1] current
5 candidate
5 current

9 k
[1, 1, 1, 0, 1] candidate
[1, 1, 1, 0, 1] current
1 candidate
1 current

The best solution: [1, 1, 1, 0, 1] 
Solution value= 1

Как вы видите, условие будьте уверены, это просто продолжит изменять "x_current". Я новичок в Python, и я действительно не понимаю, почему он это делает. И я не знаю, как я могу описать эту ситуацию, хотя я пытался, но я не могу найти ничего подобного.

Почему он это делает? и как я могу решить это?

Спасибо за вашу помощь и внимание. Спасибо за все ...

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Не уверен, что понимаю, но, может быть, ..

Вырывается из внутреннего while True l oop, но продолжается с внешнего for k l oop.

Вы можете установить флаг внутри оператора if и проверить его после while l oop:

end_loop = False
for k in range(0,10):

    while True:

        for j in range(0,5):
            x_aday[j] = random.randint(0,1)

        if Kisitx(x_aday) == 0:

            print(k,"k")
            print(x_aday,"aday")
            print(x_mevcut,"mevcut")
            print(Amac(x_aday),"aday")
            print(Amac(x_mevcut),"mevcut\n")

            if Amac(x_aday)>Amac(x_mevcut):
                  x_mevcut = x_aday
                  print(Amac(x_mevcut),"\n")
                  end_loop = True
                  break

            break
    if end_loop:
        break
0 голосов
/ 06 апреля 2020

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

Давайте сначала разберемся с некоторыми другими понятиями, которые вы сначала не поняли:

while True:

    if Kisitx(x_mevcut) == 0:
        break

    else:
        for i in range(0,5):
            x_mevcut[i] = random.randint(0,1)

в первую очередь Вы, предпочтительно, хотите инвертировать оператор if / else. Функция range () также будет работать без запуска начального шага range(5). Кроме того, вы хотите использовать циклы for-each вместо циклов for, когда это возможно. Проблема в этом случае: Python не позволяет вам манипулировать элементами итерируемого объекта, по которому вы сейчас выполняете итерацию. Тем не менее, вы можете использовать перечисление, чтобы иметь индекс:

while True:

    if Kisitx(x_mevcut) != 0:
        for index, element in enumerate(x_mevcut):
            x_mevcut[i] = random.randint(0,1)
    else:
        break;

Вы также можете по возможности избегать использования while-циклов. Они могут привести к бесконечным циклам довольно быстро. Я не знаю, что означает Kisitx(), поэтому я не могу помочь вам в этом. Пожалуйста, дайте ему самоочевидное имя или кратко объясните, что делает функция - или дайте нам код.

print(k,"k")

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

print(f"{k} k")
if Amac(x_aday)>Amac(x_mevcut):
                  x_mevcut = x_aday

                  print(Amac(x_mevcut),"\n")

                  break



            break

Разрыв в вашем операторе if является ненужным, так как в любом случае у вас есть оператор разрыва.

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