Algorytm plecakowy w Python'ie


Algorytm plecakowy to klasyczny przykład problemu analitycznego jaki próbuje się zrealizować w formie informatycznej, a który identyfikowany jest z klasycznym przykładem analizy inteligentnej.

Dla potrzeb problemu okreslane są:
- maksymalna dopuszczalna waga plecaka
- ilość przedmiotów, w tym ich waga i wartość

Celem algorytmu jest znalezienie optymalnej kombinacji przedmiotów, które łącznie nie przekroczą dopuszczalną ładowność plecaka, a osiągną maksymalną możliwą wartość.

import random
import pygame
import time
import random
import sys
import os
pygame.init()
black=[0,0,0]
white=[255,255,255]
green=[0,255,24]
screen = pygame.display.set_mode((1080,800))
pygame.display.set_caption("Algorytm plecakowy")
czcionka = pygame.font.SysFont("monospace", 30)
i=0
def buduj(n):
            res=[]
            for i in range(n):
                        res.append((i,1+int(9*random.random()),1+int(9*random.random())))                       
            return res
def powerset(items):
            res=[[]]
            for item in items:
                        newset=[r+[item] for r in res]
                        res.extend(newset)                        
            return res
def plecak_brute_force(items,max_weight):
            i=100
            plecak=[]
            best_wieght=0
            best_value=0
            for item_set in powerset(items):
                        set_weight=sum([e[1] for e in item_set])
                        set_value=sum([e[2] for e in item_set])
                        if set_value>best_value and set_weight<=max_weight:
                                    best_value=set_value
                                    best_weight=set_weight
                                    plecak = item_set
                                    pygame.draw.line(screen,white,(i,300),(i,300-best_weight),3)
                                    pygame.draw.line(screen,white,(i+10,300),(i+10,300+best_value),3)
                                    label = czcionka.render("waga= %.2f" %(best_weight), 1, green,white)
                                    screen.blit(label, (450, 10))
                                    label = czcionka.render("wartość= %.2f" %(best_value), 1, green,white)
                                    screen.blit(label, (450, 100))
                                    pygame.display.update()
                                    i=i+30
                                    time.sleep(1)
            return plecak, best_weight, best_value,i

                        

data=buduj(10)
print('data ',data)
max_w=20
pygame.draw.line(screen,white,(1,300),(1000,300),1)
pygame.draw.line(screen,green,(1,300-max_w),(1000,300-max_w),1)
label = czcionka.render("max waga= %.2f" %(max_w), 1, green,white)
screen.blit(label, (150, 10))
pygame.display.update()

pygame.display.update()
pl,opt_w,opt_v,i = plecak_brute_force(data,max_w)
print ('plecak ',pl)


pygame.draw.line(screen,green,(i,300),(i,300-opt_w),3)
pygame.draw.line(screen,green,(i+10,300),(i+10,300+opt_v),3)
label = czcionka.render("waga= %.2f" %(opt_w), 1, green,white)
screen.blit(label, (750, 10))
label = czcionka.render("wartość= %.2f" %(opt_v), 1, green,white)
screen.blit(label, (750, 100))
pygame.display.update()

	

Powyższy program wykorzystuje algorytm "brute Force".

Wyszukiwanie wyczerpujące (ang. exhaustive search), metoda siłowa (ang. brute force) – metoda polegająca na analizie wszystkich potencjalnych rozwiązań zadania w celu wybrania tego, które spełnia warunki zadania.
Złożoność obliczeniowa algorytmów realizujących wyszukiwanie wyczerpujące jest zazwyczaj bardzo duża, często wykładnicza. Metodę tę stosuje się do rozwiązywania problemów,
dla których znalezienie rozwiązania za pomocą innych dokładnych metod jest niemożliwe lub zbyt trudne.

Na poniszym zdjęciu można zaobserwować efekt pracy programu.



:)