Phương pháp luận sáng tạo khoa học
Trang 1A. MỞ ĐẦU
Sáng tạo là gì?
Là dám nghĩ khác và dám làm khác Vậy thôi!
Trước khi đi sâu vào vấn đề, ta hãy thử giải đáp 2 câu hỏi vui sau:
"Jack được trả 5 đôla cho một lần cưa khúc gỗ ra làm đôi Vậy Jack được trả bao nhiêu tiền để cưa khúc gỗ ra làm bốn?"
"Có 2 người ngồi trước cửa siêu thị và chơi cờ tướng Họ chơi 5 ván Mỗi người đều thắng 3 ván Sao lại thế?"
Ðây là giải đáp:
Câu 1: 15 đôla, vì để cưa khúc gỗ ra làm đôi thì chỉ cần một lần cưa, nhưng để cưa một khúc gỗ ra làm 4 thì cần 3 lần
Câu 2: Bởi vì 2 người này chơi với 2 người khác nhau
Ðây là 2 trong số nhiều câu "đố mẹo" đơn giản nhất Chúng đánh lừa não bạn vì não bạn có xu hướng suy nghĩ theo kiểu "mặc định": 2 người chơi cờ thì "mặc định" là họ chơi với nhau, cưa khúc gỗ làm đôi được 5 đôla thì cưa làm 4 (2x2) thì "mặc định" là được trả 5x2=10 đôla Trong khi đề bài không hề có những dữ kiện như vậy Tại sao bạn lại "mặc định" như thế? Ðó chính là sức ỳ tâm lý làm cho não bạn bị mắc lừa ở những câu đố đòi hỏi nghĩ sáng tạo
Thực tế cuộc sống không phải là một cái hộp, nên bạn đừng tự tạo ra rồi chui vào đó!
Trang 2Có một chuyện vui thế này: Trong một chuyến đi dự hội nghị tin học, 3 kỹ sư của hãng Apple và 3 kỹ sư của hãng Microsoft gặp nhau tại ga tàu Các kỹ sư của Microsoft rất ngạc nhiên khi các kỹ sư của Apple chỉ mua 1 vé duy nhất, làm sao họ có thể qua mắt được đội kiểm soát vé gắt gao của tàu?
Khi người soát vé bước vào toa tàu, ba kỹ sư của Apple đồng loạt đứng lên đi vào toalet Hành động của họ không thoát khỏi 3 cặp mắt tò mò của các kỹ sư Microsoft Sau khi kiểm tra xong trong toa, người soát vé tiến về phía toalét và gõ cửa: "Cho kiểm tra vé!" Một giọng nói ở trong vọng ra: "Thưa đây!" Và một chiếc vé được luồn qua khe cửa Người soát vé kiểm tra xong và bỏ đi Các kỹ sư Microsoft ồ lên ngạc nhiên trước
"công nghệ" của Apple
Và khi hội nghị kết thúc, 6 kỹ sư lại gặp nhau ở nhà ga Như lần trước, các kỹ sư Apple chỉ mua 1 vé, trong khi các kỹ sư Microsoft lại chẳng mua vé nào Đến lượt các kỹ
sư Apple ngạc nhiên không hiểu làm sao ba người kia có thể thoát được Tương tự, 3 kỹ
sư Apple lại chui vào toalét đóng cửa lại Ngay lập tức, 1 trong 3 kỹ sư Microsoft bước theo và giả giọng người soát vé, rút luôn chiếc vé vừa thò qua khe cửa và cả 3 bọn họ chui tọt vào toalét bên cạnh Thật tuyệt vời vì trong bất kỳ hoàn cảnh nào, người thành công luôn là người biết tiếp thu những ý tưởng của người khác và áp dụng một cách thật sáng tạo
Thực chất thì sáng tạo là quá trình hoạt động của con người tạo ra những giá trị vật chất, tinh thần mới về chất Nói cho dễ hiểu thì sáng tạo là hoạt động của con người tạo ra sản phẩm và sản phẩm này phải đáp ứng được hai yêu cầu sau:
- Có tính mới (mới về chất)
- Có giá trị so với sản phẩm cũ (có lợi hơn, tiến bộ hơn)
Vì sáng tạo có thể là sản phẩm vật chất (như bóng đèn điện, bóng bán dẫn, tivi ) hay sản phẩm tinh thần (như tác phẩm hội họa, văn học ) nên có thể nói sáng tạo có mặt trong mọi họat động của con người Trước hết, chúng ta hãy gạt bỏ tư tưởng cho rằng sáng tạo chỉ có trong khoa học, kỹ thuật hay nghệ thuật Người ta vẫn nghĩ sáng tạo phải thể hiện trong việc phát minh ra điện, ra vaccine phòng bệnh, hoặc viết một cuốn tiểu
Trang 3thuyết Tất nhiên, những việc kể trên đúng là sáng tạo, mỗi bước tiến để chinh phục vũ trụ của loài người đều là kết quả của sự sáng tạo Nhưng sáng tạo không chỉ tồn tại trong một số nghề nhất định hay trong bộ óc của những người thông minh tuyệt đỉnh
Sáng tạo đơn giản chỉ là tìm ra một cách mới để làm việc hoặc làm cho công việc đó trôi chảy hơn, làm nên thành công Sáng tạo vì thế cứ nối sáng tạo như một cuộc đua tiếp sức để đời sống loài người ngày một văn minh, tiện lợi hơn Khi đã hiểu sáng tạo là gì và sáng tạo có tầm quan trọng như thế nào thì rõ rằng, tư duy sáng tạo luôn là phẩm chất số
1 của người lao động trong bất cứ xã hội nào
Trên cơ sở đó, ta đưa ra khái niệm thế nào là Phương pháp luận sáng tạo khoa học?
"PHƯƠNG PHÁP LUẬN SÁNG TẠO" (Creativity Methodologies) là bộ môn khoa học có mục đích xây dựng và trang bị cho mọi người hệ thống các phương pháp, các kỹ năng thực hành tiên tiến về suy nghĩ để giải quyết vấn đề và ra quyết định một cách sáng tạo, về lâu dài, tiến tới điều khiển được tư duy Thông qua lối suy nghĩ sáng tạo bằng phương pháp khoa học, ta sẽ giải quyết các vấn đề gặp phải trong cuộc sống một cách nhanh chóng, hiệu quả với chi phí thấp nhất
"PHƯƠNG PHÁP LUẬN SÁNG TẠO" là phần ứng dụng của khoa học rộng lớn hơn, mới hình thành và phát triển trong thời gian gần đây : KHOA HỌC SÁNG TẠO (Creatology)
Theo các nhà nghiên cứu, khoa học này ứng với "làn sóng thứ tư" trong quá trình phát triển của loài người, sau nông nghiệp, công nghiệp và tin học Làn sóng thứ tư ứng với Creatology (hay còn gọi là thời đại hậu tin học) chính là sự nhấn mạnh vai trò chủ thể
tư duy sáng tạo của loài người trong thế kỷ XXI
"PHƯƠNG PHÁP LUẬN SÁNG TẠO" hay “TRIZ“ là từ viết tắt của Teoriya Resheniya Izobreatatelskikh Zadatch (tiếng Nga) Tên tiếng Anh của TRIZ là Theory of Inventive Problem Solving TRIZ được xây dựng đầu tiên bởi Genrich Altshuller, và
được xây dựng dần dần những năm sau đó tại Liên Xô cho đến 1991, rồi lan sang các nước Âu, Mỹ, Nhật những năm gần đây
Trang 4TRIZ về thực chất là tổng kết ngắn gọn các nguyên lý đằng sau một số lượng khổng
lồ các sáng chế Mục tiêu chính của TRIZ là tìm ra những quy luật chung nhất nhằm giải quyết các bài toán sáng chế, giúp những người đi sau có thể áp dụng để phát minh ra những sản phẩm mới, hay giải quyết các vấn đề hóc búa trong cuộc sống hàng ngày, trong kinh doanh, học tập…
Bạn hãy nghe câu chuyện này Có 2 người làm bánh quế, với chất lượng và giá cả như nhau Khi mọi người chán ăn bánh quế và không mua nữa, một người bán chẳng biết làm sao và bỏ nghề Trong khi đó, người còn lại đã "thiết kế" bánh quế kiểu mới bằng cách cuộn tròn nó lại theo hình nón và tạo ra một sản phẩm mới hoàn toàn: ốc quế cho kem Như vậy, người bán hàng thứ nhất đã không thể đi tiếp được, còn người thứ hai đã chuyển dịch ra ngoài giới hạn và những mặc định thông thường để giải quyết bài toán kinh doanh một cách rất sáng tạo và đem lại hiệu quả cao
Chính vì tầm quan trọng như đã nói ở trên của phương pháp luận sáng tạo mà theo
Bộ Lao động Mỹ, người lao động ở thế kỷ 21 cần có 13 kỹ năng, mà theo họ, kỹ năng tư
duy sáng tạo là quan trọng nhất.
13 kỹ năng cần có của người lao động trong thế kỷ 21 (theo Ủy ban Đào tạo và phát triển Mỹ)
1 Tư duy sáng tạo
2 Đặt mục tiêu, tạo động cơ
3 Quan hệ (giao tiếp, ứng xử)
4 Lãnh đạo
5 Học hỏi
6 Lắng nghe
7 Thương lượng
Trang 58 Thuyết trình và diễn giải ý tưởng
9 Đảm bảo tính hiệu quả
10 Phát triển cá nhân trong công việc
11 Giải quyết nhanh vấn đề, tìm giải pháp
12 Lòng tự tôn về bản thân
13 Làm việc theo nhóm
Trong khuôn khổ bài tiểu luận này, ta sẽ giới thiệu một số nguyên tắc sáng tạo cơ bản và ứng dụng của chúng trong tin học
Trang 6B MỘT SỐ NGUYÊN TẮC SÁNG TẠO CƠ BẢN VÀ ỨNG
DỤNG CỦA CHÚNG TRONG TIN HỌC
1. Nguyên tắc rẻ thay cho đắt:
- Thay thế đối tượng đắt tiền bằng bộ các đối tượng rẻ có chất lượng kém hơn
Ứng dụng nguyên tắc trên trong tin học: Một cài đặt đơn giản của một hàm tính
phần tử thứ n của dãy Fibonacci Cài đặt này thực hiện rất nhiều tính toán thừa:
function fib(n)
if n = 0 or n = 1
return n else
return fib(n − 1) + fib(n − 2)
Lưu ý rằng nếu ta gọi, chẳng hạn, fib(5), ta sẽ tạo ra một cây các lời gọi hàm, trong đó các hàm của cùng một giá trị được gọi nhiều lần:
1 fib(5)
2 fib(4) + fib(3)
3 (fib(3) + fib(2)) + (fib(2) + fib(1))
4 ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
5 (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
Cụ thể, fib(2) được tính hai lần Trong các ví dụ lớn hơn, sẽ có nhiều giá trị của
fib, hay các bài toán con được tính lại, dẫn đến một thuật toán có thời gian lũy thừa.
Bây giờ, giả sử ta có một đối tượng ánh xạ đơn giản, nó ánh xạ mỗi giá trị của fib
đã được tính tới kết quả của giá trị đó Ta sửa đổi hàm trên như sau để sử dụng và cập
Trang 7nhật ánh xạ trên Hàm thu được chỉ đòi hỏi thời gian chạy O(n) thay vì thời gian chạy lũy
thừa:
var m := map(0 → 1, 1 → 1)
function fib(n)
if n not in keys(m)
m[n] := fib(n − 1) + fib(n − 2)
return m[n]
Đây là cách tiếp cận từ trên xuống, do trước hết ta chia bài toán thành các bài toán nhỏ hơn, rồi giải chúng và lưu trữ các kết quả Trong trường hợp này, ta cũng có thể giảm
từ chỗ hàm sử dụng không gian tuyến tính (O(n)) xuống chỉ còn sử dụng không gian hằng
bằng cách sử dụng cách tiếp cận từ dưới lên Cách này tính các giá trị nhỏ hơn của fib trước, rồi từ đó xây dựng các giá trị lớn hơn:
function fib(n)
var previousFib := 1, currentFib := 1
repeat n − 1 times
var newFib := previousFib + currentFib
previousFib := currentFib
currentFib := newFib
return currentFib
Phiên bản bottom-up này gần với vòng lặp mệnh lệnh đơn giản dùng cho việc tính hàm Fibonacci có trong môn học nhập môn khoa học máy tính
Trong cả hai ví dụ trên, thay vì phải tính fib(2) nhiều lần, ta chỉ tính fib(2) một lần, rồi sử dụng nó để tính cả fib(4) và fib(3), thay vì tính nó mỗi lần cần tính fib(4) hay fib(3) Như vậy sẽ giúp tiết kiệm chi phí Đây là một ví dụ đơn giản, với các số n lớn hơn, ta sẽ thấy sự hữu ích của nguyên tắc này lớn hơn
Một ví dụ nữa là: Xét một bàn cờ hình vuông n × n và một hàm chi phí c(i, j) trả về chi phí liên quan đến ô i,j (i là chỉ số hàng, j là chỉ số cột) Ví dụ: bàn cờ 5 × 5 :
+ -+ -+ -+ -+ -+
5 | 6 | 7 | 4 | 7 | 8 |
+ -| -| -| -| -+
4 | 7 | 6 | 1 | 1 | 4 |
+ -| -| -| -| -+
3 | 3 | 5 | 7 | 8 | 2 |
+ -| -| -| -| -+
2 | 2 | 6 | 7 | 0 | 2 |
+ -| -| -| -| -+
1 | 7 | 3 | 5 | 6 | 1 |
+ -+ -+ -+ -+ -+
Trang 81 2 3 4 5
Trong ví dụ, ta có chẳng hạn c(1, 3) = 5
Giả sử ta có một quân cờ có thể xuất phát tại một ô bất kỳ tại hàng đầu tiên (hàng 1), và ta cần tìm đường đi ngắn nhất (tổng chi phí của các ô đi qua là nhỏ nhất) để tới
được hàng cuối cùng (hàng n), với điều kiện quân cờ chỉ có thể tiến thẳng hoặc tiến theo
đường chéo sang trái hoặc sang phải Nghĩa là, một quân cờ tại ô (1,3) có thể nhảy sang được một trong ba ô (2,2), (2,3) và (2,4)
+ -+ -+ -+ -+ -+
5 | | | | | |
+ -| -| -| -| -+
4 | | | | | |
+ -| -| -| -| -+
3 | | | | | |
+ -| -| -| -| -+
2 | | x | x | x | |
+ -| -| -| -| -+
1 | | | O | | |
+ -+ -+ -+ -+ -+
1 2 3 4 5
Bài toán này thể hiện tính chất cấu trúc con tối ưu Nghĩa là, lời giải cho bài toán lớn phụ thuộc vào lời giải cho các bài toán con Ta định nghĩa hàm q(i, j) như sau:
q(i, j) = chi phí tối thiểu để đến được ô (i, j)
Nếu ta có thể tìm được giá trị của hàm này tại tất cả các ô nằm trên hàng n, ta sẽ
chọn lấy giá trị nhỏ nhất và lần ngược con đường đó để có được đường đi ngắn nhất
Dễ thấy rằng q(i, j) bằng chi phí tối thiểu để đến ô bất kỳ trong ba ô nằm dưới nó (do chỉ có thể đến được (i,j) từ các ô này) cộng thêm c(i, j) Ví dụ:
+ -+ -+ -+ -+ -+
5 | | | | | |
+ -| -| -| -| -+
4 | | | A | | |
+ -| -| -| -| -+
3 | | B | C | D | |
+ -| -| -| -| -+
Trang 92 | | | | | |
+ -| -| -| -| -+
1 | | | | | |
+ -+ -+ -+ -+ -+
1 2 3 4 5
Bây giờ, ta định nghĩa q(i, j) một cách chính thức hơn:
Phương trình trên rất dễ hiểu Dòng đầu tiên là các trường hợp đặc biệt, dòng này có mục đích dọn dẹp cho tính chất đệ quy Dòng thứ hai mô tả những gì xảy ra tại hàng đầu tiên, để ta có xuất phát điểm Dòng thứ ba, phần đệ quy, là phần quan trọng nhất Về cơ bản, nó giống với ví dụ A,B,C,D
Từ định nghĩa này, ta có thể dễ dàng tạo một đoạn mã đệ quy để tính q(i, j) Trong đoạn mã giả sau, n là kích thước của bàn cờ, c(i, j) là hàm chi phí, và min() trả về
giá trị nhỏ nhất của các giá trị nằm trong ngoặc:
function minCost(i, j)
if j = 0 or j = n + 1
return infinity
else if i = 1
return c(i, j)
else
return min( minCost(i-1, j-1), minCost(i-1, j), minCost(i-1, j+1) ) +
c(i, j)
Cần lưu ý rằng hàm này chỉ tính chi phí của đường đi chứ không phải đường đi đích thực Ta sẽ nói đến phần đó sau
Cũng như ví dụ về dãy Fibonacci, hàm trên chạy rất rất lâu do nó phải tốn hàng núi thời gian để tính đi tính lại các đường đi ngắn nhất Tuy nhiên, ta có thể tính nhanh hơn rất nhiều nếu hàm trên thực hiện công việc lưu trữ các giá trị đã được tính (trong một mảng) Hoặc, ta còn có thể nhanh hơn nữa nếu tính toán theo kiểu từ dưới lên và một
Trang 10mảng hai chiều q[i, j] Tại sao? Đơn giản là vì khi đó ta tính toán mỗi đường đi chỉ một lần, và ta có thể chọn cái gì cần tính toán trước
Ta còn cần biết đường đi thực sự như thế nào Vấn đề đó có thể được giải quyết bằng cách sử dụng một mảng nữa: "mảng nút đứng trước" p[i, j] Mảng này lưu các dấu vết về chuyện các đường đi từ hướng nào tới Xét đoạn mã sau:
function computeShortestPathArrays()
for x from 1 to n
q[1, x] := c(1, x)
for y from 1 to n
q[y, 0] := infinity
q[y, n + 1] := infinity
for y from 2 to n
for x from 1 to n
m := min(q[y-1, x-1], q[y-1, x], q[y-1, x+1])
q[y, x] := m + c(y, x)
if m = q[y-1, x-1]
p[y, x] := -1
else if m = q[y-1, x]
p[y, x] := 0
else
p[y, x] := 1
Bây giờ, vấn đề đơn giản còn lại là xác định cực tiểu và in nó ra
function computeShortestPath()
computeShortestPathArrays()
minIndex := 1
min := q[n, 1]
for i from 2 to n
if q[n, i] < min
minIndex := i
min := q[n, i]
printPath(n, minIndex)
function printPath(y, x)
print(x)
print("<-")
if y = 2
print(x + p[y, x])
else
printPath(y-1, x + p[y, x])
Ngoài hai ví dụ trên, nguyên tắc trên còn được ứng dụng khi người dùng lựa chọn các phần mềm để sử dụng Sẽ có các phần mềm trả phí và các phần mềm miễn phí, thay
Trang 11vì sử dụng phần mềm trả phí thì người sử dụng có thể lựa chọn các phần mềm miễn phí
để sử dụng để tiết kiệm chi phí
2 Nguyên tắc phân nhỏ:
a Chia đối tượng thành các phần độc lập
b Làm đối tượng trở nên tháo lắp được
c Tăng mức độ phân nhỏ của đối tượng
Ứng dụng nguyên tắc trên trong tin học: vào việc sắp xếp dãy (Quick Sort), hay tìm kiếm nhị phân, mỗi lần tìm kiếm ta chia đôi dãy phần tử, khi đó ta chỉ tìm trên nửa dãy Nguyên tắc này sẽ cải thiện tốc độ tìm kiếm và độ phức tạp thuận toán sẽ được cải thiện đáng kể
Ta có thể cài đặt thuật toán như sau, với T là giá trị cầm tìm, N là số phần tử :
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define sopt 1000
int A[sopt]
int tim_np(int A[sopt], int N, int T)
{int L=0;
int R=N-1;
int M,P;
do
{ if (L>R) {P=-1; break;}
M=(L+R)/2;
if (A[M]==T) {P=M; break;}
if (A[M]<T) L=M+1 else R=M-1;
} while (1);
return P;
}
Thuật toán trên có thể được cải tiến bằng cách chia nhỏ hơn dãy tìm kiếm theo cách phân hoạch dãy làm 4 dãy con, như vậy mỗi lần chỉ tìm kiếm trên ¼ dãy Thuật toán được viết lại như sau :
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define sopt 1000
int A[sopt]
int tim_np(int A[sopt], int N, int T)
{int L=0; int R=N-1;M, P=1;
while (L<=R)
{ M=(L+R)/2;